我正在为我的应用制作类似 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 接收设备上使用

存储的所有图像的 ids
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"/