android 6.0權限全面詳細分析和解決方案


 

一、Android6.0規定的危險權限危險權限

 

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

 

二、假如在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM