2017-10-08 145 views
0

我嘗試獲取圖像文件的路徑,但getPath()方法返回null(遊標爲null)。從Uri獲取路徑拋出nullpointerexception

public String getPath(Uri uri) { 
 
     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); 
 
     } else 
 
      return null; 
 
    } 
 

 
selectedImageUri = data.getData(); 
 

 
       String selectedPath = getPath(selectedImageUri);

我真的不知道如何解決這個問題。

+0

只是爲了說明。在你的方法'public String getPath(Uri uri)'中,你有內存泄漏,因爲你在返回結果時忘記關閉你的'cursor'。 –

回答

0

A Uri不必代表您可以訪問的文件系統上的文件。該Uri可能指向是內容:

    存儲在移動存儲,你不能訪問
  • 存儲在另一個應用程序,你不能訪問
  • 存儲在加密的形式,其中的內部存儲
  • ContentProvider需要解密
  • 存儲在SQLite數據庫的BLOB列,其中ContentProvider需要加載它,併爲它服務
  • 存儲在「雲」,其中ContentProvider需要下載
  • 實時生成,一路此網頁是

您可以使用ContentResolveropenInputStream()獲得由Uri所代表的內容的InputStream。您可以在您控制的某個文件上創建一個FileOutputStream。而且,您可以使用Java I/O從InputStream複製到OutputStream,在您控制的文件中創建自己的內容副本。