android的权限在23以下的版本中自动授权,而这个版本及以上需要用户手动授权。这对用户隐私来说当然有好处,比如我不想app获取我的位置。对开发来说,虽然麻烦是避免不了了,但是也不是很蛋疼。
对于权限问题,系统分为一般权限和危险权限。一般权限在xml中申明就行,而危险权限除了申明外,还需要额外动态申请(运行时)。
具体的权限分类可以看这:权限知识整理
实际开发中遇到的问题:请求读写,系统设置,相机等(全奔溃~)
开发中强烈建议不要等项目做得差不多再去解决权限的问题,而是遇到需要动态申请权限的时候就去解决。
解决办法(一步一步进阶):
1:可以自己在需要权限时申请权限:
这里以请求打电话为例子。
在点击拨打按钮时,在监听中加入以下代码。
//检查权限,PERMISSION_GRANTED代表获得权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE);
} else {
//有权限则执行拨打电话
call();
}
没有权限,然后提出权限申请后,会走下面这个方法。该方法需要重写,在Fragment与Activity里都有。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case REQUEST_CODE:
if(grantResults.length >0 &&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//用户同意授权
callPhone();
}else{
//用户拒绝授权,在这里可以做一些别的,比如不进入下一页面或者提示等等
}
break;
}
}
如果用户没有授权,并且再次点击的时候哦多尅(怎么办)?做个简单的用户提示吧。
public void call(View v) {
//检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限.
if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)){
//已经禁止提示了
Toast.makeText(MainActivity.this, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
}else{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE);
}
} else {
callPhone();
}
}
谷歌推荐的流程是这样的(权限是否已经授予,没有则申请):
int checkCameraPermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA);
if (checkCameraPermission != PackageManager.PERMISSION_GRANTED) {
/*
用户未授权,谷歌推荐标准流程
*/
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.CAMERA)) {
//Show an expanation to the user asynchronously.说明请求原因,之前被用户拒绝过
showRequestPermissionRationale("请授权", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
//点击确定时再次申请权限
requestPermissions(new String[] { Manifest.permission.CAMERA},REQUEST_PERMISSION_CAMERA);
}
});
} else {
//第一次申请时,请求授权
requestPermissions(new String[] { Manifest.permission.CAMERA },REQUEST_PERMISSION_CAMERA);
}
}
以上就是对权限最简单的申请与处理方式,其实很简单。但总不能对应用中每个需要申请权限的地方写这么多相同的代码吧。
那就封装吧。
直接用人家的吧, GitHub PermissionGen,里面有使用方法和说明。源码还没研究过,以后再说。