我有一个从图库中选择多图像的项目,但imageEncoded = cursor.getString(columnIndex)
返回null。你能帮助我吗?我花了一个星期才修好但还没有。
//This is code select muti image from gallery:
public void capturedCamera1() {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(
new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
MY_READ_PERMISSION_REQUEST_CODE);
} else {
}
}
}
//this is result after select image:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null) {
Uri URI = data.getData();
if (URI == null) {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
mArrayUri.add(uri);
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
if (Build.VERSION.SDK_INT >= 19) {
imageEncoded = cursor.getString(columnIndex);// return null
if (imageEncoded == null) {
Toast.makeText(this, "imageEncode", Toast.LENGTH_LONG).show();
} else {
arrayAddInsurrance.add(new ItemAddInsurrance(BitmapFactory.decodeFile(imageEncoded)));
cursor.close();
apdapterAddInsurrance.notifyDataSetChanged();
}
}
else
{
imageEncoded = cursor.getString(columnIndex);
if (imageEncoded == null) {
Toast.makeText(this, "imageEncode", Toast.LENGTH_LONG).show();
} else {
arrayAddInsurrance.add(new ItemAddInsurrance(BitmapFactory.decodeFile(imageEncoded)));
cursor.close();
apdapterAddInsurrance.notifyDataSetChanged();
}
}
}
}
} else {
String[] FILE = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(URI,
FILE, null, null, null);
if (cursor == null) {
Toast.makeText(this, "CURSOR NULL", Toast.LENGTH_LONG).show();
} else {
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(FILE[0]);
ImageDecode = cursor.getString(columnIndex); return null
}
if (ImageDecode == null) {
Toast.makeText(this, "Null", Toast.LENGTH_LONG).show();
} else {
Bitmap n = BitmapFactory.decodeFile(ImageDecode);
//bitmap decodeFile but ImageDecode null
arrayAddInsurrance.add(new ItemAddInsurrance(n));
//add bitmap into recyclerview
apdapterAddInsurrance.notifyDataSetChanged();
cursor.close();
}
}
}
cursor.getString(columnIndex)
返回Null而URI不为null。
答案 0 :(得分:0)
我有一个从图库中选择多图像的项目
您的代码不必涉及图库。任何事情都可以支持ACTION_GET_CONTENT
。返回的Uri
值不必来自MediaStore
。
我不知道如何解决这个问题。
停止查询MediaStore
。保留Uri
值,并在RecyclerView
需要显示这些图像时将其传递到您最喜爱的图片加载库(例如Glide,Picasso)。目前,除了您现有的问题之外,还有BitmapFactory
代码:
可能会因OutOfMemoryError
而崩溃(如果用户选择了太多太大的图片或图片)
到达那里会很慢,在将所有这些图片加载到位图时冻结你的用户界面
如果您只想处理文件,请停止使用ACTION_GET_CONTENT
,然后切换到某种形式的file chooser library。您仍然希望使用图像加载库来解决内存和线程问题,但是您可以将用户限制为本地文件,而不是ACTION_GET_CONTENT
可能支持的任何其他内容(例如,Google Drive,Windows)文件服务器)。