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)
答案 0 :(得分:0)
确保您拥有"访问外部存储"允许你在#34;应用程序"块。 如果您使用的是Android版本23或23+,那么您必须在运行时请求许可。