android - contentResolver.openInputStream 在选择媒体文件后抛出 FileNotFoundException
问题描述
我正在编写一个自定义媒体选择器并将 URI 返回到结果。一切都很好,除了 Glide 无法加载的图像。
调试后,似乎这个 URI 是我使用的问题原因ContentResolver.openInputStream
,它抛出:FileNotFoundException
我的查询:
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.TITLE,
MediaStore.Images.ImageColumns._ID,
MediaStore.Video.VideoColumns.DURATION,
MediaStore.Video.VideoColumns._ID,
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.SIZE)
val selection = String.format("%s = %d OR %s = %d",
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO)
val sortOrder = MediaStore.Audio.Media.DATE_MODIFIED + " DESC"
val handler = MediaQueryHandler(context.contentResolver)
handler.view = WeakReference(view)
handler.startQuery(-1, null, uri, projection, selection, null, sortOrder)
获取图像文件内容的 URI
ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getLong(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID))))
或其他(视频文件)
ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cursor.getLong(cursor.getColumnIndex(MediaStore.Video.VideoColumns._ID)))
通过这种方式,我在加载这个 URI 时出现异常,content://media/external/images/media/10244
我也尝试编写一个简单的查询contentResolver.query(Uri.parse("content://media/external/images/media/10244"),...)
,看起来一切正常,但路径仍然是/storage/emulated/0/DCIM/tet_viet_captured/1566990942751.jpg
但是当openInputStream,它抛出异常
java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
2019-09-09 11:03:15.331 18146-18146/com.example.helloandroid.debug W/System.err: at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
2019-09-09 11:03:15.332 18146-18146/com.example.helloandroid.debug W/System.err: at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:698)
2019-09-09 11:03:15.332 18146-18146/com.example.helloandroid.debug W/System.err: at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1412)
2019-09-09 11:03:15.332 18146-18146/com.example.helloandroid.debug W/System.err: at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1249)
2019-09-09 11:03:15.333 18146-18146/com.example.helloandroid.debug W/System.err: at android.content.ContentResolver.openInputStream(ContentResolver.java:969)
解决方案
推荐阅读
- algorithm - 一种高效的哈密顿电路算法
- java - 计算 8 位校验和的 Java 程序
- python - minimalmodbus,随机生成错误的crc
- php - PHP eval() - 只有一个函数
- python - 无法使用 torch.jit.trace 跟踪模型
- javascript - 在 js 文件中获取网页中与脚本相关的 HTML 标签(基本 XSS)(CWE ID 80)
- xaml - 如何从 Xamarin.Forms for iOS 中的图像中获取最常用的像素颜色?
- slider - Javascript滑块从最大值到最小值到最大值
- python - 更改docx中标题中替换文本的字体大小?
- c# - 如何将 Microsoft.Extesions.ILogger 与 NLog 一起使用?