在Android的上百多种权限里,普通权限不用记,只需要记住危险权限;危险权限一共9组24个:
注意 : 判断用户是否选中不再询问::
ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA) 为false时用户选中了不再询问
if(!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
Toast.makeText(this, "勾选了不再询问", Toast.LENGTH_SHORT).show();这里可以提示用户如何手动打开权限,也可以跳转到相关权限页面}
这里做一个打电话的demo:
1:点击按钮判断用户是否授权:
btn.setOnClickListener(new View.OnClickListener() {
@Overridepublic void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.CALL_PHONE}, 1);}else {
call();}}});
检查权限 是用的ContextCompat.checkSelfPermission()方法,它接收两个参数,一参:context,二参:具体的权限名,得到的返回值与PackageManager.PERMISSION_GRANTED作比较,如果想等就说明已经授权;
反之不相等,需要通过ActivityCompat.requestPermissions()方法来申请权限,它接收三个参数,一参:context; 二参:string数组 把我们需要申请的权限名放里边,可以放多个;三参:传入唯一的请求码(与onRequestPermissionsResult的第一个参数相对应);
ActivityCompat.requestPermissions()方法会弹出一个对话框,无论用户选择确定和拒绝都会回调下面的onRequestPermissionsResult()方法:
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
call();}else {
Toast.makeText(this, "You denied the permission!", Toast.LENGTH_SHORT).show();}}}
onRequestPermissionsResult()方法
一参:是与ActivityCompat.requestPermissions()方法的第三个参数相对应的唯一请求码;
二参:权限名数组
三参:封装 授权的结果
下面是Call()方法的具体代码:
private void call() {
try {
Intent intent=new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);}catch (SecurityException e){
e.printStackTrace();}}
这样就完成了!在6.0及以上的android手机上运行此程序,点击按钮会触发权限,同意便会拨打电话,拒绝也不会影响程序运行。