2017-02-25 41 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? –

相關問題