1. 程式人生 > >android 許可權動態申請

android 許可權動態申請

專案需求中遇到的 

問題來自於使用者會手動禁止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() {
        new 
AlertDialog.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);
}