美文网首页android版本监容
Android 10 版本兼容之文件读取

Android 10 版本兼容之文件读取

作者: 传超_ | 来源:发表于2020-06-16 14:58 被阅读0次

从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)

分区存储兼容方案

  1. 临时方案
  • 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>
    
  1. 推荐方案
  • 通过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())

            }
        }

相关文章

网友评论

    本文标题:Android 10 版本兼容之文件读取

    本文链接:https://www.haomeiwen.com/subject/pnjlxktx.html