gpt4 book ai didi

android - 处理新的存储 API

转载 作者:行者123 更新时间:2023-11-29 00:25:04 24 4
gpt4 key购买 nike

在我的应用程序中,我让用户从设备存储中导入不同的媒体文件。到目前为止,我使用了带有操作 Intent.ACTION_GET_CONTENT 的 Intent 。

在 KitKat 中,Google 引入了新的存储访问框架和新的文件选择器。已知的和已经讨论过的问题是这个新的选择器提供了一个与旧的不同格式的 URI。描述了一种可能的解决方案 here .然而,这个解决方案并不是我真正想要的:

1) Intent.ACTION_OPEN_DOCUMENT 用户只能使用新的文件选择器,不能选择通过第三方应用/选择器打开文件

2) 使用 OPEN_DOC 操作时,如何在传递的 uri 中获取文件的“类型”? (用于与 data.getType() 一起工作)

3) 如果我使用“旧的”get_content 操作,用户可以选择使用新的选择器或打开一个应用程序(这就是我想要的),但有必要认识到 onActivityResult() 的区别,因为,第三方应用程序提供的 Uri 仍然具有“旧”格式...(我该怎么做?)

是否有一些实际有效的方法? Google 是否就如何处理此问题提供了任何建议?

我已经发现了几个应用程序,如果使用新的选择器,选择文件不再起作用......他们只是应该保留旧的操作,只有在新的选择器被使用时才显示新的选择器明确调用...

谢谢,J

最佳答案

你可以使用我的图书馆aFileChooser我刚刚更新以支持存储访问框架。请务必查看 FileUtils.getPath(Context, Uri) 方法。它非常冗长,但它有效:

/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
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)) {
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];
}

// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {

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)) {
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 getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}

return null;
}

/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {

Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};

try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}


/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}

关于android - 处理新的存储 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com