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

Android 動態申請許可權

前言

      Android M (6.0) 或以上的裝置,在使用涉及隱私的安全許可權時,需要動態申請,也就是targetSdkVersion大於等於23版本的需要在需要使用的時候申請對應的許可權。

需要動態申請的許可權

      在這裡盜一下圖

程式碼示例

   首先我們必須在AndroidManifest.xml檔案去申請許可權

    <!--用於進行網路定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--用於訪問GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

     這裡嘗試獲取定位許可權

    // 動態申請定位許可權的請求碼
    public static final int LOCATION_PERMISSION_REQUEST_CODE = 200;

    // 動態申請許可權的程式碼,應當放在 Activity 的 onCreate(), onStart(), onResume()方法中
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
        }

   當你嘗試去獲取某種許可權的時候又想再根據是否獲取了對應許可權做出對應的邏輯操作,你可以重寫 Activity 中的 onRequestPermissionsResult 方法去做判斷

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            // requestCode即所宣告的許可權獲取碼,在requestPermissions時傳入
            case LOCATION_PERMISSION_REQUEST_CODE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 獲取到許可權,作相應處理(呼叫定位SDK應當確保相關許可權均被授權,否則可能引起定位失敗)
                    Toast.makeText(MainActivity.this, "已經獲得許可權", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

    可以看到之前定義的 LOCATION_PERMISSION_REQUEST_CODE 又派上用場了。

    看一下 requestPermissions 這個方法的引數

    /**
     *  請求許可權方法
     * @param activity:應該在需要許可權的對應的 Activity 申請許可權,也可以在 App 的入口類申請
     * @param permissions:需要申請的許可權,是一個 String 型別的陣列
     * @param requestCode:許可權請求碼,自定義
     */
    public static void requestPermissions(final @NonNull Activity activity,
                                          final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
        ...
    }