2017-02-25 76 views
1

我想使用createChooser从URI路径获取绝对路径。我必须做什么?如果你知道解决方案可以解决这个问题,请告诉我。顺便说一下, URI路径显示路径跟踪:如何在Android中使用createChooser获取音频绝对路径

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(); 
} 

我是韩国学生,所以有一些语法错误。 如果有语法错误,忽略我的缺点

回答

0

首先,你需要认识到,createChooser()无关与Uri的格式,你从你的startActivityForResult()回电。任何ACTION_GET_CONTENT活动可以退回任何有效的Uri它想要的。即使您忘记了createChooser()部分,您也可以从startActivityForResult()呼叫中获得那种Uri

其次,你需要认识到Uri不是一个文件。 ACTION_GET_CONTENT活动可以返回一个指向任何活动所需的Uri

如果Uri的方案恰好是file,然后getPath()将是一个文件系统路径,指着那(大概),你可以访问文件。

如果方案content —比如这里的情况—那么Uri可以指向什么

  • 外部存储上的文件,你可以在可移动存储访问
  • 的文件您无法访问
  • 另一个应用程序的内部存储器上的文件,您无法访问
  • 另一个应用程序的资产p不是文件
  • 来自数据库的BLOB列的值不是文件
  • 动态生成的值,此网页的方式,它不是文件
  • 内容会从互联网上,这是不是设备
  • 等等

使用ContentResolveropenInputStream()(也许openOutputStream())与由Uri标识的内容合作上的文件进行流式。

如果您碰巧与某个需要File的第三方库一起工作,请切换到更好的库,以便与InputStream配合使用。

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

+0

你能举一些例子吗? –

+0

@박광유:https://github.com/commonsguy/cw-omnibus/tree/master/Documents/Cumerumer https://github.com/commonsguy/cw-omnibus/tree/master/Documents/Durable – CommonsWare

+0

嘿!我想知道你说什么。如何使用InputStream? –