2017-02-22 82 views
-1

我用這個方法來從URI得到的文件路徑:錯誤從Download文件夾路徑獲取圖像的Android

public String getPath(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    String document_id = cursor.getString(0); 
    document_id = document_id.substring(document_id.lastIndexOf(":") + 1); 
    cursor.close(); 

    cursor = getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null); 
    cursor.moveToFirst(); 
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
    cursor.close(); 

    return path; 
} 

如果我嘗試從一個圖像文件獲取文件的路徑,從畫廊的作品完美。但是,當我嘗試從下載文件夾中的圖像文件獲取路徑文件時,不起作用。有什麼建議麼。非常感謝你提前。

回答

2

我用這個方法來得到URI

是不會工作的文件路徑。

如果我嘗試從畫廊的圖像文件中獲取的文件路徑的作品完美

並非在所有設備上,而不是對所有圖像。

任何建議

你似乎認爲一個Uri必須映射到一個文件,你可以找到的路徑的文件,並且該路徑是什麼,你可以使用。

這些都不是真的。

如果Uri的方案恰好是file然後getPath()將是一個文件系統路徑,指着那(大概),你可以訪問文件。

如果方案content,那麼Uri可以指向什麼

  • 外部存儲上的文件,你可以訪問
  • 移動存儲的文件,你不能訪問
  • 另一個應用程序的內部存儲器上的文件,您無法訪問
  • 另一個應用程序的資產,它不是文件
  • BLOB列的數據庫,這是不是一個文件
  • 是實時生成一個值,這個網頁是這樣的,這是不是一個文件
  • 內容將從被流化的A值互聯網上,這是不
  • 等等

使用ContentResolveropenInputStream()(也許openOutputStream())的設備上的文件由Uri標識的內容合作。

+0

Hi CommonsWare。非常感謝你真的很好的答案。選擇圖像後,Uri被正確傳回。但是當我嘗試獲取donwload文件夾中該圖像的實際路徑時,它會崩潰。這個問題似乎是特定於這個特定的文件夾。我不知道如何管理ContentResolver或openInputStream()。那麼,我怎麼能得到這個文件夾中的實際位置? – agustincola

+0

@agustincola:「我怎麼能得到這個文件夾中的實際位置?」 - 你沒有。您可以使用'Uri'訪問與內容相關的流,使用'ContentResolver'。這應該包含在你的Android應用程序開發書或課程中。它也包含在[文檔](https://developer.android.com/training/secure-file-sharing/request-file.html)中。 – CommonsWare

+0

好的。感謝您的時間。 – agustincola

-1

也許我沒有問好,因爲我的英語。在研究了幾個選項之後,最後我創建了一個適合我的好的解決方案。我強制打開圖庫圖像,並且用戶無法隨時從Donwload文件夾下載。我在showFileChooser方法中執行下一步:

private void showFileChooser() { 
    if (Build.VERSION.SDK_INT <19){ 
     Intent intent = new Intent(); 
     intent.setType("image/jpeg"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.select_picture)),PICK_IMAGE_REQUEST); 
    } else { 
     Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i, PICK_IMAGE_REQUEST); 
    } 

我希望它對未來的某個人有用。