2017-10-08 108 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,在您控制的文件中创建自己的内容副本。