我正在尝试将照片发送到服务器,但只有在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
,这很方便,因为你可以立即将其上传到服务器,但是 Picasso 和服务器无法接受照片,或者更准确地说是似乎不允许读取(Picasso 由于错误显示占位符)。只有在清单文件中添加 requestLegacyExternalStorage
属性时,此代码才能正常工作。然后一切都能正常工作,但是此属性在 Android 11 中已经被移除了。我不知道为什么在 Android 10 上不起作用,尽管在测试设备上的 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
}
Intent.ACTION_PICK
来获取照片并将其路径从content://...
更改为绝对路径(从file:///...
)。然后Picasso可以显示照片,但它也没有上传到服务器。但是感谢您的答案,我以为Android 11不再支持requestLegacyExternalStorage。 - Janey Springscontent
Uri
值。 “但它也没有上传到服务器”-- 有一些使用Uri
上传内容的方法,例如这个用于OkHttp和Retrofit的方法。 - CommonsWare