Android 从库中选择图像时应用程序崩溃

Android 从库中选择图像时应用程序崩溃,android,kotlin,bitmap,Android,Kotlin,Bitmap,我需要从库中选择以在其上实现过滤器。 我使用以下代码在应用程序中打开gallery: var intent = Intent(Intent.ACTION_PICK) intent.setType("image/*") startActivityForResult(intent, PERMISSION_CODE) 活动结果: if (resultCode == Activity.RESULT_OK &&a

我需要从库中选择以在其上实现过滤器。 我使用以下代码在应用程序中打开gallery:

 var intent = Intent(Intent.ACTION_PICK)
                    intent.setType("image/*")
                    startActivityForResult(intent, PERMISSION_CODE)
活动结果:

 if (resultCode == Activity.RESULT_OK && requestCode == PERMISSION_CODE) {
            var bitmap: Bitmap = BitmapUtils.getBitmapFromGallery(this, data?.data, 800, 800)
            original_filter_bitmap.recycle()
            final_bitmap.recycle()
            filtered_bitmap.recycle()
            original_filter_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
            final_bitmap = original_filter_bitmap.copy(Bitmap.Config.ARGB_8888, true)
            filtered_bitmap = original_filter_bitmap.copy(Bitmap.Config.ARGB_8888, true)
            image_preview.setImageBitmap(original_filter_bitmap)
            bitmap.recycle()
         //   imageFiltersFragment.displayThumbNail(original_filter_bitmap)
        }

以下是从库中获取位图的方法:

(Context context, Uri uri, int width, int height) {
        String[] filepathcolumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = context.getContentResolver().query(uri, filepathcolumn, null, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filepathcolumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(picturePath, options);
        options.inSampleSize = calculateInSampleSize(options, width, height);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(picturePath, options);
    }
所以画廊打开,我选择图像,当按下图像应用程序压碎

日志:

Caused by: java.lang.IllegalStateException: BitmapUtils.getBitmapFro…is, data?.data, 800, 800) must not be null
        at com.example.sg772.textonimage.MainActivity.onActivityResult(MainActivity.kt:191)

第191行:
var bitmap:bitmap=BitmapUtils.getBitmapFromGallery(这是data?.data,800800)
data?.data
可能为空

data?.data?.let {
    val bitmap = BitmapUtils.getBitmapFromGallery(this, it, 800, 800)
    ...
}

data?.data
可能为空,因此
。您的操作不安全,类似于NullPointerException。用
data?.data?.let{}
换行。不要获取路径,而应该从uri中检索内容(请使用
picturePath
的值登录)。下面是从库中获取位图的方法:“--去掉
query()
。停止假设您可以从
MediaStore
获取文件系统路径。相反,请在
ContentResolver
上使用
openInputStream()
,并将该
InputStream
BitmapFactory.decodeStream()
一起使用。或者,更好的方法是使用现有的图像加载库(Glide、Picasso等),而不是自己在主应用程序线程上执行所有这些操作。@Commonware在Picasso的帮助下加载图像?@Androidv:是的。毕加索知道如何从
Uri
加载图像,并用它们填充
ImageView
。对不起,我不知道如何实现这一点,我应该在哪里声明位图变量this your code?
with
只是一个Kotlin关键字。。没有编辑,谢谢!它起作用了,但那是什么结构(.let{})它与通常的写作有什么区别?你能解释一下吗?