将 Uri 转换为位图

问题描述

我想将 Uri 从 .takePicture 方法转换为 Bitmap 以备后用,我搜索了不同的方法,但每个方法都给我一个错误,说位图为空,有时“int android.graphics.bitmap.getwidth( )' 在空对象引用上”。


var imageUri:Uri?=null
    private fun takePhoto() {

        val photofile = File(externalMediaDirs.firstOrNull(),"picture - ${System.currentTimeMillis()}.jpg")
        val output = ImageCapture.OutputFileOptions.Builder(photofile).build()
        var image_View = findViewById<ImageView>(R.id.imageView)

        imageCapture?.takePicture(output,ContextCompat.getMainExecutor(this),object : ImageCapture.OnImageSavedCallback {
            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                Toast.makeText(applicationContext,"Pic saved.",Toast.LENGTH_LONG).show()
                imageUri = outputFileResults.savedUri
                //image_View.setimageURI(imageUri)
            }

            override fun onError(exception: ImageCaptureException) {
                Toast.makeText(applicationContext,"Error saving pic!",Toast.LENGTH_LONG).show()
            }
        })
}

解决方法

试试这个片段

        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageUri);
,

引用 the documentation for getSavedUri()

仅当 ImageCapture.OutputFileOptions 由由 MediaStore 构造的 #Builder(ContentResolver,Uri,ContentValues) 支持时才返回此字段

那不是您用于 OutputFileOptions 的构造函数。因此,请检查 getSavedUri() 是否返回 null。如果是,您将需要使用 photofile,包括采取措施将其保存在已保存的实例状态 Bundle 中。

如果 getSavedUri() 返回非 null 值,您可能需要编辑您的问题并提供与您的崩溃相关的完整堆栈跟踪(而不是使用 pastebin)。