Android API 33 权限未授予

2024-01-06

所以当我在developer.android网站上读到Android 13给权限字段带来了新的变化。

我有一个聊天应用程序,我需要在其中拨打电话、打开相机、录制音频、在外部存储中读取和写入。因此,在 SplashScreen 中,我向用户请求这些权限。然而,其中一些没有被授予,但甚至系统也没有向我索要这些。

这是我在声明中声明的内容AndroidManifest.xml file

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:name=".ChatApplication"
        android:allowBackup="false"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="false"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/logo"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/logo"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"
        tools:replace="android:allowBackup, android:label">

这是我在闪屏活动中的内容

class SplashActivity : BaseActivity() {

    private val splashViewModel: SplashViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        if (!hasPermissions(this, *REQUIRED_PERMISSIONS))
            ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, ALL_PERMISSIONS)
        else
            Handler(Looper.getMainLooper()).postDelayed ({ startUi() }, 1000)
    }

    private fun hasPermissions(context: Context, vararg permissions: String): Boolean =
        permissions.all {
            ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
        }

    private fun startUi() {
        // navigate to main application
    }

    private fun finishActivity() {
        toast("You must grant all required permissions to continue")
        finish()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            ALL_PERMISSIONS -> {
                if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) startUi()
                else finishActivity()
            }
        }
    }

    companion object {
        const val ALL_PERMISSIONS = 10
        private val REQUIRED_PERMISSIONS =
            mutableListOf (
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CAMERA
            ).apply {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                    add(Manifest.permission.READ_MEDIA_IMAGES)
                    add(Manifest.permission.READ_MEDIA_VIDEO)
                    add(Manifest.permission.READ_MEDIA_AUDIO)
                    add(Manifest.permission.POST_NOTIFICATIONS)
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
                    add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            }.toTypedArray()
    }
}

When i put a breakPoint to the onRequestPermissionsResult i see this enter image description here

我在屏幕上看到的权限提示涉及相机、录制音频和电话状态。之后,应用程序通过调用退出finishActivity()

我正在运行该应用程序Pixel 6 Pro API 33模拟器 这样做的正确方法是什么?我该如何解决这个问题?


在Android 13中,您不需要请求权限

这是我的传递权限的代码示例

在Mainfests.xml中添加

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
      tools:ignore="ScopedStorage" />

然后,在您的课程或活动中添加:

public static String[] storage_permissions = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE
};

@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
public static String[] storage_permissions_33 = {
        Manifest.permission.READ_MEDIA_IMAGES,
        Manifest.permission.READ_MEDIA_AUDIO,
        Manifest.permission.READ_MEDIA_VIDEO
};

public static String[] permissions() {
    String[] p;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        p = storage_permissions_33;
    } else {
        p = storage_permissions;
    }
    return p;
}

请求权限时,调用permissions();

 ActivityCompat.requestPermissions(MainActivity.this, 
                              permissions(), 
                              1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android API 33 权限未授予 的相关文章

随机推荐

  • 从另一个jar文件访问资源

    我有一个简单的结构 一个包含一批数据的数据 jar 文件和一个使用数据运行服务的服务 jar 文件 为了使数据易于替换 我将它们分开 并且 service jar 的类路径包含 data jar 所在的目录 在 service jar 中
  • 如何在 gitlab 中为多分支管道 jenkins 添加 webhook

    我想为每次推送触发多分支管道 任何人都可以告诉我如何在 gitlab 中配置 web hooks 来实现多分支管道 如果您想知道触发器设置在多分支管道作业设置中的位置 这将回答它 与其他作业类型不同 多分支作业配置不需要 触发器 设置 只需
  • 如何从 Android 中的 PreferenceActivity 获取 SharedPreferences?

    我正在使用 PreferenceActivity 来显示我的应用程序的一些设置 我通过 xml 文件扩充设置 以便我的 onCreate 和完整的类方法 如下所示 public class FooActivity extends Prefe
  • Yolo 暗网仅检测特定类别,如人、猫、狗等

    我们使用 YOLO Darknet 进行对象检测 我们使用Python3 tensorflow 1 0 numpy opencv 3 使用yolo weight进行检测 根据下面的链接给出 https github com thtrieu
  • 如何忽略文件夹而不将其从我的存储库中删除

    我有 tmp 和 cache 目录 它们不断生成不需要提交的文件 我如何设置它以便 svn 忽略它们 但不删除它们或从存储库中删除它们 站点需要它们才能工作 cd path to app tmp svn propset svn ignore
  • 请求重试之间的超时 Apache HttpClient

    有人可以分享如何配置现代 HttpClient 4 5 3 以重试失败的请求并在每次重试之前等待一段时间吗 到目前为止看来我的理解是正确的 setRetryHandler new DefaultHttpRequestRetryHandler
  • php is_file 总是返回 false

    php is file 总是返回 false apache h185 default ls l home www default p php rwxr xr x 1 zhouhh zhouhh 50837 Aug 28 19 02 home
  • EC2 Amazon Linux AMI MySQL CPU @ 62% 空闲时?

    我在 Amazon Linux AMI 上运行 MySQL 没有任何东西与之相关 没有连接 也没有其他正在运行的使用 MySQL 的应用程序 它完全闲置了 但是 top报告 mysql 使用 62 的 CPU 为什么会发生这种情况以及如何解
  • 在android中创建全局函数

    我想要做的是创建一个具有各种功能的java文件 我想在整个项目中使用它 例如检查互联网连接 然后我想在每个活动上调用该函数 有谁知道这是怎么做到的吗 像这样创建类并在此处添加您的函数 package com mytest import an
  • 傻瓜线程队列

    我认为这是一个非常常见的线程场景 我有 100 份相同的工作需要完成 所有工作都是独立的 其他 我想最多处理 一次 15 个职位 正如每一份工作 完成后 将开始新的工作 直到所有作业完成 如果您假设每个作业完成时都会触发一个事件 我使用的是
  • R 中的 sqlquery 不返回查询中的所有行

    我正在 R 中执行以下命令 dbhandle lt odbcDriverConnect driver SQL Server server serveripaddress database DBName uid sa pwd pwd Fact
  • 获取 Finder 中所选文件的路径

    如何检索 Finder 中所选文件的路径数组 我四处搜索 但只找到了有关 AppleScript 的链接 我也看过NSWorkspace and NSFileManager但我没有找到任何东西 扩展 Bvarious 的 正确 答案 以下是
  • 如何在 Windows 终端中运行可执行文件?

    我想运行一个可执行文件Windows 终端 https github com microsoft terminal 像这样的事情 wt exe myConsoleApp exe 但这只会打开终端本身 让终端成为所有人的默认终端ps1 bat
  • 如何使用Retrofit同时发送图像和文本

    我想使用改造同时发送此 Postdata 和图像文件 PostData and Point public class PostData implements Serializable Expose private String text E
  • Model.find() 不再接受 Mongoose 中的回调

    我目前正在从 Angela Yu 博士的课程中学习 Mongoose 但是由于 mongoose 改变了 find 和其他几个函数的语法 所以它抛出了上述错误 这是 JavaScript 代码 const express require e
  • 使用 iPhone 5 和 Xcode 4.2 的核心图 1.0 - 'CorePlot0' 不包含有效的 pid 编译错误

    我已按照以下安装步骤进行操作应用程序中的核心情节 http code google com p core plot wiki UsingCorePlotInApplications网址 正如主题中所定义的 核心绘图版本是 1 0 已在 Xc
  • 使用 TFS API,如何找到代码审查中的评论?

    我正在尝试找出一种方法来查找有关 TFS2012 中代码审查请求 响应项目的详细信息 我可以通过以下方式查询所有代码审查请求 响应项目 const string TfsUri http mytfsserver 8080 tfs Defaul
  • 通过 TVJS-tvOS 使用 API JSon 调用

    我正在尝试使用 tvOS 并且我有关于处理 json 调用的小问题 我必须通过 API 获取一些数据 假设为了测试我正在调用此链接 http query yahooapis com v1 public yql q select 20item
  • Boost Fusion:将适应的结构类型转换为文本

    给定一个像这样的结构 struct Foo int x int y double z BOOST FUSION ADAPT STRUCT Foo x y z 我想生成一个像这样的字符串 int x int y double z 我已经看到如
  • Android API 33 权限未授予

    所以当我在developer android网站上读到Android 13给权限字段带来了新的变化 我有一个聊天应用程序 我需要在其中拨打电话 打开相机 录制音频 在外部存储中读取和写入 因此 在 SplashScreen 中 我向用户请求