android 6.0权限全面详细分析和解决方案

 

1、Android6.0规定的危险权限危险权限android

 

Permission Group Permissions
android.permission-group.CALENDAR
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
  • android.permission.CAMERA
android.permission-group.CONTACTS
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.GET_ACCOUNTS
android.permission-group.LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
  • android.permission.BODY_SENSORS
android.permission-group.SMS
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

 

2、假如在App中须要进行拨打电话的操做,当点击按钮,直接拨出一个电话ide

 

代码以下:ui

 this

1 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
2 startActivity(intent);

可是若是你的编译版本是23或者以上,那么Android Studio就会报出一个错误spa

 

 若是咱们直接对这个错误进行自动修复,会在startActivity方法以前增长一段代码用于权限检查,若是当前没有赋予该权限,则直接return结束方法:code

 1 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
 2       // TODO: Consider calling
 3       //    ActivityCompat#requestPermissions
 4       // here to request the missing permissions, and then overriding
 5       //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
 6       //                                          int[] grantResults)
 7       // to handle the case where the user grants the permission. See the documentation
 8       // for ActivityCompat#requestPermissions for more details.
 9       return;
10 }

由于i是直接return 打电话功能没有实现blog

ci

咱们能够在点击按钮的时候,直接向用户请求权限,能够使用下面的方法,在上段代码return前加上次句:get

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUESTCODE);

注:第三个参数为请求码,整型it

 

效果以下

 

容许:之后再也不弹出请求框,直接容许应用得到该权限

拒绝:下次须要时会从新弹出,直到用户选择容许,不然会不断出现

勾选再也不询问+拒绝之后不会再弹出,而且默认拒绝权限请求,也就是说,应用不再能得到这个权限,除非用户主动进入应用设置中从新受权。

 

 

为了提升用户体验,咱们能够本身在出现上述的第三种状况时再次点击窗口时咱们跳转到应用设置界面

 

当咱们调用requestPermissions方法的时候,不管成功与否,都会将结果回调给Activity中的onRequestPermissionsResult方法中,咱们能够经过重写这个方法来处理

代码以下:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (!shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
                    AskForPermission();
                }
            }
        }
    }

private void AskForPermission() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("须要赋予通话的权限,不开启将没法正常工做!");
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.setData(Uri.parse("package:" + getPackageName())); // 根据包名打开对应的设置界面
                startActivity(intent);
            }
        });
        builder.create().show();
    }

咱们能够在用户勾选和点击拒绝时弹出提示,来解释权限的必要性,并转到应用设置界面:

代码以下:

 1 @Override
 2     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
 3                                            @NonNull int[] grantResults) {
 4         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 5         /*if (requestCode == 1) {
 6             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 7                 if (!shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
 8                     AskForPermission();
 9                 }
10             }
11         }*/
12         if (requestCode == 1) {
13             if (permissions[0].equals(Manifest.permission.CALL_PHONE)
14                     && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
15             } else {
16                 //用户不一样意,向用户展现该权限做用
17                 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
18                     AlertDialog dialog = new AlertDialog.Builder(this)
19                             .setMessage("须要赋予通话的权限,不开启将没法正常工做!")
20                             .setPositiveButton("设置", new DialogInterface.OnClickListener() {
21                                 @Override
22                                 public void onClick(DialogInterface dialog, int which) {
23                                     Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
24                                     intent.setData(Uri.parse("package:" + getPackageName())); // 根据包名打开对应的设置界面
25                                     startActivity(intent);
26                                 }
27                             })
28                             .setNegativeButton("取消", new DialogInterface.OnClickListener() {
29                                 @Override
30                                 public void onClick(DialogInterface dialog, int which) {
31 
32                                 }
33                             }).create();
34                     dialog.show();
35                     return;
36                 }
37             }
38         }
39     }
40 
41     private void AskForPermission() {
42         AlertDialog.Builder builder = new AlertDialog.Builder(this);
43         builder.setTitle("须要权限");
44         builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
45             @Override
46             public void onClick(DialogInterface dialog, int which) {
47 
48             }
49         });
50         builder.setPositiveButton("权限设置", new DialogInterface.OnClickListener() {
51             @Override
52             public void onClick(DialogInterface dialog, int which) {
53                 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
54                 intent.setData(Uri.parse("package:" + getPackageName())); // 根据包名打开对应的设置界面
55                 startActivity(intent);
56             }
57         });
58         builder.create().show();
59     }

注:我用的请求码为 1

相关文章
相关标签/搜索