2009-02-18 46 views
44

我正在嘗試在用戶從圖片庫中選擇的圖像上獲取FileInputStream對象。這是Android URI返回由android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URIAndroid-如何將android.net.Uri對象轉換爲java.net.URI對象?

內容://媒體/外部/圖像/媒體/ 3

當我嘗試從該對象構造一個java URI對象,我得到異常說明一個IllegalArgumentException在URI 預期文件方案:內容://媒體/外部/圖像/媒體/ 3而機器人URI示出了方案爲內容

決不發現原來的問題的解決方案。但是如果你想要圖片庫中的圖片的字節流,這段代碼就可以做到這一點。

Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri); 
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray()); 

回答

40

你可以在Java URIString基於構造函數的組合使用android UritoString方法。

android.net.Uri auri = new android.net.Uri(what ever); 
java.net.URI juri = new java.net.URI(auri.toString()); 

Android URI | Java URI

+3

感謝。試過了。它給出了一個例外(java.net.URI應該有一個有效的方案) – lostInTransit 2009-02-19 12:37:28

+8

這是錯誤的,如果URI具有需要編碼的字符(如空格)將會失敗。 android.net.Uri.toString()解碼已編碼的字符,如果您嘗試在非編碼的字符串上構造它,java.net.URI將拋出異常。正確的解決方案`huri = new java.net.URI(URLEncoder.encode(auri.toString(),「UTF-8」));` – 2013-03-01 18:45:32

+0

@Jeffrey:Uri.toString()返回我的Android 4.1.2上的編碼字符設備 – 2013-03-20 15:34:44

0

由於字符串構造不起作用您是否嘗試過僅僅構造它自己?

android.net.URI auri = new android.net.URI(what ever); 
java.net.URI juri = new java.net.URI(auri.getSchema(), 
            auri.getSchemaSpecificPart(), 
            auri.getFragment()); 

您可能還想仔細檢查一下,您是否從Android URI類獲取有效數據。在我的其他答案中列出的文檔討論它幾乎沒有錯誤檢查。如果事實上有錯誤,那麼該類只是吐出​​垃圾,不會拋出任何異常。這很可能是爲什麼確實進行驗證的java類拋出異常。

38

找到正確的方法,從內容URI打開的InputStream:

InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri); 

這一切!

1

我投了jgilrincon的回答。我不能評論,因爲名譽低,這裏有一些額外的信息 - 您可以使用Apache Cordova項目中的FileHelper.java,它具有您需要從Uri字符串進行文件處理的功能,同時考慮到媒體存儲庫(以及應用資產文件夾)

具體地說,本方法從烏里提供的InputStream:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)