【问题标题】:app crashes when select image from gallery从图库中选择图像时应用程序崩溃
【发布时间】:2019-03-29 13:48:58
【问题描述】:

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

 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);
    }

所以画廊打开,我选择图像,当按下图像应用程序粉碎。

Logcat:

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(this, data?.data, 800, 800)

【问题讨论】:

  • data?.data 可能为空,因此 ?。您的操作不安全,就像 NullPointerException。用data?.data?.let {} 换行。
  • 您应该从 uri 中检索内容,而不是获取路径(请使用 picturePath 的值记录)
  • "这里是从图库中获取位图的方法:" -- 去掉 query()。不要再假设您可以从MediaStore 获得文件系统路径。相反,在ContentResolver 上使用openInputStream(),并将InputStream 与BitmapFactory.decodeStream() 一起使用。或者,甚至更好的是,使用现有的图像加载库(Glide、Picasso 等),而不是自己在主应用程序线程上完成所有这些工作。
  • @CommonsWare 在毕加索的帮助下加载图片?
  • @androidev:是的。 Picasso 知道如何从Uri 加载图像并用它们填充ImageView。

标签: android kotlin bitmap


【解决方案1】:

data?.data 可能为空。

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

【讨论】:

  • 对不起,我不明白如何实现这个,我应该在哪里声明位图变量这个你的代码?
  • with 只是一个 Kotlin 关键字.. 没有它编辑。
  • 谢谢!它起作用了,但是那个构造(.let{})与通常的写作有何不同,你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多