這只是我在學Android過程中對于所學知識的鞏固和方便日后查詢的學習筆記,能幫助到有需要的和我一樣的初學者就更好了
android6.0引入秃踩,為避免軟件開發(fā)方惡意申請權限,引入運行時權限在需要權限時申請并由用戶決定是否授權业筏。即使不予授權也只會影響該應用個別功能而不影響其他功能
需要申請的危險權限
GroupName | PermissionName |
---|---|
CALENDAR | READ_CALENDAR WRIET_CALENDER |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS WRITE_CONTACTS ;GET_CPNTACTS |
LOCATION | ACESS_FINAL_LOCATION ACESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE CALL_PHONE READ_ALL_LOG WRITE_ALL_LOG ADD_VOICEMAIL USE_SIP |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE WRITE_EXRETNAL_STORAGE |
其余的權限在AndrodiManifest.xml中<usue-permission ....>即可
運行時申請權限
以MainActivity中申請CALL_PHONE為例
if(ContextCompat.checkselfpermission(MainActivity.this ,Manifest.permission.CALL_PHONE))
!=PackageManager.PERMISSION_GRANTED){
//自查權限是否與已申請
ActivityCompat.requestPermission(MainActivity.this , new String[]{Manifest.permission.CALL_PHONE} ,1);
//三個參數(shù)為context憔杨、權限名字字符串數(shù)組、請求碼(可自定但要唯一)
}
彈出的對話框不論選擇了ALLOW還是DENY都會回調以下方法
@override
public void onRequestPermissionResult(int requestCode ,String[] permissions
,int[] grantResults ){
switch(requestCode){
case 1: //前面自定的請求碼
if(grantResules.length()>0&&grantResults[0]==
PackageManager.PERMISSION_GRANTER){
//表示通過申請蒜胖,可執(zhí)行接下來的邏輯
}else{
//添加申請未通過的回執(zhí)消别,例如Toast
}
break;
default :
break;
}
}
要注意的是,如果該權限所屬的權限組中還有其他權限的話台谢,同意此權限也會同時授權其所屬權限組的其他權限并且用戶不手動關閉的話會一直保持授權
同時申請多個權限
只要先判斷是否已申請通過寻狂,若沒通過則添加至權限名字符串數(shù)組中去申請權限即可
List<String> permissionList=new ArrayList();
//保存要申請的權限名稱的集合
if(ContextCompat.checkselfpermission(MainActivity.this ,Manifest.permission.CALL_PHONE))
!=PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.CALL_PHONE);
}
if(ContextCompat.checkselfpermission(MainActivity.this ,Manifest.permission.READ_PHONE_STATE))
!=PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkselfpermission(MainActivity.this ,Manifest.permission.ACCESS_FINAL_LOCATION))
!=PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINAL_LOCATION);
}
if(!permissionList.isEmpty()){
String[] permissions=permissionList.toArray(new String[permissionList.size()]);
//將保存了權限名字的集合轉為數(shù)組形式
ActivityCompat.requestPermissions(MainActivity.this ,permissions ,1);
}
@override
public void onRequestPermissionResult(int requestCode ,String[] permissions
,int[] grantResults ){
switch(requestCode){
case 1:
if(grantResules.length()>0){
for(int result :grantResults){
if(result!=PackageManager.PERMISSION_GRANTED){
//沒通過申請,添加回執(zhí)例如Toast
}
}
}else{
//通過申請对碌,執(zhí)行所需代碼
}
break;
default:
break;
}
總之就是申請的結果保存在了int[] grantResults中荆虱,不論有多少以此取出和
PackageManager.PERMISSION_GRANTED對比,相同為通過朽们,不同為未通過