2016-08-21 51 views
0

我在使用Android中的文件選取器從外部存儲中選擇圖像文件時遇到問題。這個問題是這個問題的結果 - No such file or diectory error in image file upload using Retrofit in Android。我的問題是從活動結果的外部存儲打開和讀取文件。我想將結果URI轉換爲文件。如何使用Android中的文件選取器從外部存儲中選擇文件

,我讀了下載文件夾中PDF文件上的活動結果

Uri bookUri = data.getData(); 
       if(bookUri!=null) 
       { 
        String filePath = bookUri.toString();//bookUri.toString() 
        String mime = app.getMimeType(filePath); 
        if(mime!=null && !mime.isEmpty() && (mime.toLowerCase()=="application/pdf" || mime.toLowerCase()=="application/txt" || mime.toLowerCase()=="application/text")) 
        { 
         bookFile = new File(bookUri.getPath()); 
         ivBookFile.setImageResource(R.drawable.book_selected); 
        } 
        else{ 
         Toast.makeText(getBaseContext(),"Unable to process file you have chosen.",Toast.LENGTH_SHORT).show(); 
        } 
       } 

正如你可以看到我用新的文件(bookUri.getPath());轉換成文件。上面的代碼運行良好。這是工作。現在的問題是我試圖在活動結果的DCIM/Camera文件夾中打開一個圖像文件。

這是我用

Uri selectedImageUri = data.getData(); 
       if(selectedImageUri!=null) 
       { 
        try{ 
         bmpCoverImage = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri); 
         imageFile = new File(selectedImageUri.getPath()); 
         if(bmpCoverImage!=null) 
         { 
          ivCoverImage.setImageBitmap(bmpCoverImage); 
         } 
        } 
        catch (IOException e) 
        { 
         Toast.makeText(getBaseContext(),"An error occurred with the file selected",Toast.LENGTH_SHORT).show(); 
        } 
       } 

正如你可以看到我用新的文件(selectedImageUri.getPath())的代碼;就像我在閱讀pdf文件時一樣。這次代碼不起作用。當我像上一個問題那樣操作文件時,它給了我錯誤。

我用這樣的方式也

imageFile = new File(Environment.getExternalStorageDirectory(),selectedImageUri.getPath()); 

我得到了同樣的錯誤。請如何從外部存儲器正確打開圖像文件?我怎樣才能將選擇的文件URI從外部存儲轉換爲文件?

enter image description here

回答

1

我有使用文件選擇器在Android中

如果你指的是正在使用中this question代碼從外部存儲器中選擇圖像文件的問題,你是不是「使用文件選擇器」。您正在使用ACTION_GET_CONTENT,它從來不是「文件選擇器」,也不會是「文件選擇器」。

我想結果URI轉換成文件。

通常情況下,這是沒有必要的。但是,如果這是你想要做什麼:

  • 使用ContentResolveropenInputStream()獲得由Uri

  • 所代表的內容的InputStream在您需要的文件創建一個FileOutputStream

  • 使用Java I/O將InputStream中的字節複製到FileOutputStream

上面的代碼運行良好。這是工作。

它適用於您測試的少量設備,用於用戶選擇處理ACTION_GET_CONTENT請求的特定活動。它不適用於大多數Android設備,並且在大多數情況下都不起作用。該代碼將工作的唯一時間是如果Urifile計劃。大多數時候,它不會。相反,它將有一個content方案,表示由ContentProvider提供的內容。

請問我該如何從外部存儲器正確打開圖像文件?

如果您希望繼續使用ACTION_GET_CONTENT,請你明白,這無關與外部存儲明確。您沒有收到文件,外部存儲器或其他地方。你得到一個Uri。這類似於網址,例如此網頁的網址。正如URL不一定指向硬盤上的文件一樣,Uri也不一定指向文件系統上的文件。使用ContentResolverDocumentFileUri及其標識的內容一起使用。

如果你想總是獲取外部存儲(和其他地方)的文件,然後使用an actual file picker library

+0

非常感謝。我會嘗試一下。現在我得到了什麼是錯誤的,你明確指出了我。現在我從你身上學到了很好的一課。 –

+0

我已經試過了。我安裝了一個文件選擇器。它工作完美。非常感謝。 –

相關問題