首頁 > 軟體

Android開發之permission動態許可權獲取詳解

2022-08-15 14:01:57

Android開發之permission動態許可權獲取,供大家參考,具體內容如下

說明

  • Android 6.0 (API 23) 之前應用的許可權在安裝時全部授予,執行時應用不再需要詢問使用者。在 Android 6.0 或更高版本對許可權進行了分類,對某些涉及到使用者隱私的許可權可在執行時根據使用者的需要動態授予。這樣就不需要在安裝時被強迫同意某些許可權。
  • 裝置系統是 Android 6.0 (API 23) 或更高版本,並且應用的 targetSdkVersion 是 23 或更高版本,則針對在 AndroidManifest.xml 中宣告的危險許可權,在執行時還需要動態請求使用者授權
  • 動態許可權請求相關操作的API封裝在在android.support.v4包中,發起請求許可權的Activity需要直接或間接繼承android.support.v4.app.FragmentActivity。
  • 也可以在直接或間接繼承 android.support.v4.app.Fragment 的 Fragment 中發起許可權請求。
package com.xiets.demoapp;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
     
    /**
     * 一鍵備份通訊錄
     *
     * @author xietansheng
     */
    public class MainActivity extends AppCompatActivity {
     
        private static final int MY_PERMISSION_REQUEST_CODE = 10000;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
     
        /**
         * 點選按鈕,將通訊錄備份儲存到外部記憶體備。
         *
         * 需要3個許可權(都是危險許可權):
         *      1. 讀取通訊錄許可權;
         *      2. 讀取外部記憶體許可權;
         *      3. 寫入外部記憶體許可權.
         */
        public void click(View view) {
            /**
             * 第 1 步: 檢查是否有相應的許可權,根據自己需求,進行新增相應的許可權
             */
            boolean isAllGranted = checkPermissionAllGranted(
                    new String[] {
                            Manifest.permission.READ_CONTACTS,
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    }
            );
            // 如果這3個許可權全都擁有, 則直接執行備份程式碼
            if (isAllGranted) {
                doBackup();
                return;
            }
     
            /**
             * 第 2 步: 請求許可權
             */
            // 一次請求多個許可權, 如果其他有許可權是已經授予的將會自動忽略掉
            ActivityCompat.requestPermissions(
                    this,
                    new String[] {
                            Manifest.permission.READ_CONTACTS,
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    },
                    MY_PERMISSION_REQUEST_CODE
            );
        }
     
        /**
         * 檢查是否擁有指定的所有許可權
         */
        private boolean checkPermissionAllGranted(String[] permissions) {
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                    // 只要有一個許可權沒有被授予, 則直接返回 false
                    return false;
                }
            }
            return true;
        }
     
        /**
         * 第 3 步: 申請許可權結果返回處理
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
     
            if (requestCode == MY_PERMISSION_REQUEST_CODE) {
                boolean isAllGranted = true;
     
                // 判斷是否所有的許可權都已經授予了
                for (int grant : grantResults) {
                    if (grant != PackageManager.PERMISSION_GRANTED) {
                        isAllGranted = false;
                        break;
                    }
                }
     
                if (isAllGranted) {
                    // 如果所有的許可權都授予了, 則執行備份程式碼
                    doBackup();
     
                } else {
                    // 彈出對話方塊告訴使用者需要許可權的原因, 並引導使用者去應用許可權管理中手動開啟許可權按鈕
                    openAppDetails();
                }
            }
        }
     
        /**
         * 第 4 步: 備份通訊錄操作
         */
        private void doBackup() {
            // 本文主旨是講解如果動態申請許可權, 具體備份程式碼不再展示, 就假裝備份一下
            Toast.makeText(this, "正在備份通訊錄...", Toast.LENGTH_SHORT).show();
        }
     
        /**
         * 開啟 APP 的詳情設定
         */
        private void openAppDetails() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("備份通訊錄需要存取 「通訊錄」 和 「外部記憶體」,請到 「應用資訊 -> 許可權」 中授予!");
            builder.setPositiveButton("去手動授權", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                    intent.setData(Uri.parse("package:" + getPackageName()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(intent);
                }
            });
            builder.setNegativeButton("取消", null);
            builder.show();
        }
     
    }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com