首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >请求权限在android 13或12中无效。

请求权限在android 13或12中无效。
EN

Stack Overflow用户
提问于 2022-11-25 06:11:42
回答 2查看 109关注 0票数 1

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

代码语言:javascript
运行
复制
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
    }


}

清单是

代码语言:javascript
运行
复制
<?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" />
    <uses-permission android:name="android.permission.CAMERA" />
    <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>

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

代码语言:javascript
运行
复制
@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()
}

代码语言:javascript
运行
复制
@Suppress("UNUSED_PARAMETER")
private fun addAlbum(view: View){
    val permissions = Permissions(this,
        arrayListOf(
            Manifest.permission.CAMERA),
        23)
    permissions.checkPermissions()
}

如果回滚更新后的内容,它将显示我所需的权限,但我需要33中的编译。

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

EN

回答 2

Stack Overflow用户

发布于 2022-11-25 06:23:49

安卓13中,谷歌引入了存储的粒度权限,这意味着你现在必须指定你想在应用程序中使用哪种媒体类型。

有三种类型的许可:

READ_MEDIA_AUDIOREAD_MEDIA_VIDEOREAD_MEDIA_IMAGES

你再也不能在安卓13上申请READ_EXTERNAL_STORAGE许可了,我的意思是没有人能够确定原因。一旦你为sdk 33编译,它就会停止询问运行时,并从asking中移除权限。

有关更多信息,请参见此:https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions

票数 1
EN

Stack Overflow用户

发布于 2022-11-25 06:30:46

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

假设您需要一个音频权限,然后是READ_MEDIA_AUDIO,对于视频权限READ_MEDIA_VIDEO,对于图像READ_MEDIA_IMAGES等等。

另外,如果您正在迁移到Android13,那么这篇文章会有很大帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74568889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档