android 在没有读写权限的情况下,获取相册的照片,并进行压缩

如题,我们的app需要上架到谷歌商店,但是谷歌最新的政策,是金融类App不允许获取手机的读写权限,然后我们绕开权限,将数据进行IO 流的读取,但是对应的图片就很大,同时需要对其进行压缩,下面就上代码

声明一个变量

private lateinit var selectPhotoLauncher: ActivityResultLauncher<String>

在需要的位置进行调用就可以跳转到相册中

selectPhotoLauncher.launch("image/*")

接收返回的值

        selectPhotoLauncher =registerForActivityResult(ActivityResultContracts.GetContent()) {
                if (it != null) {
                	//这里的返回值拿不到对应图片的路径,没法用传统的方法进行压缩
                    contentResolver.openInputStream(it)?.use { data ->
                    	//转为流后进行压缩
                        data.compress()
                    }
                } else {
                    hideLoading()
                }
            }

这里我声明了一个全局的方法进行压缩
基本稳定在100-200kb之间
android 在没有读写权限的情况下,获取相册的照片,并进行压缩_第1张图片

fun InputStream.compress(): InputStream{
    val options = BitmapFactory.Options()
    //设置为将图片压缩为原来的三分之一大小
    options.inSampleSize = 3
    val bm = BitmapFactory.decodeStream(this, null, options)
    val baos = ByteArrayOutputStream()
    //再次将bitmap压缩
    bm!!.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    var qua = 95
    //查看大小是否大于200kb,大于则再次进行压缩
    while (baos.toByteArray().size/1024 >200){
        baos.reset()
        bm.compress(Bitmap.CompressFormat.JPEG, qua, baos)
        //每次减少5%质量
        if (qua>5){
            qua -=5
        } else {
            break
        }
    }
    return ByteArrayInputStream(baos.toByteArray())
}

仅做记录,如有帮助,点个赞呗

你可能感兴趣的:(android,压缩图片,InputStream压缩)