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回调不执行问题的主要内容,如果未能解决你的问题,请参考以下文章