android 許可權動態申請
阿新 • • 發佈:2019-01-10
專案需求中遇到的
問題來自於使用者會手動禁止app的許可權,所以在使用某些許可權的時候要判斷一下當前app是否授權
直接程式碼記錄
// 要申請的許可權 private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};這個是讀寫許可權
判斷是否有許可權
private boolean quanxian(){ // 版本判斷。當手機系統大於 23 時,才有必要去判斷許可權是否獲取 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 檢查該許可權是否已經獲取int i = ContextCompat.checkSelfPermission(this, permissions[0]); // 許可權是否已經 授權 GRANTED---授權 DINIED---拒絕 if (i != PackageManager.PERMISSION_GRANTED) { // 如果沒有授予該許可權,就去提示使用者請求 return false; } } return true; }
沒有許可權彈出
// 提示使用者該請求許可權的彈出框 private void showDialogTipUserRequestPermission() { newAlertDialog.Builder(this) .setTitle("儲存許可權不可用") .setMessage("需要使用儲存許可權,您是否允許?(禁止後將無法選擇上傳圖片)") .setPositiveButton("立即開啟", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startRequestPermission();} }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); makeToast("使用者取消授權"); // finish(); } }).setCancelable(false).show(); }
使用者點選確定,開始請求
// 開始提交請求許可權 private void startRequestPermission() { ActivityCompat.requestPermissions(this, permissions, 321); }
在onActivityResult獲取是否授權
if (requestCode == 123) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 檢查該許可權是否已經獲取 int i = ContextCompat.checkSelfPermission(this, permissions[0]); // 許可權是否已經 授權 GRANTED---授權 DINIED---拒絕 if (i != PackageManager.PERMISSION_GRANTED) { // 提示使用者應該去應用設定介面手動開啟許可權 showDialogTipUserGoToAppSettting(); } else { if (dialog3 != null && dialog3.isShowing()) { dialog3.dismiss(); } Toast.makeText(this, "許可權獲取成功", Toast.LENGTH_SHORT).show(); } } }
// 提示使用者去應用設定介面手動開啟許可權 private void showDialogTipUserGoToAppSettting(){ dialog3 = new AlertDialog.Builder(this) .setTitle("儲存許可權不可用").setMessage("請在-應用設定-許可權-中,允許***使用儲存許可權") .setPositiveButton("立即開啟",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // 跳轉到應用設定介面 goToAppSetting(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).setCancelable(false).show(); } // 跳轉到當前應用的設定介面 private void goToAppSetting() { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 123); }