Android6.0後動態權限

permissions

在6.0時代以前,程序所需的權限都在安裝時全部確認後安裝成功,這就出現即使應用不到的權限也要在安裝時全部授權。

在6.0時代,可以在程序運行時獲取相關權限,展開一個對話框詢問是否授予該程序相應權限。

從第二次開始運行的時候,會增加一個選項框,“以後不再詢問”,如果選擇了這個選項,那麼以後程序不會再詢問是否授予權限了。

要確定您的應用是否已被授予權限,請調用新增的 checkSelfPermission() 方法。要請求權限,請調用新增的requestPermissions() 方法。

    
{
    /**
     * 方法返回值爲PackageManager.PERMISSION_DENIED
     * 或者PackageManager.PERMISSION_GRANTED。
     * 當返回DENIED就需要進行申請授權了
     * 判斷是否有這個權限
     */
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);

    if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(MainActivity.this, "已被授予權限,continue", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(MainActivity.this, "未權限,try request", Toast.LENGTH_SHORT).show();

        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.WRITE_CALENDAR)) {
            // 在這裏做需要權限的說明,根據需要來做  判斷是否需要自己定義請求權限的說明窗口
            Log.i("TAG","SSSS"+ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.WRITE_CALENDAR));
            Toast.makeText(MainActivity.this, "需要此權限纔可在6.0及以上系統拍照", Toast.LENGTH_SHORT).show();
        } else {
            // 申請權限
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR},
                    1001);
        }
    }
}
  /**
     * 申請權限回調
     * 在申請權限後自動執行此方法
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1001: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(MainActivity.this, "權限,apply sucess", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "權限,apply fail", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

以上爲動態權限申請方法,說一下在申請權限的時候遇到的問題:
由於國產機型不適配的問題,(比如小米),在第一次申請拒絕後,第二次申請時
shouldShowRequestPermissionRationale不會返回true,並且會回調申請失敗,也就是說在第一次決絕後默認勾選了不再提示,並且即使再次申請權限,也不會彈出申請權限的框!

這個問題比較致命,不能給用戶授權失敗的說明,解決辦法是用開源的申請權限的框架。 
這個開源庫名叫AndPermission:https://github.com/yanzhenjie/AndPermission,經過我的實踐是完全解決了上述問題,推薦大家使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章