Цель моего приложения - выбрать файл (может быть изображение, аудио или даже видеофайл) и использовать его позже в приложении, сохранив путь к файлу, чтобы он был доступен.
У меня есть эта функция, которая должна выполнять работу
Attach attach = AttachmentUtilities.extractAttachInfoFromUri(context, uri);
attach.setPath(FileUtils.getPath(context, uri));
attach.setUri(uri);
try {
if (cursor != null && cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
attach.setName(name);
//try getting mime type first way
String mimeType = cursor.getString(cursor.getColumnIndex("mime_type"));
//if null then try second way
if (mimeType == null) {
mimeType = context.getContentResolver().getType(uri);
}
//if still null then try guessing from file name
if (mimeType == null) {
mimeType = getFileExtension(name);
}
attach.setType(FileUtils.getMainFileType(mimeType));
String extension = FileUtils.getExentsionFromMimeType(mimeType);
attach.setExtension(extension);
int sizeColIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
Long size = null;
if (!cursor.isNull(sizeColIndex)) {
size = (long) cursor.getInt(sizeColIndex);
}
attach.setSize(size);
} else if (attach.getPath() != null) {
attach = AttachmentUtilities.convertFileToAttachment(attach.getPath());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
и установить функцию пути
if (DEBUG)
LogUtils.i(TAG + " File -",
"Authority: " + uri.getAuthority() +
", Fragment: " + uri.getFragment() +
", Port: " + uri.getPort() +
", Query: " + uri.getQuery() +
", Scheme: " + uri.getScheme() +
", Host: " + uri.getHost() +
", Segments: " + uri.getPathSegments().toString()
);
// DocumentProvider
if (DocumentsContract.isDocumentUri(context, uri)) {
// LocalStorageProvider
if (isLocalStorageDocument(uri)) {
// The path is the id
return DocumentsContract.getDocumentId(uri);
}
// ExternalStorageProvider
else if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
uri.getPath();
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
LogUtils.i(TAG, "id=" + id);
if (id.contains("raw:")) {
return id.replace("raw:", "");
}
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)) {
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())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
else if (isGoogleDriveUri(uri)) {
return uri.getLastPathSegment();
}
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
Я получаю большая ошибка на fabri c на android os 9 ошибка отображается на другой версии ОС, но не так часто, как на ОС 9
Ошибка:
Failure delivering result ResultInfo{who=null, request=4, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/9887 flg=0x43 }} to activity {attachment.AttachmentPickerActivity}: java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/9887