Android6.0動態擷取許可權

來源:互聯網
上載者:User

標籤:管理   自己   ack   denied   com   選擇   重疊   檢查   over   

   Android6.0採用新的許可權模型,只有在需要許可權的時候,才告知使用者是否授權,是在runtime時候授權,而不是在原來安裝的時候 ,同時預設情況下每次在運行時開啟頁面時候,需要先檢查是否有所需要的許可權申請。這樣的使用者的自主性提高很多,比如使用者可以給APP賦予攝像的許可權,但是可以拒絕記錄裝置位置的許可權,就是怕位置資訊上傳等等。

1.一個簡單的許可權封裝類

   首先定義一個工具類,判斷是否缺少許可權:

 //檢查許可權時,判斷系統的許可權集合    public boolean permissionSet(String... permissions) {        for (String permission : permissions) {            if (isLackPermission(permission)) {//是否添加完全部許可權集合                return true;            }        }        return false;    }    //檢查系統許可權是,判斷當前是否缺少許可權(PERMISSION_DENIED:許可權是否足夠)    private boolean isLackPermission(String permission) {        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;    }

    建立一個baseActivity做封裝

//首先聲明許可權授權    public static final int PERMISSION_DENIEG = 1;//許可權不足,許可權被拒絕的時候    public static final int PERMISSION_REQUEST_CODE = 0;//系統授權管理頁面時的結果參數    public static final String PACKAGE_URL_SCHEME = "package:";//許可權方案    public CheckPermission checkPermission;//檢測權限類別的許可權檢測器    private boolean isrequestCheck = true;//判斷是否需要系統許可權檢測。防止和系統提示框重疊    public abstract int initContentID();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initContentID();        process(savedInstanceState);    }    //顯示對話方塊提示使用者缺少許可權    public void showMissingPermissionDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle(R.string.help);//提示協助        builder.setMessage(R.string.string_help_text);        //如果是拒絕授權,則退出應用        //退出        builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                finish();            }        });        //開啟設定,讓使用者選擇開啟許可權        builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                startAppSettings();//開啟設定            }        });        builder.setCancelable(false);        builder.show();    }    //擷取全部許可權    public boolean hasAllPermissionGranted(int[] grantResults) {        for (int grantResult : grantResults) {            if (grantResult == PackageManager.PERMISSION_DENIED) {                return false;            }        }        return true;    }    //開啟系統應用設定(ACTION_APPLICATION_DETAILS_SETTINGS:系統設定許可權)    public void startAppSettings() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));        startActivity(intent);    }    //請求許可權去相容版本    public void requestPermissions(String... permission) {        ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE);    }    /**     * 用於許可權管理     * 如果全部授權的話,則直接通過進入     * 如果許可權拒絕,缺失許可權時,則使用dialog提示     *     * @param requestCode  請求代碼     * @param permissions  許可權參數     * @param grantResults 結果     */    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (PERMISSION_REQUEST_CODE == requestCode && hasAllPermissionGranted(grantResults)) //判斷請求碼與請求結果是否一致        {            isrequestCheck = true;//需要檢測許可權,直接進入,否則提示對話方塊進行設定            getAllGrantedPermission();        } else {            //提示對話方塊設定            isrequestCheck = false;            showMissingPermissionDialog();//dialog        }    }    /*    * 當擷取到要求的權限後,進行相關業務操作     */    public void getAllGrantedPermission() {    }    protected void process(Bundle savedInstanceState) {        if (getPermissions() != null) {            checkPermission = new CheckPermission(this);            if (checkPermission.permissionSet(getPermissions())) {                requestPermissions(getPermissions());     //去請求許可權            } else {                getAllGrantedPermission();            }        }    }    @Override    protected void onResume() {        super.onResume();        //根據activity生命週期,onRestart()->onResume()        //此處表示從系統設定頁面返回後,檢查使用者是否將所需的許可權開啟        if (!isrequestCheck) {            if (getPermissions() != null) {                if (checkPermission.permissionSet(getPermissions())) {                    showMissingPermissionDialog();//dialog                } else {                    //擷取全部許可權,走正常業務                    getAllGrantedPermission();                }            }        } else {            isrequestCheck = true;        }    }    public String[] getPermissions() {        return null;    }

在自己的activity中,重寫以下幾個方法

static final String[] PERMISSION = new String[]{            Manifest.permission.WRITE_EXTERNAL_STORAGE,// 寫入許可權            Manifest.permission.READ_EXTERNAL_STORAGE,  //讀取許可權            Manifest.permission.READ_PHONE_STATE,        //讀取裝置資訊            Manifest.permission.ACCESS_COARSE_LOCATION, //百度定位            Manifest.permission.ACCESS_FINE_LOCATION,    };    //布局id上送到BaseActivity    @Override    public int initContentID() {        return R.layout.activity_main;    }    @Override    protected void process(Bundle savedInstanceState) {        super.process(savedInstanceState);        //如果有什麼需要初始化的,在這裡寫就好~    }    @Override    public void getAllGrantedPermission() {        //當擷取到要求的權限後,進行相關業務操作        super.getAllGrantedPermission();    }    @Override    public String[] getPermissions() {        return PERMISSION;    }

 

Android6.0動態擷取許可權

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.