图像选择器意图-在线存储的照片的空路径

时间:2019-05-25 21:28:53

标签: android android-intent path photo-gallery google-photos

我正在使用图像选择器意图,以便允许用户从画廊中选择图像,我得到了它的路径,然后将其传递给第3个库。

在大多数情况下都可以正常工作,但是如果我从Google相册中拾取图像(在线存储的图像),则会得到一个null路径,尽管对于这两个有效和无效图像。

这是我的Intent电话:

Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(intent, RESULT_LOAD_IMAGE);

这是onActivityResult:

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

            Uri uri = data.getData();
            Log.e(getClass().getName(),"file uri = " + uri);

            String[] projection = {MediaStore.Images.Media.DATA};
            Cursor cursor = getActivity().getContentResolver().query(uri, projection,
                    null, null, null);
            if(cursor == null) return;
            Log.e(getClass().getName(),"file cursor = " + cursor);


            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            Log.e(getClass().getName(),"file columnIndex = " + columnIndex);
            cursor.moveToFirst();



            // The crash happens here
            String photoPath = cursor.getString(columnIndex);
            Log.e(getClass().getName(),"file photo path = " + photoPath);

            cursor.close();
                cropImage(photoPath);

}

以下是有效和无效图像的日志:

工作图像:

  

文件uri = content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F105681/ORIGINAL/NONE/187859359

     

文件光标=   android.content.ContentResolver$CursorWrapperInner@8953964

     

文件columnIndex = 0

     

文件照片路径= /storage/emulated/0/DCIM/Camera/IMG_20190523_184830.jpg

无效图片:

  

文件uri =   content://com.google.android.apps.photos.contentprovider/0/1/mediakey%3A%2Flocal%253A4574915c-b4ac-40af-bc08-b1004670cab2/ORIGINAL/NONE/477302338

     

文件光标=   android.content.ContentResolver$CursorWrapperInner@59448a4

     

文件columnIndex = 0

     

文件照片路径=空

如果无法避免该错误,是否可以隐藏在线存储的照片而仅显示本地照片?

1 个答案:

答案 0 :(得分:1)

您问题中的技术(至少)存在三个问题:

  • 正如您所见,并非每个MediaStore条目都具有DATA的值

  • 并非每个非null DATA值都代表您可以访问的文件系统路径,因为MediaStore可以访问您无法访问的内容

  • DATA列在Android Q及更高版本上不可用

在您的情况下,uCrop库接受Uri。编写良好的Android库知道如何处理Uri,因此您只需将Uri移交给该库,它将从那里获取它。