android 权限常见错误,onRequestPermissionsResult回调不执行问题

Posted itbird01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 权限常见错误,onRequestPermissionsResult回调不执行问题相关的知识,希望对你有一定的参考价值。

今天在调试一个fragment时,申请到权限,然后在权限回调里面做相应的dialog提示用户,但是发现一直无弹窗。

话不多说,直接上问题代码

    private void testRxPermissions() 
        ActivityCompat.requestPermissions(this.getActivity(), new String[]Manifest.permission.CAMERA, 100);
    

    @Override
    public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //TODO:dialog展示相关代码
    

问题现象: dialog展示相关代码一直未执行,最后打了断点,发现onRequestPermissionsResult函数根本没有进来

问题原因:

问题根因在于,我们调用的是ActivityCompat.requestPermissions,而点进去看一下这个方法的源码

大家知道原因了吧,所以回调会直接到activity的onRequestPermissionsResult方法中。

问题解决方法:

既然知道了原因,那么解决方法就对应的有两个

解决方法1

最直接的方法,就是统一在fragment所属的activity onRequestPermissionsResult中,处理权限申请回调

解决方法2

既然知道了问题原因,那么我们也可以直接调用fragment中的requestPermissions方法,保证onRequestPermissionsResult回调在fragment中

private void testRxPermissions() 
        requestPermissions(this, new String[]Manifest.permission.CAMERA, 100);
    

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

解决办法3

仔细看fragment api注释,发现已经requestPermissions废弃,官方建议使用registerForActivityResult

Deprecated
use registerForActivityResult(ActivityResultContract, ActivityResultCallback) passing in a androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions object for the ActivityResultContract and handling the result in the callback.
官方建议使用registerForActivityResult

 ActivityResultLauncher activityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<Boolean>() 
            @Override
            public void onActivityResult(Boolean isGranted) 
                if (isGranted) 
                    //做后续操作
                 else 
                    // 权限被拒绝就要提醒
                

            
        );
        activityResultLauncher.launch(Manifest.permission.CAMERA);

总结

建议使用方法3,毕竟是官方建议的,但是如果简单而且防止出错的话,方法1的确是最简单的。

Mysql 启动失败常见错误

各位可以按照顺序逐条拍错。

mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql-master/data/mysql.pid) 的解决方法:

1、可能是/opt/mysql-master/data/数据目录mysql用户没有权限(修改数据目录的权限)

   解决方法 :给予权限,执行  "chown -R mysql.mysql /opt/mysql-master/data"  然后重新启动mysqld

 

2、可能进程里已经存在mysql进程

   解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9  进程号”杀死,然后重新启动mysqld!

 

3、可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。

   解决方法:去mysql的二进制日志目录看看,如果存在mysql-binlog.index,就赶快把它删除掉吧

 

4、mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,请打开这个文件查看在[mysqld]下有没有指定数据目录(datadir)。

   解决方法:请在[mysqld]下设置这一行:datadir = /opt/mysql-master/data

 

5、skip-federated字段问题

   解决方法:检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。

 

6、错误日志目录不存在

   解决方法:使用“chown” “chmod”命令赋予mysql所有者及权限

 

7、selinux惹的祸,如果是centos系统,默认会开启selinux

   解决方法:先临时改为警告模式:[[email protected] php]# setenforce 0

             然后打开/etc/sysconfig/selinux,把SELINUX=enforcing改为SELINUX=disabled

8、可以试着把mysql.cnf默认文件开启,排查是不是配置文件的错误。

常见配置错误有:

查看配置文件/etc/my.cnf里有没有innodb_buffer_pool_size这个参数

innodb_buffer_pool_size:主要作用是缓存innodb表的索引,数据,插入数据时的缓冲;

                                            默认值:128M;

                                            专用mysql服务器设置此值的大小: 系统内存的70%-80%最佳。

                                            如果你的系统内存不大,查看这个参数,把它的值设置小一点吧

温馨提示:记得开启mysql错误日志,方便自己排错。

vim /etc/my.cnf    各位可以根据自己的my.cnf文件编辑

[mysql_safe]

log-error = /data/mysql-master/logs/error.log

 

以上是关于android 权限常见错误,onRequestPermissionsResult回调不执行问题的主要内容,如果未能解决你的问题,请参考以下文章

webapi权限常见错误

修改Oracle权限的SQL及常见错误

权限未在android中显示(相机权限)没有错误

Android位置权限错误

Android检查位置权限错误

Android开发之Intent.Action Android中Intent的各种常见作用【转】