2016-03-11 97 views
0

當使用ACTION_GET_CONTENT意圖選擇圖像時,我得到一個URI,我無法打開該文件。如果我嘗試打開該文件,就像這樣:從Uri讀取文件給出java.io.FileNotFoundException:打開失敗:ENOENT

InputStream in = new FileInputStream(new File(uri.getPath())); 

它提供了以下異常:

03-11 15:14:36.132 20557-20557/my.package W/System.err﹕ java.io.FileNotFoundException: /document/image:9537: open failed: ENOENT (No such file or directory) 
03-11 15:14:36.138 20557-20557/my.package W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456) 
03-11 15:14:36.138 20557-20557/my.package W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:76) 

/document/image:9537似乎的確是一個不正確的路徑,但如何得到正確的路徑?

我用這樣的邏輯來打開圖像選擇器:在onActivityResult

Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
photoPickerIntent.setType("image/*"); 
photoPickerIntent.putExtra("return-data", false); 
startActivityForResult(Intent.createChooser(photoPickerIntent, "Complete action using"), PICK_FROM_FILE); 

和檢索烏里這樣的:

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    .... 
    Uri uri = data.getData(); 

我需要的文件來完成解碼,使其小。

回答

3

如果我嘗試打開該文件,就像這樣:

這將不是最現代的Android設備使用。很可能,您收到了content:Uri。在較新版本的Android上這是相當正常的。未來版本的Android可能會阻止file:Uri值。

我需要讓文件做解碼使其更小。

這並不是一個文件關聯到一個給定的Uri。這Uri可能指向:

  • 在外部存儲設備的本地文件
  • 內部存儲本地文件的其他應用程序
  • 移動存儲本地文件
  • 經過加密和本地文件需要立即解密
  • 保存在數據庫的BLOB列中的字節流
  • 需要先由其他應用下載的一段內容
  • ...等等

使用ContentResolveropenInputStream()獲得對內容的InputStreamUri指向。然後,將其傳遞給您的解碼邏輯,例如BitmapFactory及其decodeStream()方法。

+0

太棒了。我只是對這些uri的工作有誤解。 – wvdz

+0

@wvdz:是的,最好將它們視爲不透明句柄,類似於網站的URL。 – CommonsWare

相關問題