Android 10 版本兼容之文件读取

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

            }
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。