我试图向服务器发送一张照片,但我不能只在安卓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
一样,它很方便,因为您可以立即将它上传到服务器,但是Picasso和server不接受照片,或者更确切地说,它似乎不允许读取(因为一个错误,Picasso显示占位符)。只有在将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
}
发布于 2020-07-26 03:18:40
此代码仅在向清单中添加requestLegacyExternalStorage时才能工作。
因此,将android:requestLegacyExternalStorage="true"
添加到清单中的<application>
元素。
然后所有的
都能同时正常工作,但是这个属性在Android 11中消失了。
在Android 11+中,READ_EXTERNAL_STORAGE
在很大程度上与安卓9和更低版本的READ_EXTERNAL_STORAGE
一样工作。不过,还有更多的领域是禁止的。
Google希望您不要再考虑文件和文件系统,而是使用存储访问框架(例如,ACTION_OPEN_DOCUMENT
)。
发布于 2020-07-26 01:44:41
默认情况下,针对Android 10及更高版本的应用程序被授予范围访问外部存储或作用域存储的权限。这样的应用程序可以查看外部存储设备中的文件,而不需要请求任何与存储相关的用户权限,但是您可以在活动xml中添加以下属性,以回到旧的行为。
android:requestLegacyExternalStorage="true"
但这在很长一段时间内是不存在的。您必须根据新规范处理此问题,以获得更多详细信息https://developer.android.com/about/versions/10/privacy/changes。
https://stackoverflow.com/questions/63098265
复制