在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()

Posted

技术标签:

【中文标题】在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()【英文标题】:onRequestPermissionsResult() is never called in FragmentActivity 【发布时间】:2017-01-12 04:27:30 【问题描述】:

我正在尝试实现运行时权限,但是当FragmentActivity 收到onRequestPermissionResult() 时出现了一些问题。 checkPermissions() 方法工作得很好,但在用户允许或拒绝权限后永远不会调用 onRequestPermissionResult()

当系统对话框显示请求权限时,MyActivity.onDestroy() 永远不会被调用。和这个问题有关吗?

我已经尝试关注 this one 和 another one ,但我想我错过了一些东西。

我的设备是 Nexus 5X (android 6.0),目标 SDK 版本是 23。 最低支持 SDK 版本为 15。 当然,我在AndroidManifest.xml 中写了所需的权限,并在 build.gradle 中添加了 v23 支持库。

这是我的代码:

public class MyActivity extends FragmentActivity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
        checkPermissions();
    

    private void checkPermissions()
        String[] dangerousPermissions = 
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.GET_ACCOUNTS,
                Manifest.permission.WRITE_EXTERNAL_STORAGE, 
                Manifest.permission.RECORD_AUDIO
        ;

        for(String permission : dangerousPermissions)
            if (!hasPermission(permission)) 
                Log.e("permission.debug", "need to grant " + permission);
                ActivityCompat.requestPermissions(this, dangerousPermissions, 4);
            
        
    

    public boolean hasPermission(String permission)
        return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
    

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        Log.d("permission.debug", " request code " + requestCode);
        for (int i = 0; i < permissions.length; i++) 
            if (grantResults[i] == 0 && Manifest.permission.READ_PHONE_STATE.equals(permissions[i])) 
                initiate();
            
        
    

这是我的代码的日志:

E/permission.debug: need to grant android.permission.READ_PHONE_STATE
E/permission.debug: need to grant android.permission.GET_ACCOUNTS
E/permission.debug: need to grant android.permission.WRITE_EXTERNAL_STORAGE
E/permission.debug: need to grant android.permission.RECORD_AUDIO

谢谢。

【问题讨论】:

你能分享你的logcat吗? 我试图为这段代码获取一些日志,没有错误或警告。这很奇怪。 你可以在这个link找到答案 【参考方案1】:

尝试直接调用 requestPermissions 而不是 ActivityCompat.requestPermissions。如下所示

if (checkNeededPermissions.size() > 0) 
    Log.d(TAG, "Checking permissions");
    requestPermissions(this, dangerousPermissions, 4);

编辑

我没有看到您在哪里定义了列表 checkNeededPermissions。可以请你在里面像上面那样写一个日志

【讨论】:

不幸的是,minSdkVersion 是15。所以我必须使用ActivityCompat.requestPermissions(). @EugeneKim 您使用 FragmentActivity 的任何原因? @EugeneKim 我已经编辑了上面的答案,请检查并尝试一次。并分享你的 logcat 对不起,我省略了代码的细节。我编辑了我的问题并附加了日志以检查权限。 @gaurav4sarma @EugeneKim 运行时权限仅适用于 sdK 23 那么你为什么要为你的 minSdkVersion 15 烦恼呢?【参考方案2】:

我刚刚找到solution。

当您在AndroidManifest.xml 中使用noHistory 属性声明一个活动时,当活动从屏幕上消失时,它将删除您的活动任务。

要接收onRequestPermissionResult()回调,必须保证Activity恢复。

【讨论】:

【参考方案3】:

有同样的问题。通过在调用ActivityCompat.requestPermissions

时调用 MyActivity.this 而不是 this 来修复它

【讨论】:

以上是关于在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的完成处理程序永远不会被调用?

带有redis的节点js没有返回给调用者

实时更新你永远都不会想到上了考场会犯什么样的**错误——汇总

控制台应用程序中 Observable 的 LastAsync() 死锁

Mongoose - 查询 exec() 永远不会在模型方法中解析

onRequestPermissionsResult 永远不会在片段中被调用 [重复]