Android 6.0動态申請權限
在android 6.0以下,開發者隻需要在配置清單中說明,使用者安裝APP同意APP所申請的所有權限才能進行安裝,而在android 6.0以上,開發者不僅要在配置清單中說明,對于一些危險權限還需要代碼動态申請。這些危險權限在使用者授權後才可以使用,比如調用攝像頭、讀取通訊錄、定位等。
1. 需要動态申請的權限
以下為需要動态申請的權限,共有9組,每一組隻有任何一個權限申請成功了,就預設整組的權限都可以使用。
group:android.permission-group.CONTACTS //通訊錄
permission:android.permission.WRITE_CONTACTS //寫入通訊錄
permission:android.permission.GET_ACCOUNTS //通路GMail賬戶清單
permission:android.permission.READ_CONTACTS //讀取通訊錄
group:android.permission-group.PHONE //手機
permission:android.permission.READ_CALL_LOG //讀取通話記錄
permission:android.permission.READ_PHONE_STATE //讀取電話狀态
permission:android.permission.CALL_PHONE //撥打電話
permission:android.permission.WRITE_CALL_LOG //寫入通話記錄
permission:android.permission.USE_SIP //允許程式使用SIP視訊服務
permission:android.permission.PROCESS_OUTGOING_CALLS //允許程式監視,修改或放棄播出電話
permission:com.android.voicemail.permission.ADD_VOICEMAIL//允許應用程式添加系統中的語音郵件。
group:android.permission-group.CALENDAR //系統月曆
permission:android.permission.READ_CALENDAR //讀取使用者的日程資訊
permission:android.permission.WRITE_CALENDAR //寫入使用者的日程資訊
group:android.permission-group.CAMERA //攝像頭
permission:android.permission.CAMERA //允許調用攝像頭
group:android.permission-group.SENSORS //手機傳感器
permission:android.permission.BODY_SENSORS//允許擷取傳感器資料
group:android.permission-group.LOCATION //定位權限
permission:android.permission.ACCESS_FINE_LOCATION //擷取精準定位,通過GPS晶片
permission:android.permission.ACCESS_COARSE_LOCATION//通過wifi或基站擷取粗略定位
group:android.permission-group.STORAGE //存儲權限
permission:android.permission.READ_EXTERNAL_STORAGE //允許讀取外部存儲
permission:android.permission.WRITE_EXTERNAL_STORAGE //允許寫入外部存儲
group:android.permission-group.MICROPHONE //錄音權限
permission:android.permission.RECORD_AUDIO //允許通過麥克風來錄音
group:android.permission-group.SMS //短信權限
permission:android.permission.READ_SMS //允許讀取短信
permission:android.permission.RECEIVE_WAP_PUSH//允許接收WAP PUSH資訊
permission:android.permission.RECEIVE_MMS //允許接收彩信
permission:android.permission.RECEIVE_SMS //允許接收短信
permission:android.permission.SEND_SMS//允許發送短信
permission:android.permission.READ_CELL_BROADCASTS //擷取小區廣播
2. 危險權限申請步驟
2.1 在配置清單中添加所需要申請的權限
如 在配置清單中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.2 申請權限步驟
2.2.1 檢查權限
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//沒有授權
}else{
//已經授權過了
}
或者通過以下方式檢查是否授權了
if (PackageManager.PERMISSION_GRANTED!=ContextCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//沒有授權
}else{
//已經授權過了
}
2.2.2 請求權限申請
通過ActivityCompat.requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) 方法申請權限,通過第二個參數可以看出一次可以申請多個權限。
2.2.3 申請權限回調
在Activity中重寫如下函數
/**
*
* @param requestCode 請求碼
* @param permissions 請求的權限數組
* @param grantResults 請求每個權限的狀态:允許還是拒絕。對應于每個權限
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == WRITE_PERMISSION_REQ_CODE){
for (int i = ; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
//如果拒絕了
//改方法主要用于給使用者一個申請權限的解釋,該方法隻有在使用者在上一次已經拒絕過
//你的權限申請。
boolean isTip =ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i]);
if (isTip){
//表明使用者沒有徹底禁止彈出請求權限
}else {
//表面使用者徹底禁止了彈出請求權限,可以提示使用者然後跳到設定中打開權限
}
}else{
//允許了
}
}
}
}
2.3 權限申請的封裝
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.PermissionChecker;
import java.util.ArrayList;
import java.util.List;
/**
*
* @Description:權限檢測
* @author: liuxin
* @date: 2017/10/26
*/
public class PermissionUtils {
public static final String TAG = PermissionUtils.class.getSimpleName();
public static final int WRITE_PERMISSION_REQ_CODE = ;
/**
* SD卡讀寫權限
* @param context
* @return
*/
public static boolean checkWriteSDPermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 視訊錄制權限申請
* @param context
* @return
*/
public static boolean checkVideoRecordPermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) {
permissions.add(Manifest.permission.CAMERA);
}
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) {
permissions.add(Manifest.permission.RECORD_AUDIO);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 視訊相機權限申請
* @param context
* @return
*/
public static boolean checkCameraPermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) {
permissions.add(Manifest.permission.CAMERA);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 音頻錄制權限申請
* @param context
* @return
*/
public static boolean checkVoiceRecordPermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) {
permissions.add(Manifest.permission.RECORD_AUDIO);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 定位權限擷取
* @param context
* @return
*/
public static boolean checkLocationPermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 手機狀态相關
* @param context
* @return
*/
public static boolean checkPhoneStatePermission(Activity context){
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_PHONE_STATE)) {
permissions.add(Manifest.permission.READ_PHONE_STATE);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 擷取手機短信
*
* @param context
* @return
*/
public static boolean checkPhoneMessagePermission(Activity context) {
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_SMS)) {
permissions.add(Manifest.permission.READ_SMS);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
/**
* 擷取手機通訊錄
*
* @param context
* @return
*/
public static boolean checkPhoneContactsPermission(Activity context) {
if (Build.VERSION.SDK_INT >= ) {
try {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_CONTACTS)) {
permissions.add(Manifest.permission.READ_CONTACTS);
}
if (permissions.size() != ) {
ActivityCompat.requestPermissions(context,
(String[]) permissions.toArray(new String[permissions.size()]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
}
通過在Activity中調用該類的某個靜态方法來請求檢測權限。如有需要可以重寫 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) ;方法來提示使用者。