android - READ_EXTERNAL_STORAGE 不适用于 Android 10
问题描述
我正在尝试将照片发送到服务器,但我无法仅在 Android 10 上访问照片。发出 READ_EXTERNAL_STORAGE 请求,单击“允许”,在设置中,允许访问存储。
显现
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
分段
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
,很方便,因为你可以立即将它上传到服务器,但是毕加索和服务器不接受照片,或者更确切地说它似乎不允许读取(毕加索显示占位符由于错误)。此代码仅在您添加requestLegacyExternalStorage
到清单时才有效。然后一切正常,但这个属性在 Android 11 中消失了。我不知道为什么 10 Android 不能正常工作,尽管在 7、8、6 上使用测试设备一切正常。
//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
}
解决方案
仅当您将 requestLegacyExternalStorage 添加到清单时,此代码才有效。
因此,添加android:requestLegacyExternalStorage="true"
到<application>
清单中的元素。
Then everything works fine at once , but this attribute disappear in Android 11
In Android 11+, to a large extent, READ_EXTERNAL_STORAGE
works as it did in Android 9 and below. There will be some more areas that are off-limits, though.
What Google would prefer that you do is to stop thinking in terms of files and the filesystem, and instead use the Storage Access Framework (e.g., ACTION_OPEN_DOCUMENT
).
推荐阅读
- arrays - 获取数据库中的单列数组并在 laravel Blade 中显示
- qemu - 如何将每个受支持的 CPU 标志作为 QEMU CPU 标志?
- vue.js - Vue.js 递归组件的数据,包括 props
- ruby-on-rails - Ruby on rails 6.1.2 从索引页面创建帖子
- python - Plotly Dash 按钮回调函数
- python - 合并两个 pandas 数据框,一个日期不频繁,应按最近日期合并
- amazon-web-services - ECS 服务成本
- firebase - Flutter web - Firebase 消息处理后台通知
- amazon-web-services - 我们如何使用 Cloud Formation 为 Lambda 设置动态变量
- javascript - 在模态框外关闭/打开引导模态?