1. 程式人生 > >Android之API 23動態獲取許可權完美解決

Android之API 23動態獲取許可權完美解決

首先感謝CSDN給予我們這個共同交流,共同學習的機會。 其次感謝其他大神技術的共享。 下面呢就開始我們的學習之旅啦,開車了。

Android 6.0 相比之前的Android版本有一個很大的不同點,就是動態獲取許可權。今天自己在做拍照功能時,正好遇到這個問題, 順便記錄下在Android 6.0 上如何動態獲取許可權。

1:需要建立,許可權檢查工具類。

public class PermissionsChecker {
    private final Context mContext;

    public PermissionsChecker(Context context) {
        mContext = context.getApplicationContext();
    }

    // 判斷許可權集合
public boolean lacksPermissions(String... permissions) { for (String permission : permissions) { if (lacksPermission(permission)) { return true; } } return false; } // 判斷是否缺少許可權 private boolean lacksPermission(String permission) { return
ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED; } }

2:建立一個許可權授權activity,像之前動態授權,如果使用者不同意授權就會,退出軟體,我這塊呢做了一個彈框,如果拒絕彈出提示,並且點選點選設定可以跳轉到系統許可權設定頁面進行設定,按返回並且,可以回到軟體。

  • 1.執行在6.0裝置,動態確認許可權
    這裡寫圖片描述

2.當用戶點選拒絕,彈出框提示使用者
這裡寫圖片描述

3點選設定進入,系統許可權設定頁面
這裡寫圖片描述

如果這裡使用者沒有設定許可權,返回的話,就會把以上的步驟重新來一遍,如果全部設定許可權之後,返回後直接進入APP。

public class PermissionsActivity extends AppCompatActivity {

    public static final int PERMISSIONS_GRANTED = 0; // 許可權授權
    public static final int PERMISSIONS_DENIED = 1; // 許可權拒絕

    private static final int PERMISSION_REQUEST_CODE = 0; // 系統許可權管理頁面的引數
    private static final String EXTRA_PERMISSIONS =
            "me.chunyu.clwang.permission.extra_permission"; // 許可權引數
    private static final String PACKAGE_URL_SCHEME = "package:"; // 方案

    private PermissionsChecker mChecker; // 許可權檢測器
    private boolean isRequireCheck; // 是否需要系統許可權檢測

    // 啟動當前許可權頁面的公開介面
    public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
        Intent intent = new Intent(activity, PermissionsActivity.class);
        intent.putExtra(EXTRA_PERMISSIONS, permissions);
        ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
            throw new RuntimeException("PermissionsActivity需要使用靜態startActivityForResult方法啟動!");
        }
        setContentView(授權介面的view);

        mChecker = new PermissionsChecker(this);
        isRequireCheck = true;
    }

    @Override protected void onResume() {
        super.onResume();
        if (isRequireCheck) {
            String[] permissions = getPermissions();
            if (mChecker.lacksPermissions(permissions)) {
                requestPermissions(permissions); // 請求許可權
            } else {
                allPermissionsGranted(); // 全部許可權都已獲取
            }
        } else {
            isRequireCheck = true;
        }
    }

    // 返回傳遞的許可權引數
    private String[] getPermissions() {
        return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
    }

    // 請求許可權相容低版本
    private void requestPermissions(String... permissions) {
        ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
    }

    // 全部許可權均已獲取
    private void allPermissionsGranted() {
        setResult(PERMISSIONS_GRANTED);
        finish();
    }

    /**
     * @param requestCode  請求碼
     * @param permissions  許可權
     * @param grantResults 結果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
            isRequireCheck = true;
            allPermissionsGranted();
        } else {
            isRequireCheck = false;
            showMissingPermissionDialog();
        }
    }

    // 所有全部的許可權
    private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                return false;
            }
        }
        return true;
    }

    // 顯示缺失許可權提示
    private void showMissingPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
        builder.setTitle("提示");
        builder.setMessage("當前應用缺少必要許可權。請點選設定-許可權-開啟所有許可權。最後點選兩次後退按鈕,即可返回。");

        // 拒絕, 退出應用
        builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                setResult(PERMISSIONS_DENIED);
                finish();
            }
        });

        builder.setPositiveButton("設定", new DialogInterface.OnClickListener() {
            @Override public void onClick(DialogInterface dialog, int which) {
                startAppSettings();
            }
        });

        builder.show();
    }

    // 啟動應用的設定
    private void startAppSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
        startActivity(intent);
    }
}

3:現在是在所需許可權的Activity的加入的程式碼

//這些許可權呢,是在所需的Activity建立陣列並寫入(在manifests中一定要加入對應許可權否則會報錯)
    static final String[] PERMISSIONS = new String[]{
            Manifest.permission.CAMERA
    };
      @Override 
    protected void onResume() {
        super.onResume();

        // 缺少許可權時, 進入許可權配置頁面
        if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
            startPermissionsActivity();
        }
    }
      //開啟上面有彈框的activity
 private void startPermissionsActivity() {  PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
    }

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 拒絕時,程式退出
        if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
            finish();
        }
    }

大家在使用以下許可權過程,一定要記得動態獲取。
這裡寫圖片描述

今天就到這裡,有什麼不足,大家可以儘管評論在下方。 謝謝大家的支援。