说明:
- Android 6.0 开始,涉及危险权限,都需动态申请(即运行时权限处理)
- 所需权限无论是否是危险权限 均需要在清单文件声明
- 在旧的权限管理系统中,权限仅仅在App安装时询问用户一次,用户同意了这些权限
App才能被安装,App一旦安装后后授权不可取消。
查看权限目录:
通过 adb shell 命令
查看危险权限 adb shell pm list permissions -d -g
危险权限目录:
Dangerous Permissions:
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
其余都是普通权限,仅在清单文件中声明一下即可。
简单实例代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
.........
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
.........
//运行时申请权限
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.
WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){//如果没有访问文件的权限
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else{ //
initMediaPlayer();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
switch (requestCode){
case 1:
if (grantResults.length>0 & grantResults[0]==PackageManager.PERMISSION_GRANTED){ //授权成功
initMediaPlayer();
}else{
Toast.makeText(this,"拒绝权限无法使用程序",Toast.LENGTH_SHORT).show();
finish();//关闭所有activity
}
default:
break;
}
}
}
①ContextCompat.checkSelfPermission(context, Manifest.permission.XXX具体权限):用于检查是否有XXX这个权限
②PackageManager.PERMISSION_GRANTED:代表已经授权的权限
当①和②相等,标识XXX已经授权,不相等标识没授权
- public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults),
是ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.XXX,....},int requestCode);
申请结果的回调(不管是否授权成功),结果放在int[] grantResults中(蓝色的参数是需要申请的权限字符串数组)