2017-05-23 110 views
0

所以我使用改造上傳圖像到我們的服務器,並使用畫廊選擇器來選擇圖像。我試圖獲取圖像的路徑,因爲uri.getPath()返回文件未找到異常。我幾乎看到了關於這個主題的每一個stackoverflow文章,但仍然沒有答案。我擁有的以下代碼與我在網上看到的所有內容相似,它總是返回null,我不知道爲什麼。請幫助獲取URI的路徑始終爲空?

 @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 
     try { 
      android.net.Uri selectedImage = data.getData(); 

      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); 
      // Log.d(TAG, String.valueOf(bitmap)); 
      ImageView imageView = (ImageView) findViewById(R.id.expandedProfilePic); 
      imageView.setImageBitmap(bitmap); 

      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
      android.database.Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
      if (cursor == null) 
       return; 

      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String filePath = cursor.getString(columnIndex); 
      cursor.close(); 

      // is always null 
      System.out.println("FILE PATH " + filePath); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

2

我試圖讓圖片的路徑,因爲uri.getPath()返回文件未發現異常

假設通過「畫廊選擇器」,你的意思ACTION_GET_CONTENT或可能ACTION_PICK,沒有路徑,因爲Uri不是文件。

我從字面上看到關於這個問題

不,你沒有幾乎每一個計算器的文章。具體來說,你有沒有讀過,我要貢獻了幾十個,如this onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis onethis one的。而這些僅僅是從2017年

下面的代碼,我有類似的一切我已經在網上看到

這代碼將不會對大多數Uri值工作。

使用ContentResolveropenInputStream()得到Uri標識的內容InputStream。理想情況下,您只需使用InputStream。在Retrofit的情況下,雖然我沒有嘗試上傳內容,但我的猜測是它堅持一個文件。在這種情況下,請使用您控制的某個文件上的InputStreamFileOutputStream製作內容的副本。然後,上傳副本,並在完成後刪除它。

+0

即時通訊使用ACTION_GET_CONTENT,我也經歷了你的其他堆棧溢出,但我仍然不明白如何使用inputstream將給我的照片路徑。我需要路徑才能通過改造上傳。 – thatsnifty

+0

@thatsnifty:「我仍然不明白如何使用inputstream給我照片的路徑」 - 這是因爲**沒有照片的路徑**,至少在您複製該內容之前,正如我在答案的最後一段所述。是什麼讓你認爲照片永遠是本地文件系統上的文件?該操作是「ACTION_GET_CONTENT」,而不是「ACTION_GET_FILE」。如果你無法處理'ACTION_GET_CONTENT'可能返回不是文件的事實,請停止使用'ACTION_GET_CONTENT'。 – CommonsWare

+0

好吧,所以花了幾天時間,但我終於明白了!我結束了使用ACTION_PICK,inputstream和contentresolver。你的回答真的有幫助!無論誰遇到同樣的問題,這也是一個很好的例子:[link] https://inducesmile.com/android/android-upload-image-to-server-using-retrofit-2/ – thatsnifty