Android之权限问题
android6.0(即Android M)及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请, 危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了, 没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。
由于以前4.2的版本用的比较多这个一直没有留意这个。最近改用6.0,7.0,8.0了所以就记录下。
关于权限的动态获取先说下简单的思路。
第一步:判断当前系统的版本如果低于6.0那还是用老办法在清单文件里面申明即(AndroidManiferst.xml里面声明)。
第二步:判断当前需要的权限是否已经获取,如果没有获取则动态获取,否则就可以不做处理。
第三步:动态获取权限。即弹窗提示用户获取该权限的作用,由用户选择是否给予该权限。
第四步:相应回调。
代码如下
/*AndroidManifest.xml*/
<uses-permission android:name="android.permission.CALENDAR"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
core:
String[] permission = {Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR};//需要的权限
String title = "日历权限不可用";
String content = "由于应用需要或者当前日历设置相应属性,所以需要日历相关权限;\n否则,您将无法正常使用日历功能";
initPermission(permission,title,content);
/*初始化应用权限*/
private void initPermission(String[] permission, String title, String content) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
List<String>permissionList = new ArrayList<>();
for(int i = 0;i<permission.length;i++){
if(ContextCompat.checkSelfPermission(this,permission[i]) != PackageManager.PERMISSION_GRANTED ){
permissionList.add(permission[i]);
}
}
if(!permissionList.isEmpty()){
showDialogTipUserRequestPermisson(permissionList,title,content);
}
}
}
/*提示用户正在申请问题*/
private void showDialogTipUserRequestPermisson(final List<String> permissionList, String title, String content) {
new AlertDialog.Builder(this).setTitle(title).setMessage(content).setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startRequestPermission(permissionList);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
finish();
}
}).setCancelable(false).show();
}
/*权限申请*/
private void startRequestPermission(List<String> permissionList) {
if(!permissionList.isEmpty()){
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this,permissions,1010);
}
}
/*获取权限回调方法*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1010){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (grantResults.length > 0){
for (int i = 0; i< grantResults.length;i++){
int grantResult = grantResults[i];
switch (grantResult){
case PackageManager.PERMISSION_GRANTED://权限被授予
Toast.makeText(this,permissions[i]+"权限获取成功",Toast.LENGTH_SHORT).show();
break;
case PackageManager.PERMISSION_DENIED://权限被拒绝
Toast.makeText(this,permissions[i]+"权限获取失败",Toast.LENGTH_SHORT).show();
finish();
break;
}
}
}
}
}
}