【问题标题】:Request permission is not working in android 13 or 12请求权限在 android 13 或 12 中不起作用
【发布时间】:2022-11-25 14:35:19
【问题描述】:

我将我的 android 项目从 compileSdkVersion 31 更新到 compileSdkVersion 33。我有下一个代码来启动我在应用程序中需要的权限,但它不起作用

import android.Manifest
import android.app.Activity
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import android.os.Build



class Permissions(private val activity: Activity, private val permissionList: List<String>, val code: Int) {

    fun checkPermissions() {
        if (permissionsGranted() != PackageManager.PERMISSION_GRANTED) {
            requestPermissions()
        }
    }

    private fun permissionsGranted(): Int {
        var counter = 0
        for (permission in permissionList) {
            counter += ContextCompat.checkSelfPermission(activity, permission)
        }
        return counter
    }

    private fun deniedPermission(): String {
        for (permission in permissionList) {
            if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_DENIED) return permission
        }
        return ""
    }

    private fun requestPermissions() {
        val permission = deniedPermission()
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {

        } else {

            ActivityCompat.requestPermissions(activity, permissionList.toTypedArray(), code)
        }
    }

    fun checkPermission(manifest: String): Boolean {
        val result = ContextCompat.checkSelfPermission(activity, manifest)
        return result == PackageManager.PERMISSION_GRANTED
    }

    fun checkPermissionActivity(state: Boolean, urlPath: String, kind : String){
        val showRationale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            this.activity.shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) && this.activity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        } else {
            true
        }

        if (!showRationale) {

            return
        } else {

            return
        }
    }

    fun getAllPermissions(): List<String> {
        val granted = ArrayList<String>()
        val pi = activity.packageManager.getPackageInfo(activity.packageName, PackageManager.GET_PERMISSIONS)
        for (i in pi.requestedPermissions.indices) {
            if (pi.requestedPermissionsFlags[i] and PackageInfo.REQUESTED_PERMISSION_GRANTED != 0) {
                granted.add(pi.requestedPermissions[i])
            }
        }

        return granted
    }


}

清单是

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.co.retrofit.app">
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
            android:name=".feature.RetrofitApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:networkSecurityConfig="@xml/network_security_config"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            android:usesCleartextTraffic="true">
        <activity
                android:exported="true"
                android:name=".feature.view.activities.Maintenance" />
        <activity android:name=".feature.view.activities.SplashActivity"  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".feature.view.activities.MainActivity"  android:exported="true"/>
    </application>

</manifest>

单击一个按钮时调用该函数

@Suppress("UNUSED_PARAMETER")
private fun addAlbum(view: View){
    val permissions = Permissions(this,
        arrayListOf(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE),
        23)
    permissions.checkPermissions()
}

或者

@Suppress("UNUSED_PARAMETER")
private fun addAlbum(view: View){
    val permissions = Permissions(this,
        arrayListOf(
            Manifest.permission.CAMERA),
        23)
    permissions.checkPermissions()
}

如果我回滚更新,它显示我需要的权限,但我需要在 33 中编译

现在如果我只更新编译 SDK,它不会显示弹出窗口

【问题讨论】:

    标签: java android react-native android-studio kotlin


    【解决方案1】:

    你不能再在 Android 13 上请求 READ_EXTERNAL_STORAGE 权限,我的意思不再是没有人能够确定原因。一旦你为 sdk 33 编译,它就会停止在运行时询问并从应用程序设置中删除权限。

    请参阅此以获取更多信息:https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions

    【讨论】:

    • 如果我想访问相机。
    【解决方案2】:

    通过以 Android 13 为目标,您需要在我们的清单中声明您确切想要阅读的媒体类型。您不能直接在清单中请求READ_EXTERNAL_STORAGE

    假设你想要一个音频许可,那么READ_MEDIA_AUDIO,视频许可READ_MEDIA_VIDEO,图像许可READ_MEDIA_IMAGES等。

    此外,如果您要迁移到 Android 13,那么this article 可以提供很多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      相关资源
      最近更新 更多