1. 程式人生 > >android6.0動態許可權管理,小米bug適配

android6.0動態許可權管理,小米bug適配

在Android6.0以後開始,對於部分敏感的“危險”許可權,需要在應用執行時向用戶申請,只有使用者允許的情況下這個許可權才會被授予給應用。這對於使用者來說,無疑是一個提升安全性的做法。那麼對於開發者,應該怎麼做呢?

Android6.0規定的危險許可權有下面這些:
這裡寫圖片描述

但是如果你的編譯版本是23或者以上,那麼Android Studio就會報出一個錯誤。及時在Manifest中聲明瞭許可權,6.0的機器仍會崩潰,無法獲取到許可權。
提示我們要進行許可權請求。

 // 缺少許可權時, 進入許可權配置頁面
if (Build.VERSION.SDK_INT >= 23) {
   int
checkLocalPhonePermission = ActivityCompat.checkSelfPermission(ActivityDetailActivity.this, LOCAL_PERMISSION); if (checkLocalPhonePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(ActivityDetailActivity.this, new String[]{LOCAL_PERMISSION}, 101
); return; } ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUESTCODE); 這個時候,再重新執行App,會得到下面的一個介面來請求使用者許可權: 允許:以後不再彈出請求框,直接允許應用獲得該許可權 拒絕:下次需要時會重新彈出,直到使用者選擇允許,否則會不斷出現 那麼問題就來了,如果使用者勾選了不再詢問並拒絕了請求會怎樣呢?答案是以後不會再彈出,並且預設拒絕許可權請求,也就是說,應用再也不能獲得這個許可權,除非使用者主動進入應用設定中重新授權。 為了更好的使用者體驗,可以在使用者選擇了不再詢問和拒絕之後,建立一個AlertDialog來詢問使用者是否需要重新授予許可權,是的話,跳轉到應用設定介面。 當我們呼叫requestPermissions方法的時候,無論成功與否,都會將結果回撥給Activity中的onRequestPermissionsResult方法中,我們可以通過重寫這個方法來處理結果: 複製程式碼 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUESTCODE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) { AskForPermission(); } } } } 複製程式碼 先判斷請求是否為我們所申請的,接著判斷SDK的版本是否高於或等於AndroidM(6.0),如果是,則呼叫shouldShowRequestPermissionRationale方法來檢查許可權申請框是否會顯示,因為如果使用者選擇了不再詢問,則申請框會不出現,這個方法會返回false,如果申請框沒有出現,則建立一個AlertDialog來詢問使用者: 複製程式碼
private void AskForPermission() {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Need Permission!");

        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    builder.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName())); // 根據包名開啟對應的設定介面
            startActivity(intent);
        }
    });
    builder.create().show();
} 

小米的MIUI對許可權自動分配,android 6.0 許可權管理拒絕了之後,檢測許可權時granted 返回仍然0,顯示已授予許可權。為了解決這個問題,需要對小米及其他第三方定製rom進行適配,方法如下:

關於MIUI 6.0 許可權檢測,執行時允許,但Appops拒絕 也是不 能訪問的
第一步檢測執行時許可權
第二步檢測AppOpsManager 原生許可權檢查

 // 缺少許可權時, 進入許可權配置頁面
 if (Build.VERSION.SDK_INT >= 23) {
                int checkLocalPhonePermission = ActivityCompat.checkSelfPermission(ActivityDetailActivity.this, LOCAL_PERMISSION);
                if (checkLocalPhonePermission != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(ActivityDetailActivity.this,
                            new String[]{LOCAL_PERMISSION}, 101);
                    return;
                }
                //適配小米機型
                AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
                int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getPackageName());
                if (checkOp == AppOpsManager.MODE_IGNORED) {
                    ActivityCompat.requestPermissions(ActivityDetailActivity.this,
                            new String[]{LOCAL_PERMISSION}, 101);
                    return;
                }
            }
同時在回撥中也需要另外處理,通過AlertDailog引導使用者開啟許可權設定:
//使用者不同意,向用戶展示該許可權作用
            if (!ActivityCompat.shouldShowRequestPermissionRationale(this, LOCAL_PERMISSION)) {
                AlertDialog dialog = new AlertDialog.Builder(this)
                        .setMessage("簽到功能需要定位你目前的位置,不賦予定位許可權將無法正常工作!")
                        .setPositiveButton("前往授權", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                // 根據包名開啟對應的設定介面
                                intent.setData(Uri.parse("package:" + getPackageName()));
                                startActivity(intent);
                            }
                        })
                        .setNegativeButton("取消授權", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

//                                    finish();
                            }
                        }).create();
                dialog.show();
                return;
            }

“`

相關推薦

android6.0動態許可權管理小米bug

在Android6.0以後開始,對於部分敏感的“危險”許可權,需要在應用執行時向用戶申請,只有使用者允許的情況下這個許可權才會被授予給應用。這對於使用者來說,無疑是一個提升安全性的做法。那麼對於開發者,應該怎麼做呢? Android6.0規定的危險許可權有下面

Android6.0動態許可權問題使用PermissionDispatcher自動分配

Android 6.0 許可權問題 Android 6.0對許可權做了區分,將手機的許可權分為危險許可權和非危險許可權; 非危險許可權只要在AndroidManifest中加入許可權申請就可以使用了。 而危險許可權只在AndroidManifest中加入許可權申

android6.0動態許可權管理案例-打電話案例

package com.example.phone2; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.ne

Android高效開發之Android6.0動態許可權的封裝

每次進行動態許可權註冊的時候,都要使用固定的流程 對該固定程式碼進行封裝,可以在所有介面Activity基類中進行動態許可權的申請。 子類Activity只需要構造一個LinkedList 傳入

android6.0動態許可權以及如何同時授予多個許可權當用戶禁用的後續處理

AlertDialog mPermissionDialog;/** * 不再提示許可權 時的展示對話方塊 */private void showPermissionDialog() {     if (mPermissionDialog == null) {         mPermissionDialog

6.0動態許可權申請最簡單卻容易被小白忽視的相容方式

       6.0剛出顯示,動態申請各種頭疼,之後出現各種封裝框架,但是本人一直使用的系統自帶的那一套,然後就是遇見各種品牌手機不同的申請過程。早期突然靈光一動想到的一種偷懶且相容性很高的方式,O(∩_∩)O哈哈~可能你只是沒想到,貼下程式碼,你想笑。     以申請短息

6.0動態許可權設定第三方庫PermissionGen的使用

android 6.0 新增加了執行時的動態新增許可權,在此介紹一個第三方庫,PermissionGen,可以很方便簡潔的增加 6.0許可權。 步驟: 1.引用庫:   在 app gradle 中引入: compile 'com.lovedise:permission

Android6.0動態許可權&XMPermissions

Android6.0動態許可權 簡介 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行

android6.0動態許可權申請工具類

一、分析 android6.0後,僅在manifest.xml清單中配置相關許可權時,如果將targetSdkVersion設定為23及以上,部分敏感許可權需要動態申請後才能使用;如果不想處理6.0以上的適配,請將targetSdkVersion設定為22

android6.0動態許可權設定

android6.0後就需要手動獲取許可權。主要有以下步驟:1、在menifests檔案加入相應許可權,如:<!-- 獲取照相機拍照許可權 --> <uses-permission a

android6.0動態許可權的設定——幾行程式碼搞定

只需要兩步走: 一、程式碼請求許可權 /** * android6.0執行時許可權,檢測 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0以上 int checkPermission =

Android6.0 動態許可權申請步驟以及需要注意的一些坑

因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就

Android6.0動態許可權申請步驟以及需要注意的一些坑

簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。 gro

Android 6.0: 動態許可權管理的解決方案

歡迎Follow我的GitHub, 關注我的CSDN. Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了使用者體驗, 同時也為程式設計師帶來新的負擔. 動態許可權管理就是這樣, 一方面讓使用者更加容易的控制自己的隱

android6.0動態許可權申請

android6.0之前,所有的許可權都要求同意之後,app才能被安裝。6.0之後,動態許可權申請很好的處理了之前的強制行為,對使用者更加的友好。 新的許可權機制,將許可權分為兩大類,一種普通許可權,一種為危險許可權。普通許可權,在manifest中申請後,無需再主動申請;

安卓開發——Android6.0動態許可權申請步驟以及需要注意的一些坑

因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要

Android6.0網路許可權管理

Android 6.0 Marshmallow(棉花糖)是目前谷歌公佈的最新版本的作業系統,其中一項改進是針對程式呼叫許可權控制又進一步升級。 在之前的Android系統中,使用者在安裝應用時會收到一堆許可權申請,比如允許應用訪問相簿、位置、通訊錄等等。但是使用者一般都會忽

使用EasyPermissions 來打造簡單的android6.0動態許可權

EasyPermissions 的介紹 EasyPermissions是一個三方庫,用於android6.0動態許可權的使用。 在android6.0版本中,涉及到許可權問題的使用,都需要進行動態申請。 EasyPermissions 的使用

Android6.0動態許可權獲取框架:RxPermission(基於RxJava2)

首先在build.gradle中新增依賴庫 rxjava和retrofit: compile 'io.reactivex.rxjava2:rxjava:2.x.y' compile 'io.reactivex.rxjava2:rxandroid:2.0.

Android6.0動態許可權獲取詳解

在Android6.0出來之前,大家基本都是在清淡配置檔案中間新增系統許可權。但在Android6.0之後很多許可權需要動態獲取。如拍Sd卡的寫入,寫出、震動,等等。 這裡為大家簡單的介紹一下如何進行動態許可權的獲取,以及如何編寫動態許可權封裝類。 這裡以獲取本地相機