首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >READ_EXTERNAL_STORAGE不能在Android 10上工作

READ_EXTERNAL_STORAGE不能在Android 10上工作
EN

Stack Overflow用户
提问于 2020-07-26 09:15:08
回答 2查看 4.5K关注 0票数 6

我试图向服务器发送一张照片,但我不能只在安卓10上访问照片。我发出了一个READ_EXTERNAL_STORAGE请求,点击“允许”,在设置中允许访问存储空间。

流形

代码语言:javascript
代码运行次数:0
运行
复制
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

片段

代码语言:javascript
代码运行次数:0
运行
复制
private fun haveStoragePermission() =
    ActivityCompat.checkSelfPermission(requireActivity(), Manifest
       .permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED

private fun requestPermission() {
  if (!haveStoragePermission()) {
     val permissions = arrayOf(
          Manifest.permission.READ_EXTERNAL_STORAGE
     )
     ActivityCompat.requestPermissions(requireActivity(), permissions, STORAGE_REQUEST_PERMISSION)
  }
}

文件的路径显示在日志中。它是绝对的,就像file:///emulated/0/...photo.jpg一样,它很方便,因为您可以立即将它上传到服务器,但是Picasso和server不接受照片,或者更确切地说,它似乎不允许读取(因为一个错误,Picasso显示占位符)。只有在将requestLegacyExternalStorage添加到清单中时,此代码才能工作。但是这个属性在Android 11中消失了,我不知道为什么10个Android不能工作,尽管在7,8,6上的测试设备一切都很好。

代码语言:javascript
代码运行次数:0
运行
复制
//Get images code
private fun getAllShownImagesPath(activity: Activity): ArrayList<String> {
    val listOfAllImages = ArrayList<String>()
    val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val projection = arrayOf(
        MediaColumns.DATA,
        MediaStore.Images.Media.BUCKET_DISPLAY_NAME
    )
    val cursor = activity.contentResolver.query(
        uri, projection, null,
        null,"${MediaStore.Images.Media.DATE_TAKEN} DESC"
    )
    val columnIndexData = cursor!!.getColumnIndexOrThrow(MediaColumns.DATA)
    while (cursor.moveToNext()) {
        val absolutePathOfImage = cursor.getString(columnIndexData)
        listOfAllImages.add("file://$absolutePathOfImage")
    }
    return listOfAllImages
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-26 11:18:40

此代码仅在向清单中添加requestLegacyExternalStorage时才能工作。

因此,将android:requestLegacyExternalStorage="true"添加到清单中的<application>元素。

然后所有的

都能同时正常工作,但是这个属性在Android 11中消失了。

在Android 11+中,READ_EXTERNAL_STORAGE在很大程度上与安卓9和更低版本的READ_EXTERNAL_STORAGE一样工作。不过,还有更多的领域是禁止的。

Google希望您不要再考虑文件和文件系统,而是使用存储访问框架(例如,ACTION_OPEN_DOCUMENT)。

票数 10
EN

Stack Overflow用户

发布于 2020-07-26 09:44:41

默认情况下,针对Android 10及更高版本的应用程序被授予范围访问外部存储或作用域存储的权限。这样的应用程序可以查看外部存储设备中的文件,而不需要请求任何与存储相关的用户权限,但是您可以在活动xml中添加以下属性,以回到旧的行为。

android:requestLegacyExternalStorage="true"

但这在很长一段时间内是不存在的。您必须根据新规范处理此问题,以获得更多详细信息https://developer.android.com/about/versions/10/privacy/changes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63098265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档