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
交给图书馆,它就会从那里拿走。
我正在使用图像选择器 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
交给图书馆,它就会从那里拿走。