不要让昨天 占据你的今天 夏午晴天

夏午晴天

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

 

一、Android6.0规定的危险权限危险权限

 

Permission GroupPermissions
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

 

二、假如在App中需要进行拨打电话的操作,当点击按钮,直接拨出一个电话

 

代码如下:

 

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

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

 

 如果我们直接对这个错误进行自动修复,会在startActivity方法之前增加一段代码用于权限检查,如果当前没有赋予该权限,则直接return结束方法:

 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 打电话功能没有实现

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

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

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

 

效果如下

 

允许:以后不再弹出请求框,直接允许应用获得该权限

拒绝:下次需要时会重新弹出,直到用户选择允许,否则会不断出现

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

 

 

为了提高用户体验,我们可以自己在出现上述的第三种情况时再次点击窗口时我们跳转到应用设置界面

 

当我们调用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

 

posted on 2017-12-01 17:35  夏晴天  阅读(2154)  评论(0编辑  收藏  举报

导航

Live2D