从Android 6动态权限开始,Android每次升级版本都会搞些新功能需要兼容,刚好遇到Android 10关于选取图片的问题,所以写篇文章整理一下(突然发现整理的很片面,还有很多其他的要考虑,所以先这样吧...懒得继续了,剩下的你们自己去官网看吧)
Android 10 分区存储
分区存储相关介绍
分区存储遇到的兼容问题
- 通过File直接读取文件错误 (已有读取权限)
java.io.FileNotFoundException: /storage/emulated/0/DCIM/Alipay/1592268891880.png: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileInputStream.<init>(FileInputStream.java:159)
at java.io.FileInputStream.<init>(FileInputStream.java:115)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1200)
分区存储兼容方案
- 临时方案
- targetSdk 改为9(Api 28)或者以下
- targetSdk 为10 (Api 29),manifest 文件增加android:requestLegacyExternalStorage="true" (buildToolsVersion 需要29以上)
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
- 推荐方案
- 通过Uri读取图片
val cursor = context.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
arrayOf(
BaseColumns._ID
), null, null, MediaStore.Images.Media.DATE_ADDED.plus(" DESC")
)
cursor?.apply {
if (moveToFirst()) {
do {
val resId = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID))
val uri = ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
resId
)
} while (cursor.moveToNext())
}
}
网友评论