Начиная с Android N и выше, я сталкиваюсь с этой проблемой.Когда я выбираю файл из любого приложения в панели выбора файлов слева, например «Галерея» и «Диспетчер файлов», получаются URI, и я могу делать с файлами все, что мне нужно.
Кроме того, если я выберу файл, когда вкладка «Изображения / Видео / Аудио» выделена в ящике средства выбора файлов, для любого выбранного файла будет успешно возвращен URI. В моем результате onActivity Log.i("File URI to String", data.getDataString());
выводит I/File URI to String: content://com.android.providers.media.documents/document/image%3A20399
, который я могу получить путем к файлу с помощью метода GetPath, описанного ниже.
Но когда я просто выбираю из средства выбора с выделенным Внутренним или Внешним хранилищем, происходит замечание, Log.i("File URI to String", data.getDataString());
выводит I/File URI to String: content://com.android.externalstorage.documents/document/CA8B-8BD2%3ADCIM%2F100ANDRO%2FDSC_0001.JPG
Для которого мой метод getPath не может найти путь, и я думаю, что он может что-тосделать с поставщиками, глядя на различия между Uris в виде строки.
Как я могу получить путь к файлам этих выборов, которые, по-видимому, не поддерживаются никаким провайдером.Любая помощь приветствуется.
Мой код для запуска средства выбора файлов:
Intent intent = new Intent();
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, DEFAULT_IMAGE_PICK);
Когда я запускаю средство выбора файлов
2018-10-23 21:51:26.345 1572-10747/? I/ActivityManager: START u0 {act=android.intent.action.OPEN_DOCUMENT cat=[android.intent.category.OPENABLE] typ=*/* cmp=com.android.documentsui/.picker.PickActivity (has extras)} from uid 10298
2018-10-23 21:51:26.352 1572-10747/? D/ActivityTrigger: activityStartTrigger: Activity is Triggerred in full screen ApplicationInfo{e1aa80b com.android.documentsui}
2018-10-23 21:51:26.352 1572-10747/? E/ActivityTrigger: activityStartTrigger: not whiteListedcom.android.documentsui/com.android.documentsui.picker.PickActivity/26
2018-10-23 21:51:26.353 1572-10747/? D/CompatibilityInfo: mCompatibilityFlags - 0
2018-10-23 21:51:26.353 1572-10747/? D/CompatibilityInfo: applicationDensity - 320
2018-10-23 21:51:26.353 1572-10747/? D/CompatibilityInfo: applicationScale - 1.0
2018-10-23 21:51:26.353 1572-10747/? D/ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e1aa80b com.android.documentsui} is now in focus and seems to be in full-screen mode
2018-10-23 21:51:26.353 1572-10747/? E/ActivityTrigger: activityResumeTrigger: not whiteListedcom.android.documentsui/com.android.documentsui.picker.PickActivity/26
2018-10-23 21:51:26.353 1572-10747/? D/ActivityTrigger: ActivityTrigger activityPauseTrigger
2018-10-23 21:51:26.376 1572-10747/? D/ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e1aa80b com.android.documentsui} is now in focus and seems to be in full-screen mode
2018-10-23 21:51:26.376 1572-10747/? E/ActivityTrigger: activityResumeTrigger: not whiteListedcom.android.documentsui/com.android.documentsui.picker.PickActivity/26
2018-10-23 21:51:26.380 1572-10747/? D/CompatibilityInfo: mCompatibilityFlags - 0
2018-10-23 21:51:26.380 1572-10747/? D/CompatibilityInfo: applicationDensity - 320
2018-10-23 21:51:26.380 1572-10747/? D/CompatibilityInfo: applicationScale - 1.0
2018-10-23 21:51:26.409 1572-2271/? I/InputDispatcher: Focus entered window: Window{9ac7c5c u0 com.android.documentsui/com.android.documentsui.picker.PickActivity}
2018-10-23 21:51:26.459 1572-1634/? I/ActivityManager: Displayed com.android.documentsui/.picker.PickActivity: +80ms
Это мой файл манифеста. Я реализовал файл Uris для общего доступа провайдера с другими приложениями:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
В моем onActivityResult
if ((requestCode == SELECT_GALLERY_FILE || requestCode == DEFAULT_IMAGE_PICK)
&& resultCode == Activity.RESULT_OK)
{
Log.i("File URI to String", data.getDataString());
if(data.getData()!=null){//Receiving one file
filelist.add(getPath(getActivity(),data.getData()));
filelist = ListDeduplicator(filelist);
Log.i("File Added", getPath(getActivity(),data.getData()));
//Add Path of selected file to list of files to be loaded
}
if (data.getClipData() != null) {//Receiving several
ClipData mClipData = data.getClipData();
for (int i = 0; i < mClipData.getItemCount(); i++) {
//Add Paths of selected files to list of files to be loaded
ClipData.Item item = mClipData.getItemAt(i);
filelist.add(getPath(getActivity(),item.getUri()));
Log.i("File Added", getPath(getActivity(),item.getUri()));
}
filelist = ListDeduplicator(filelist);
}
CheckAndExecute();
}
Мой метод GetPath реализован в onActivityResult
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
//Log.i("CHECK", "1");
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
//Log.i("CHECK", split[1]);
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}else{
return Search_Dir(new File("/storage") ,split[1]);
/*for (String string : getStorageDirectories(context)) {
String TestPath = string+"/"+split[1];
if ((new File(TestPath)).exists()) {
return TestPath;
}
}*/
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
//Log.i("CHECK", "2");
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
//Log.i("CHECK", "3");
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
//Log.i("CHECK", "4");
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
//Log.i("CHECK", "5");
return uri.getPath();
}
return null;
}