您的位置:首页 > 移动开发 > Android开发

Android 6.0以上 需要运行时申请的权限(二)

2017-05-04 14:13 537 查看
一、 运行时权限分类

Android 6.0 以上的权限变成了运行时权限,在需要使用某个权限的时候必须动态去申请使用,直接访问直接导致app崩溃!权限分为一般权限和危险权限两种,一般权限跟以前一样在AndroidManifest声明,危险权限需要开发者在代码中手动的动态申请.

危险权限包含:传感器、日历、摄像头、通讯录、地理位置、麦克风、电话、短信、存储空间,具体见下图:




危险权限列表

除上面的危险权限之外的权限即为一般权限(普通权限)。

二、程序中申请权限



1.清单文件中配置相应权限


<!-- 读联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- 写联系人权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 拨号权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 读短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" />
<!-- 发短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 读手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />




2.检测是否具有某些权限




/**
* Android 6.0及以上 检测是否具有某些权限
* */

public boolean hasAndroidPermission(String permission){
if(ContextCompat.checkSelfPermission(MainActivity.this,permission)== PackageManager.PERMISSION_GRANTED){
return true;
}else{
return  false;
}
}


onCreate方法中调用(调用处可随意)


boolean has=hasAndroidPermission(SEND_SMS);




3.没有相应权限要请求相应权限


String [] strings=new String[]{SEND_SMS,CALL_PHONE,READ_CONTACTS};
requestAndroidPermission(0,strings);



/**
* Android 6.0及以上 申请某些权限
* */

public void requestAndroidPermission(int code,String []permission){
ActivityCompat.requestPermissions(MainActivity.this,permission,code);
}




4.请求权限后回调方法




/**
* Android 6.0及以上 处理申请权限结果
* */

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

Log.d("MainActivity","权限回调!requestCode----:"+requestCode);
Log.d("MainActivity","权限回调!grantResults[0]----:"+grantResults[0]);
Log.d("MainActivity","权限回调!grantResults[1]----:"+grantResults[1]);
Log.d("MainActivity","权限回调!grantResults[2]----:"+grantResults[2]);
Log.d("MainActivity","权限回调!PackageManager.PERMISSION_GRANTED----:"+PackageManager.PERMISSION_GRANTED);
Log.d("MainActivity","权限回调!permissions[0]----:"+permissions[0]);
Log.d("MainActivity","权限回调!permissions[1]----:"+permissions[1]);
Log.d("MainActivity","权限回调!permissions[2]----:"+permissions[2]);

switch(requestCode){
case 0:
if(grantResults.length==3){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){//第一项被同意
Toast.makeText(MainActivity.this,"您赋予了第一项权限!",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"您拒绝了第一项权限!",Toast.LENGTH_LONG).show();
}

if(grantResults[1]==PackageManager.PERMISSION_GRANTED){//第二项被同意
Toast.makeText(MainActivity.this,"您赋予了第二项权限!",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"您拒绝了第二项权限!",Toast.LENGTH_LONG).show();
}

if(grantResults[2]==PackageManager.PERMISSION_GRANTED){//第三项被同意
Toast.makeText(MainActivity.this,"您赋予了第三项权限!",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"您拒绝了第三项权限!",Toast.LENGTH_LONG).show();
}
}
break;
}
}


结果










当然也可以自定义一个Activity然后封装 其他页面涉及到的继承此Activity即可 没必要在所有涉及到的Activity 申请 在回调方法中操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息