一、Android6.0規定的危險權限危險權限
Permission Group | Permissions |
---|---|
android.permission-group.CALENDAR |
|
android.permission-group.CAMERA |
|
android.permission-group.CONTACTS |
|
android.permission-group.LOCATION |
|
android.permission-group.MICROPHONE |
|
android.permission-group.PHONE |
|
android.permission-group.SENSORS |
|
android.permission-group.SMS |
|
android.permission-group.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