如何从库中选择多个图像时解析结果为null

时间:2018-03-18 08:30:23

标签: android arrays android-studio arraylist android-recyclerview

我有一个从图库中选择多图像的项目,但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。

你能帮帮我吗?我花了一个星期的时间修复但还没有。我因此感到压力。可路径不是真的。我不知道如何解决这个问题。

1 个答案:

答案 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)文件服务器)。