为什么即使在getContentResolver()。query(uri ...)之后返回游标但是context.getContentResolver()。openInputStream(uri)throws

时间:2017-05-17 21:49:20

标签: android filenotfoundexception filepicker

使用

        Intent.ACTION_GET_CONTENT打开文件选择器

    Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT);
    openIntent.addCategory(Intent.CATEGORY_OPENABLE);
    String contentType = "*/*";
    openIntent.setType(contentType);
    startActivityForResult(openIntent, ANDROID_FILE_PICKER);

并从'下载'中选择一个文件,它返回的是uri:

content://com.android.providers.media.documents/document/image%3A1679

当使用uri查询文件的数据时,它返回正常。但是使用相同的uri来执行openInputStream(uri),它会抛出“FileNotFoundException:No such file or directory”。

当拿起其他文件时,它返回uri:

content://com.android.providers.media.documents/document/image%3A3372

适用于查询和openInputStream。

是否有可能android返回uri可能用于查询,但不能用于openInputStream(有人工作)?什么可能导致这个?有另一种获取文件内容的方法吗?

代码段:

try {
  cursor = context.getContentResolver().query(uri, null, null, null, null);
  if (cursor != null && cursor.moveToFirst()) {
     fileDisplayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));

     int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
     if (!cursor.isNull(sizeIndex)) {
         fileSize = cursor.getInt(sizeIndex);
     }

     if (!TextUtils.isEmpty(fileDisplayName) && fileSize > 0 {
        // the query uri return cursor with the filename and size, looks good
        try {

           // it throws at this line:
           InputStream inputStream = context.getContentResolver().openInputStream(uri);

                   ... ...

        } catch (Exception ex) {
           //java.io.FileNotFoundException: No such file or directory 
        }
     }
  }

} catch (Exception e) {
    return null;
} finally {
   if (cursor != null) {
      cursor.close();
   }
}

调用堆栈:

05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err: java.io.FileNotFoundException: No such file or directory
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1104)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:942)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at android.content.ContentResolver.openInputStream(ContentResolver.java:662)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at com.zeta.app.utils.FileUtils.cacheFileLocally(FileUtils.java:63)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at com.zeta.app.ui.FilePickerActivity.pickedFile(FilePickerActivity.java:377)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at com.zeta.app.ui.FilePickerActivity.access$100(FilePickerActivity.java:84)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at com.zeta.app.ui.FilePickerActivity$1.run(FilePickerActivity.java:243)
05-17 18:25:41.816 28620-30341/com.zeta.app W/System.err:     at java.lang.Thread.run(Thread.java:818)

1 个答案:

答案 0 :(得分:0)

确保您拥有"访问外部存储"允许你在#34;应用程序"块。 如果您使用的是Android版本23或23+,那么您必须在运行时请求许可。