gpt4 book ai didi

android - 如何从 Intent.ACTION_GET_CONTENT 返回的 URI 中提取文件名?

转载 作者:IT老高 更新时间:2023-10-28 13:14:57 28 4
gpt4 key购买 nike

我正在使用第 3 方文件管理器从文件系统中选择一个文件(在我的例子中是 PDF)。

这是我启动 Activity 的方式:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);

String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);

startActivityForResult(chooser, ActivityRequests.BROWSE);

这就是我在 onActivityResult 中的内容:

Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")

Cursor c = getContentResolver().query(uri, null, null, null, null);

if (c != null && c.moveToFirst()) {

int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}

代码 fragment 是从 Open Intents 文件管理器 中借用的说明:
http://www.openintents.org/en/node/829

if-else 的目的是向后兼容。我想知道这是否是获取文件名的最佳方法,因为我发现其他文件管理器会返回各种东西。

例如,Documents ToGo 返回如下内容:

content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf

getContentResolver().query() 返回 null

为了让事情变得更有趣,未命名的文件管理器(我从客户端日志中获得了这个 URI)返回如下内容:

/./sdcard/downloads/.bin


是否有从 URI 中提取文件名的首选方法,或者应该求助于字符串解析?

最佳答案

developer.android.com 有很好的示例代码: https://developer.android.com/guide/topics/providers/document-provider.html

仅提取文件名的压缩版本(假设“this”是一个 Activity):

public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
cursor.close();
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}

关于android - 如何从 Intent.ACTION_GET_CONTENT 返回的 URI 中提取文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5568874/

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