我想使用CreateChooser从URI路径获得绝对路径。我要做什么?如果您知道解决此问题的解决方案,请告诉我。顺便一提,URI路径显示遵循路径:
content://com.android.providers.media.documents/document/audio%3A38
正常路径显示遵循路径:
/document/audio:38
这是我的代码:
public void set_music_path(View view) {
Intent intent = new Intent();
intent.setType("audio/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "음악을 선택해주세요."), 1);
}
protected void onActivityResult(int req, int res, Intent data){
super.onActivityResult(req, res, data);
Uri uri = data.getData();
Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show();
Toast.makeText(this, uri.getPath().toString(), Toast.LENGTH_SHORT).show();
}
我是韩国学生,所以有一些语法错误。如果有语法错误,请忽略我的错
首先,您需要意识到createChooser()
与您从startActivityForResult()
调用中返回的Uri
的格式无关。任何ACTION_GET_CONTENT
活动都可以退还任何有效的Uri
。即使您离开了createChooser()
部分,也可以从startActivityForResult()
调用中获得这种Uri
。
第二,您需要意识到Uri
不是文件。ACTION_GET_CONTENT
活动可以返回Uri
指向活动所需的任何东西。
如果 Uri
的方案恰好是file
,则getPath()
将是一个文件系统路径,指向您可以访问的文件。
如果该方案为 content
—就像这里的情况—然后Uri
可以指向:
- 您可以访问的外部存储上的文件
- 您无法访问的可移动存储中的文件
- 您无法访问的另一个应用程序内部存储的文件
- 另一个应用程序的资产,这不是文件
- 来自数据库的
BLOB
列的值,这不是文件 - 一个即时生成的值,该网页的方式,不是文件
- 将从Internet流式传输的内容,这不是设备上的文件
- 等等
使用ContentResolver
和openInputStream()
(也许是openOutputStream()
)与Uri
确定的内容一起使用。
如果您碰巧使用一些需要File
的第三方库,请切换到可以与InputStream
一起使用的更好库。
如果找不到更好的库,则必须使用InputStream
将内容的字节复制到您控制的某些文件(例如,在getCacheDir()
中),然后使用该文件。