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卡的寫入,寫出、震動,等等。 這裡為大家簡單的介紹一下如何進行動態許可權的獲取,以及如何編寫動態許可權封裝類。 這裡以獲取本地相機