【问题标题】:How to resolve result null when choose multi image from gallery从图库中选择多张图片时如何解决结果为空
【发布时间】:2018-08-27 00:10:30
【问题描述】:

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

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

【问题讨论】:

  • >>>>> 转储光标 android.content.ContentResolver$CursorWrapperInner@171998f1 0 { _data=null }
  • 我想在从图库中选择时显示多图像回收视图,但 imageEncoded = cursor.getString(columnIndex) 返回 null
  • 不,我想使用 recyclerview。添加多张图片 1 次
  • 我不用imagview,但是imageEncoded = cursor.getString(columnIndex) null,你能帮帮我吗?

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


【解决方案1】:

我有一个从图库中选择多张图片的项目

您的代码不必涉及图库。任何东西都可以支持ACTION_GET_CONTENT。返回的Uri 值不必来自MediaStore

我不知道如何解决这个问题。

停止查询MediaStore。保持Uri 值,当您的RecyclerView 需要显示这些图像时,将它们传递给您最喜欢的图像加载库(例如,Glide、Picasso)。就目前而言,除了您现有的问题,您的BitmapFactory 代码:

  • 可能会因OutOfMemoryError 而崩溃(如果用户选择了太多图像或太大的图像)并且

  • 到达那里会很慢,当您将所有这些图像加载到位图时会冻结您的 UI

如果您只想处理文件,请停止使用ACTION_GET_CONTENT,并切换到某种形式的file chooser library。您仍然希望使用图像加载库来解决内存和线程问题,但您将能够将用户限制为本地文件,而不是ACTION_GET_CONTENT 可能支持的任何其他内容(例如,Google Drive、Windows 文件服务器)。

【讨论】:

  • 你好,我还是不明白。你能给我举个例子或链接参考吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2018-10-27
  • 1970-01-01
  • 2016-07-13
  • 2017-08-02
相关资源
最近更新 更多