2014-08-27 52 views
0

我試圖從庫中獲取所選文件的路徑,但它返回null,我不知道爲什麼。我看到的每個代碼都使用相同的方法,但對我無效。這裏是我的代碼:來自Uri的圖像路徑返回null

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // LOAD_FILE_REQUEST is a global variable: 
    // private static final int LOAD_FILE_REQUEST = 1; 

    if (requestCode == LOAD_FILE_REQUEST && resultCode == RESULT_OK && data != null) { 
     if(data.getData() == null) { 
      System.out.println("NULL"); 
     } else { 
      System.out.println("NOT NULL"); // <--- Printed 
     } 

     currImageURI = data.getData(); 

     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = getContentResolver().query(currImageURI, filePathColumn, null, null, null); 
     if(cursor.moveToFirst()){ 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String yourRealPath = cursor.getString(columnIndex); 
      System.out.println("REAL PATH "+yourRealPath); 
     } else { 
      System.out.println("NO ROWS!!!"); // <-- Not printed 
     } 
     cursor.close(); 
    } 

} 

回答

1

你能解釋多一點你的問題是什麼?你在哪裏得到空?

您在哪個Android版本中運行此代碼?從Android 4.4開始,當您發送獲取圖像的意圖時打開的filechooser會返回相對uri,因爲它不僅會顯示存儲在設備中的文件,還會顯示存儲在雲中的文件。所以,可能會發生這樣的情況,即您獲取相對URI並且在查詢設備上的位置時,您會收到空值,因爲ContentResolver沒有該文件的路徑。如果是這種情況(其實即使你不是,因爲你應該爲Android的新版本開發兼容性的應用程序),我建議你使用Content Resvolver打開一個InputStream來獲取文件(openInputStream( URI),因爲它可以讓你從任何位置(包括本地和雲)。

取文件我希望它能幫助:)

+0

這「你得到一個相對的URI,當你查詢它的位置(...)ContentResolver沒有該文件的路徑。」幫助我用另一種方法解決我的問題。不是試圖獲取圖像位置,而是將其保存在sd上,然後通過這個新的文件路徑進行訪問。謝謝。 – lucasdc 2014-08-28 16:16:31

2

你加線

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在您的清單? =)

(有這個問題^^)

+0

哦,我沒有意識到我必須添加它。謝謝,但無論如何,仍然不工作.. – lucasdc 2014-08-27 23:46:09

2

嗯,這裏是我怎麼做我的生活壁紙(Noiraude,看看:P)

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

switch (requestCode) { 
    case 100: 
     if (resultCode == RESULT_OK) { 
      Uri selectedImage = imageReturnedIntent.getData(); 
      @SuppressWarnings("unused") 
      InputStream imageStream = null; 
      try { 
       imageStream = getContentResolver().openInputStream(
         selectedImage); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      sharedPreferences = getSharedPreferences("NLP_settings", 0); 
      Editor editor = sharedPreferences.edit(); 
      editor.putString("key_bit", getPath(selectedImage)); 
      editor.commit(); 
      restartThis(); 
     } 
    } 
} 

public String getPath(Uri uri) { 
    // just some safety built in 
    if (uri == null) { 
     return null; 
    } 
    // try to retrieve the image from the media store first 
    // this will only work for images selected from gallery 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    if (cursor != null) { 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
    // this is our fallback here 
    return uri.getPath(); 
} 

+0

後備工作像一個魅力!萬分感謝! – sud007 2016-11-02 17:06:00