尝试获取 READ_PHONE_STATE 权限时未显示 Android 权限对话框

Posted

技术标签:

【中文标题】尝试获取 READ_PHONE_STATE 权限时未显示 Android 权限对话框【英文标题】:Android permissions dialog not being show when trying to get READ_PHONE_STATE permissions 【发布时间】:2020-03-05 05:04:51 【问题描述】:

我正在尝试使用 READ_PHONE_STATE 权限,因此(它们被视为危险权限)我必须检查是否已授予,如果未授予则请求权限。我的检查 (ContextCompat.checkSelfPermission) 返回 false,所以我运行 ActivityCompat.requestPermissions。应该显示的对话框没有出现。

我的目标是 API 28,所以我尝试添加 READ_CALL_LOG 权限,这也被认为是危险的,但也没有被授予。

            var selfPermission = ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.READ_CALL_LOG)

            if (selfPermission != PackageManager.PERMISSION_GRANTED)
            
                val perms = arrayOf(android.Manifest.permission.READ_CALL_LOG)

                ActivityCompat.requestPermissions(this, perms,
                    Constants.PERMISSION_READ_CALL_LOG_REQUEST)
                selfPermission = ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.READ_CALL_LOG)
            

            if (selfPermission != PackageManager.PERMISSION_GRANTED)
            
                return
            

            selfPermission = ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.READ_PHONE_STATE)

            if (selfPermission != PackageManager.PERMISSION_GRANTED)
            
                val perms = arrayOf(android.Manifest.permission.READ_PHONE_STATE)

                ActivityCompat.requestPermissions(this, perms,
                    Constants.PERMISSION_READ_PHONE_REQUEST)
                selfPermission = ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.READ_PHONE_STATE)
            

            if (selfPermission != PackageManager.PERMISSION_GRANTED)
            
                return
            

【问题讨论】:

【参考方案1】:

我也遇到了这个问题,就我而言,这是由于我正在运行 requestPermission 调用的线程,它不是 UI 线程(Java 执行程序)。

所以要解决这个问题,你应该确保你在主线程上(Java 版本):

Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() 
    @Override
    public void run() 
        ActivityCompat.requestPermissions(context, perms,
                Constants.PERMISSION_READ_CALL_LOG_REQUEST);
    
);

【讨论】:

以上是关于尝试获取 READ_PHONE_STATE 权限时未显示 Android 权限对话框的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在请求 READ_PHONE_STATE 权限时崩溃并出现 IllegalStateException

READ_PHONE_STATE 的权限被拒绝 [重复]

为啥添加了 READ_PHONE_STATE 权限?

为啥添加了 READ_PHONE_STATE 权限?

Unity Android READ_PHONE_STATE 权限

警告您的 Apk 正在使用需要隐私政策的权限:(android.permission.READ_PHONE_STATE)