Image Picker Intent - 在线存储照片的空路径

Image Picker Intent - null path for online stored photos

我正在使用图像选择器 Intent,以允许用户从他们的图库中选择图像,我得到它的路径,然后将它传递给第三个库。

它在大多数情况下都工作正常,但如果我从 Google 照片(在线存储的图像)中获取图像,我会得到一个 null 路径,尽管我得到工作图像和非工作图像的有效 URI。

这是我的 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);

}

下面是工作和不工作图像的日志:

工作图像:

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

file cursor = android.content.ContentResolver$CursorWrapperInner@8953964

file columnIndex = 0

file photo path = /storage/emulated/0/DCIM/Camera/IMG_20190523_184830.jpg

图片无效:

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

file cursor = android.content.ContentResolver$CursorWrapperInner@59448a4

file columnIndex = 0

file photo path = null

如果没有办法避免该错误,是否有办法隐藏在线存储的照片并只显示本地照片?

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

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

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

  • DATA 列在 Android Q 及更高版本

  • 上不可用

对于您的情况,uCrop 库接受 Uri。 Well-written Android 图书馆知道如何处理 Uri,因此您只需将 Uri 交给图书馆,它就会从那里拿走。