Android - 从 uri 获取绝对文件路径,从下载中选取

问题描述

我正在尝试从 uri 获取绝对文件路径。但是用某些下载管理器下载的文件无法获取

例如,我下载了一个音频并将其存储在 /storage/emulated/0/Miui/.ringtone/Our Street (30-secs version)_&_7f2f552b-b5b8-41a0-94de-4b3b065b7c00.mp3 中。如果我从文件选择器的 Downloads 部分选择这个文件,我会得到以下 uri content://com.android.providers.downloads.documents/document/19,但我无法从这个 uri 计算出绝对路径

但是如果我从原始目录中选择文件,即 /storage/emulated/0/Miui/.ringtone/ 我得到了这个 uri content://com.android.externalstorage.documents/document/primary%3AMiui%2F.ringtone%2FOur%20Street%20(30-secs%20version)_%26_7f2f552b-b5b8-41a0-94de-4b3b065b7c00.mp3 并且我可以从这个 url 得到绝对文件路径。

Downloads 中选取时如何获取绝对文件路径?

我正在使用以下代码打开文件选择器:

Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
chooseFile.setType("*/*");
chooseFile.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,false);
startActivityForResult(Intent.createChooser(chooseFile,"Select Audio"),PICK_AUdio_RESULT_CODE);

为了从 uri 解析绝对文件路径,我使用以下代码

final String id = DocumentsContract.getDocumentId(uri);

final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://downloads/public_downloads"),Long.valueOf(id)
);

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 index = cursor.getColumnIndexOrThrow(column);
        return cursor.getString(index);
    }
} finally {
    if (cursor != null)
        cursor.close();
}
return null;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...