我正在为我的应用制作类似 UI 的画廊,如果我的目标是 Android 11,我需要请求什么权限?
I am making a gallery like UI for my app, what permissions do i need to ask for if I am targetting Android 11?
我正在使用 MediaStore
接收设备上使用
存储的所有图像的 id
s
private fun getImageUris(): List<Uri> {
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID)
val mCursor = requireActivity().contentResolver.query(
uri,
projection,
null,
null,
null
)
val imageUris = mutableListOf<Uri>()
while (mCursor?.moveToNext() == true) {
val columnIndex = mCursor.getColumnIndex(MediaStore.Images.Media._ID)
val imageId = mCursor.getInt(columnIndex)
val currentImageUri = Uri.withAppendedPath(uri, imageId.toString())
imageUris.add(currentImageUri)
}
mCursor?.close()
return imageUris
}
然后我在 onViewCreated()
中请求我的片段的许可,如下所示:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding = FragmentMainBinding.bind(view)
when {
isStoragePermissionGranted -> {
binding.recyclerView.adapter = RecyclerViewAdapter(getImageUris())
}
shouldShowRequestPermissionRationale -> {
Toast.makeText(mainActivity, "Please grant storage permission", Toast.LENGTH_SHORT).show()
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_REQUEST_CODE)
}
else -> {
Toast.makeText(mainActivity, "Permission not granted. Images cannot be shown.", Toast.LENGTH_SHORT).show()
}
}
}
我希望这会在打开应用程序(并创建我的片段)后立即请求存储权限,然后它应该在我的回收站视图中加载 phone 上的所有图像(我是使用滑行)。但它没有按照预期的方式工作,而是
"Permission not granted. Images cannot be shown."
显示吐司消息
为了快速解决问题,您可以将其添加到 <application>
下的清单文件中
android:requestLegacyExternalStorage="true"
了解 Android 11 here
的存储更新
正如@blackapps 指出的那样,问题就在这里
shouldShowRequestPermissionRationale -> {
Toast.makeText(mainActivity, "Please grant storage permission", Toast.LENGTH_SHORT).show()
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_REQUEST_CODE)
因为 shouldShowRequestPermissionRationale
仅当“拒绝并且不再询问”选项出现时弹出权限时才为真,并且该选项仅在第一次请求权限后出现(从来没有发生过,因为要使这种情况发生,shouldShowRequestPermissionRationale
必须为真)。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
use above permission and in application write below code:
<application
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"/
我正在使用 MediaStore
接收设备上使用
id
s
private fun getImageUris(): List<Uri> {
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID)
val mCursor = requireActivity().contentResolver.query(
uri,
projection,
null,
null,
null
)
val imageUris = mutableListOf<Uri>()
while (mCursor?.moveToNext() == true) {
val columnIndex = mCursor.getColumnIndex(MediaStore.Images.Media._ID)
val imageId = mCursor.getInt(columnIndex)
val currentImageUri = Uri.withAppendedPath(uri, imageId.toString())
imageUris.add(currentImageUri)
}
mCursor?.close()
return imageUris
}
然后我在 onViewCreated()
中请求我的片段的许可,如下所示:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding = FragmentMainBinding.bind(view)
when {
isStoragePermissionGranted -> {
binding.recyclerView.adapter = RecyclerViewAdapter(getImageUris())
}
shouldShowRequestPermissionRationale -> {
Toast.makeText(mainActivity, "Please grant storage permission", Toast.LENGTH_SHORT).show()
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_REQUEST_CODE)
}
else -> {
Toast.makeText(mainActivity, "Permission not granted. Images cannot be shown.", Toast.LENGTH_SHORT).show()
}
}
}
我希望这会在打开应用程序(并创建我的片段)后立即请求存储权限,然后它应该在我的回收站视图中加载 phone 上的所有图像(我是使用滑行)。但它没有按照预期的方式工作,而是
"Permission not granted. Images cannot be shown."
显示吐司消息
为了快速解决问题,您可以将其添加到 <application>
android:requestLegacyExternalStorage="true"
了解 Android 11 here
的存储更新正如@blackapps 指出的那样,问题就在这里
shouldShowRequestPermissionRationale -> {
Toast.makeText(mainActivity, "Please grant storage permission", Toast.LENGTH_SHORT).show()
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_REQUEST_CODE)
因为 shouldShowRequestPermissionRationale
仅当“拒绝并且不再询问”选项出现时弹出权限时才为真,并且该选项仅在第一次请求权限后出现(从来没有发生过,因为要使这种情况发生,shouldShowRequestPermissionRationale
必须为真)。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
use above permission and in application write below code:
<application
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"/