我正在使用图像选择器意图,以便允许用户从画廊中选择图像,我得到了它的路径,然后将其传递给第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
文件照片路径=空
如果无法避免该错误,是否可以隐藏在线存储的照片而仅显示本地照片?
答案 0 :(得分:1)
您问题中的技术(至少)存在三个问题:
正如您所见,并非每个MediaStore
条目都具有DATA
的值
并非每个非null
DATA
值都代表您可以访问的文件系统路径,因为MediaStore
可以访问您无法访问的内容
DATA
列在Android Q及更高版本上不可用
在您的情况下,uCrop库接受Uri
。编写良好的Android库知道如何处理Uri
,因此您只需将Uri
移交给该库,它将从那里获取它。