如何使用CreateChooser在Android中获取音频绝对路径



我想使用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流式传输的内容,这不是设备上的文件
  • 等等

使用ContentResolveropenInputStream()(也许是openOutputStream())与Uri确定的内容一起使用。

如果您碰巧使用一些需要File的第三方库,请切换到可以与InputStream一起使用的更好库。

如果找不到更好的库,则必须使用InputStream将内容的字节复制到您控制的某些文件(例如,在getCacheDir()中),然后使用该文件。

最新更新