Kotlin-Android 开发日志

需求:

完成一个注册页面,要求可以上传头像。

遇到的问题:

1、对于kotlin中访问Android图片库的方法并不熟悉;

2、对于bitmap图像处理的方法并不清除;

3、基于虚拟机的桥接方式,尝试多次依然失败;

4、nodejs-express端对于multidata-from类型数据的解析方式并不熟悉;

5、对于nodejs-express静态资源的访问;

解决问题:

问题1、2,在多方查询资料之后,了解了kotlin当中访问图片库的方法,这里给出替代吗和注释以供备份。

Photo.setOnClickListener {
            /**
             * 通过intent方法来传递需要获取的文件信息
             */
            val intent = Intent()
            intent.action = Intent.ACTION_GET_CONTENT
intent.type
= "image/*" startActivityForResult(intent, 111) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { /** * 重载函数,依据resultCode的值来处理获得数据 * resultCode的值由自己设定,可以前后对应即可 */ super.onActivityResult(requestCode, resultCode, data) when (requestCode) { 111 -> { /** * 由于Data传回的是一个uri值,所以需要通过这个值来获取对应的图片信息 * 以下代码参考自网络 */ bitmap = MediaStore.Images.Media.getBitmap( this.getContentResolver(), data?.data); /** * 通过resizeImage压缩图片 * 其中涉及到dp单位到px单位的转换运算 * 由于在前端布局使用的是dp,而对于图片使用的是像素单位的压缩运算 * 所以需要进行换算 */ bitmap = resizeImage(bitmap, 150 * this.resources.displayMetrics.density, 150 * this.resources.displayMetrics.density) Photo.setImageBitmap(bitmap) } } } fun resizeImage(bitmap: Bitmap, width: Float, height: Float): Bitmap { val bmpWidth = bitmap.width val bmpHeight = bitmap.height val scaleWidth = width.toFloat() / bmpWidth val scaleHeight = height.toFloat() / bmpHeight val matrix = Matrix() matrix.postScale(scaleWidth, scaleHeight) return Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true) }

3、虚拟机的桥接过程

由于对于桥接模式的具体原理并不清楚,一直认为此时虚拟需要访问的主机ip是‘10.0.2.2’

但是实际上无法使用,最后参看了官方的文档,在终端中使用netcfg命令获得了当前Android虚拟机的ip

但是在获得IP之后,发现虚拟机无法ping通主机,而主机可以ping通虚拟机,说明本机防火墙未关闭

尝试之后,问题成功解决。

4、nodejs-express对于multidata-from的数据解析

查询资料之后,得知了‘formiable’这个中间件,于是对于使用方法进行了学习,以下给出代码。

//创建套件
    var form = new formidable.IncomingForm();
    //设置文件上传存放地址,在这里配置了本地文件的默认保存位置,
    //此时文件名称是一个upload开头的随机字符串
    form.uploadDir = "./uploads";
    //执行里面的回调函数的时候,表单已经全部接收完毕了。
    form.parse(req, function(err, fields, files) {
        
        for(key in files)
        {
            /**
                遍历整个文件对象,将upload——XXXX格式的文件名称修改为自己需要的名称
                在这里由于我在前端中传回了一个名称,所有就修改为这个名称
            **/
            let file = files[key]
            fs.rename('.//'+file['path'], './/uploads//' + file['name'], err=>{
                if(err) console.log(err)
            })
        }
        
        
    });

5、nodejs-express静态资源的访问

这个问题在很久之前就已经碰到过,但是对于具体的代码还是不太熟悉,这里给出记录。

app.use('/uploads',express.static('./uploads'));
第一个参数表示路由地址
第二个参数表示本地文件夹的路径

 

posted @ 2020-12-29 08:46  loenvom  阅读(134)  评论(0编辑  收藏  举报