從Android 6動(dòng)態(tài)權(quán)限開始婆咸,Android每次升級(jí)版本都會(huì)搞些新功能需要兼容,剛好遇到Android 10關(guān)于選取圖片的問題巢价,所以寫篇文章整理一下(突然發(fā)現(xiàn)整理的很片面,還有很多其他的要考慮,所以先這樣吧...懶得繼續(xù)了贝或,剩下的你們自己去官網(wǎng)看吧)
Android 10 分區(qū)存儲(chǔ)
分區(qū)存儲(chǔ)相關(guān)介紹
分區(qū)存儲(chǔ)遇到的兼容問題
- 通過File直接讀取文件錯(cuò)誤 (已有讀取權(quán)限)
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)
分區(qū)存儲(chǔ)兼容方案
- 臨時(shí)方案
- 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())
}
}