【发布时间】: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。