Android6.0SDK23動態許可權的請求和直接使用-使用版
自從Android6.0以後SDK23版本,現在的Android的很多許可權是需要動態請求的,例如常用的相機,讀寫儲存,定位,錄音等等,不僅僅要在AndroidManifest.xml裡面做許可權的請求,而且在程式碼裡,也需要做一些處理,為了方便自己使用,把基本的模板總結出來,若沒有“奇特”需求的情況下,基本是“拿來主義”直接使用。
文末會附上Demo下載。
貼圖幾張:
基本的操作,其他情況自己可以測試,可以自己在手機的應用管理處再把許可權給取消,這樣可以反覆測試各種情況:
貼完圖,上部分程式碼塊:
BaseActivity自定義基類:
/**
* Created by zhenQi on 2016/12/27.
* 自定義BaseActivity基類
*/
public class BaseActivity extends AppCompatActivity {
//例項化監聽物件
private static PermissionListener mListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//新增Activity管理類的方法-新增類
ActivityCollector.addActivity(this );
}
@Override
protected void onDestroy() {
super.onDestroy();
//新增Activity管理類的方法-移除類
ActivityCollector.removeActivity(this);
}
//許可權請求的方法(直接貼上複製即可使用)
public static void requestRuntimePermission(String[] permissions, PermissionListener listener) {
Activity topActivity = ActivityCollector.getTopActivity();
if (topActivity == null) {
return;
}
mListener = listener;
List<String> permissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
if (!permissionList.isEmpty()) {
ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1);
} else {
mListener.onGranted();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String permission = permissions[i];
if (grantResult != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permission);
}
}
if (deniedPermissions.isEmpty()) {
mListener.onGranted();
} else {
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
}
主要操作的類MainActivity:
/**
* 許可權的請求操作封裝在BaseActivity基類中,當前類繼承BaseActivity基類
* 首先宣告(廢話):動態許可權是Android 6.0版本以後(SDK:23),谷歌更新的對於一些危險/隱祕許可權的動態提醒和動態授權的“規定”
* 可以用判斷方法:Build.VERSION.SDK_INT >= 23,來判斷當前版本是不是大於SDK 23。——廢話結束。
* 使用許可權方法,直接呼叫requestRuntimePermission(要請求的許可權陣列,PermissionListener監聽方法)的方法,
* 注:首先所有的動態請求,都是要在AndroidManifest.xml,中去新增的,例如:
* <uses-permission android:name="android.permission.CALL_PHONE" />//打電話許可權
* <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />//精準定位許可權
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//寫資料許可權
* <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />//讀資料許可權
* <uses-permission android:name="android.permission.CAMERA" />//相機許可權
* <uses-permission android:name="android.permission.RECORD_AUDIO" />//錄音許可權
* 等等...
*/
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* (這裡引用佈局的onClick點選方法)
*
* @param view 點選-統一請求很多許可權:
*/
public void buttonClick(View view) {
requestRuntimePermission(new String[]{
Manifest.permission.CALL_PHONE,//打電話許可權
Manifest.permission.ACCESS_FINE_LOCATION,//精準定位許可權
Manifest.permission.CAMERA,//相機許可權
Manifest.permission.WRITE_EXTERNAL_STORAGE,//寫資料許可權
Manifest.permission.READ_EXTERNAL_STORAGE,//讀資料許可權
Manifest.permission.RECORD_AUDIO//錄音許可權
}, new PermissionListener() {
//授權後的回撥方法
@Override
public void onGranted() {
Toast.makeText(MainActivity.this, "所有許可權都同意了", Toast.LENGTH_SHORT).show();
}
//許可權被拒絕的回撥方法
@Override
public void onDenied(List<String> deniedPermission) {
for (String permission : deniedPermission) {
Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
}
}
});
}
//單獨請求相機許可權
public void pai(View view) {
requestRuntimePermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionListener() {
@Override
public void onGranted() {
Toast.makeText(MainActivity.this, "允許了拍照", Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(List<String> deniedPermission) {
for (String permission : deniedPermission) {
Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
}
}
});
}
//單獨請求-儲存許可權
public void cun(View view) {
requestRuntimePermission(new String[]{Manifest.permission.CAMERA}, new PermissionListener() {
@Override
public void onGranted() {
Toast.makeText(MainActivity.this, "允許了讀寫", Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(List<String> deniedPermission) {
for (String permission : deniedPermission) {
Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
}
}
});
}
//單獨請求-打電話的許可權
public void callClick(View view) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "123456789"));
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
startActivity(intent);
}
//跳轉到下一頁
public void tiao(View view) {
Intent intent = new Intent(this, Main2Activity.class);
startActivity(intent);
}
//抽出-做一些操作的方法
private void doSomething() {
// do something
Toast.makeText(this, "所有許可權都同意了", Toast.LENGTH_SHORT).show();
}
}
其他程式碼:
其他說明:
Demo中自定義了Util工具類,
PermissionListener(監聽回撥)介面,
自定義ActivityCollector(Activity)管理類
/**
* Created by zhenQi on 2016/12/27.
* 自定義的一個工具類
*/
public class Util {
public void test() {
BaseActivity.requestRuntimePermission(new String[]{}, new PermissionListener() {
@Override
public void onGranted() {
}
@Override
public void onDenied(List<String> deniedPermission) {
}
});
}
}
/**
* Created by zhenQi on 2016/12/27.
* Activity的管理類,方面統一管理Activity
*/
public class ActivityCollector {
private static List<Activity> activityList = new ArrayList<>();
public static void addActivity(Activity activity) {
activityList.add(activity);
}
public static void removeActivity(Activity activity) {
activityList.remove(activity);
}
public static Activity getTopActivity() {
if (activityList.isEmpty()) {
return null;
} else {
return activityList.get(activityList.size() - 1);
}
}
}
/**
* Created by zhenQi on 2016/12/27.
* 定義回撥介面,授權的方法,和拒絕的方法
*/
public interface PermissionListener {
void onGranted();
void onDenied(List<String> deniedPermission);
}
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
private Button finish;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
}
//點選-請求錄音的許可權(這裡引用佈局的onClick(lu)點選方法)
public void luyin(View view) {
requestRuntimePermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() {
@Override
public void onGranted() {
//授權的操作
Toast.makeText(Main2Activity.this, "錄音許可權-已經授權", Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(List<String> deniedPermission) {
for (String permission : deniedPermission) {
//未授權的操作
Toast.makeText(Main2Activity.this, "錄音許可權-未經授權", Toast.LENGTH_SHORT).show();
}
}
});
}
private void initView() {
finish = (Button) findViewById(R.id.finish);
//這裡使用監聽點選事件的方法,啟用點選事件
finish.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//返回上一頁-殺死當前Activity
case R.id.finish:
finish();
break;
}
}
}
許可權區分列表:
正常許可權 (Normal Permissions) |
---|
在API 23中,下面許可權被定義為正常許可權 |
關於Markdown 簡介Markdown,Markdown的優缺點 |
ACCESS_LOCATION_EXTRA_COMMANDS |
ACCESS_NETWORK_STATE |
ACCESS_NOTIFICATION_POLICY |
ACCESS_WIFI_STATE |
BLUETOOTH |
BLUETOOTH_ADMIN |
BROADCAST_STICKY |
CHANGE_NETWORK_STATE |
CHANGE_WIFI_MULTICAST_STATE |
CHANGE_WIFI_STATE |
DISABLE_KEYGUARD |
EXPAND_STATUS_BAR |
GET_PACKAGE_SIZE |
INSTALL_SHORTCUT |
INTERNET |
KILL_BACKGROUND_PROCESSES |
MODIFY_AUDIO_SETTINGS |
NFC |
READ_SYNC_SETTINGS |
READ_SYNC_STATS |
RECEIVE_BOOT_COMPLETED |
REORDER_TASKS |
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS |
REQUEST_INSTALL_PACKAGES |
SET_ALARM |
SET_TIME_ZONE |
SET_WALLPAPER |
SET_WALLPAPER_HINTS |
TRANSMIT_IR |
UNINSTALL_SHORTCUT |
USE_FINGERPRINT |
VIBRATE |
WAKE_LOCK |
WRITE_SYNC_SETTINGS |
敏感許可權 | (Dangerous permissions) |
---|---|
Permission Group | Permissions |
CALENDAR | READ_CALENDAR, WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS ,WRITE_CONTACTS, GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE, CALL_PHONE READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL , USE_SIP, PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS RECEIVE_SMS , READ_SMS RECEIVE_WAP_PUSH , RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE |
相關推薦
Android6.0SDK23動態許可權的請求和直接使用-使用版
自從Android6.0以後SDK23版本,現在的Android的很多許可權是需要動態請求的,例如常用的相機,讀寫儲存,定位,錄音等等,不僅僅要在AndroidManifest.xml裡面做許可權的請求,而且在程式碼裡,也需要做一些處理,為了方便自己使用,把基本
Android6.0動態許可權適配&XMPermissions
Android6.0動態許可權 簡介 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行
Android6.0動態許可權問題,使用PermissionDispatcher自動分配
Android 6.0 許可權問題 Android 6.0對許可權做了區分,將手機的許可權分為危險許可權和非危險許可權; 非危險許可權只要在AndroidManifest中加入許可權申請就可以使用了。 而危險許可權只在AndroidManifest中加入許可權申
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
android6.0動態許可權申請
android6.0之前,所有的許可權都要求同意之後,app才能被安裝。6.0之後,動態許可權申請很好的處理了之前的強制行為,對使用者更加的友好。 新的許可權機制,將許可權分為兩大類,一種普通許可權,一種為危險許可權。普通許可權,在manifest中申請後,無需再主動申請;
安卓開發——Android6.0動態許可權申請步驟以及需要注意的一些坑
因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要
使用EasyPermissions 來打造簡單的android6.0動態許可權
EasyPermissions 的介紹 EasyPermissions是一個三方庫,用於android6.0動態許可權的使用。 在android6.0版本中,涉及到許可權問題的使用,都需要進行動態申請。 EasyPermissions 的使用
android6.0動態許可權管理案例-打電話案例
package com.example.phone2; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.ne
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卡的寫入,寫出、震動,等等。 這裡為大家簡單的介紹一下如何進行動態許可權的獲取,以及如何編寫動態許可權封裝類。 這裡以獲取本地相機
android6.0動態許可權管理,小米bug適配
在Android6.0以後開始,對於部分敏感的“危險”許可權,需要在應用執行時向用戶申請,只有使用者允許的情況下這個許可權才會被授予給應用。這對於使用者來說,無疑是一個提升安全性的做法。那麼對於開發者,應該怎麼做呢? Android6.0規定的危險許可權有下面
關於android6.0動態許可權造成的app crash問題
今天我們為公司內部員工開發的app出現了一個bug,因為我們的app要繫結imei所以我就讀取imei並且有個許可權READ_PHONE_STATE就是這個許可權出現了問題,我就納悶了怎麼會有問題呢,我已經在manifest上聲明瞭,然後我就看一下他的android版本6.
Android高效開發之,Android6.0動態許可權的封裝
每次進行動態許可權註冊的時候,都要使用固定的流程 對該固定程式碼進行封裝,可以在所有介面Activity基類中進行動態許可權的申請。 子類Activity只需要構造一個LinkedList 傳入
Android6.0 動態許可權獲取記錄
這應該算是一個比較老的東西了,但還是想寫一寫。 Android6.0 動態許可權,顧名思義,是在6.0及以上的Android生效的,6.0以下,及小米,魅族等自定義的許可權獲取,相對來說比較複雜,網上看了很多文章,有很多種不同的實現方法,但個
android6.0動態許可權,以及如何同時授予多個許可權,當用戶禁用的後續處理
AlertDialog mPermissionDialog;/** * 不再提示許可權 時的展示對話方塊 */private void showPermissionDialog() { if (mPermissionDialog == null) { mPermissionDialog
Android6.0以上獲取動態許可權
在執行時請求許可權 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行更多控制;例如,使用者可以選擇為相機應用提供相機訪問許