功能:
支持獲取單個權限、多個權限(List的方式傳入)
當權限被拒絕時,會返回被拒絕的權限名稱
使用方法:
1、需要使用的權限一定要記得先在"AndroidManifest.xml"中先聲明,否則可能無法執行獲取權限的動作!
2、在需要申請權限的地方new 工具對象,並將需要申請的權限用List的方式傳入,然後一定要設定監聽器,纔會執行獲取權限的動作!!!
List<String> permissions = new ArrayList<>();//需要獲取的權限集合
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);//將需要獲取的權限加入到集合中
PermissionTool permissionTool = new PermissionTool(StudyMediaActivity.this,permissions);
//只有設定了監聽器,纔會去執行獲取權限的動作
permissionTool.setGetPermissionResultListener(new PermissionTool.GetPermissionResultListener() {
@Override
public void getPermissionSuccess() {
Log.d(TAG,"獲取權限成功");
initPlayer();
}
@Override
public void getPermissionFail(List<String> permissions) {
//返回被拒絕的權限集合
Log.d(TAG,"獲取權限失敗:"+permissions.toString());
Toast.makeText(StudyMediaActivity.this,"權限被拒絕",Toast.LENGTH_SHORT).show();
finish();
}
});
3、在申請權限的地方(Activity),重寫“onRequestPermissionsResult”這個回調,在裏面調用工具類的onResult方法,並將回調的參數原封不動的傳給工具類即可,後續操作全部交給工具類來處理。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//所有參數原封不動的傳給工具類
PermissionTool.onResult(requestCode,permissions,grantResults);
}
源碼:
package com.example.yonghe.myapplication.Tool;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
/**
* 運行時權限工具類
* dong 2019年1月5日15:27:39
*/
public class PermissionTool{
private Context context;
private List<String> permission_list = new ArrayList<>();
private static GetPermissionResultListener GetPermissionResultListener;
/**
* 申請一系列的權限的構造器
* @param context 上下文
* @param permission_list 權限集合
*/
public PermissionTool(Context context, List<String> permission_list) {
this.context = context;
this.permission_list = permission_list;
}
/**
* 只申請某個權限的構造器
* @param context 上下文
* @param permission 權限名
*/
public PermissionTool(Context context, String permission) {
this.context = context;
permission_list.add(permission);
}
/**
* 執行獲取權限動作
*/
private void getPermission() {
for (int i = 0; i < permission_list.size(); i++) {
//循環查是否已經獲取到權限
if (ContextCompat.checkSelfPermission(context,permission_list.get(i)) == PackageManager.PERMISSION_GRANTED) {
//將已經獲取到的權限剔除
permission_list.remove(i);
}
}
if (permission_list.size()<=0){
//所有權限都已經獲取到了
GetPermissionResultListener.getPermissionSuccess();
}else {
//將list轉成數組,此時list中的所有權限都是未獲取的
String[] permission_array = new String[permission_list.size()];
for (int i = 0;i<permission_list.size();i++){
permission_array[i] = permission_list.get(i);
}
//開始申請權限
ActivityCompat.requestPermissions((Activity)context,permission_array,1111);
}
}
/**
* 暴露給外部的監聽接口,失敗時將返回被拒絕的權限集合
*/
public interface GetPermissionResultListener {
void getPermissionSuccess();
void getPermissionFail(List<String> permissions);
}
/**
* 設置監聽器,只有設置了監聽器的纔會執行獲取權限的動作
* @param getPermissionResultListenerListener 監聽器
*/
public void setGetPermissionResultListener(GetPermissionResultListener getPermissionResultListenerListener){
GetPermissionResultListener = getPermissionResultListenerListener;
getPermission();
}
/**
* 回調會傳到Activity中,所以需要在Activity的回調中調用該方法,將後續處理交給該類
* @param requestCode 在Activity的回調中的參數,原封不動的返回即可
* @param permissions 在Activity的回調中的參數,原封不動的返回即可
* @param grantResults 在Activity的回調中的參數,原封不動的返回即可
*/
public static void onResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if (requestCode==1111){
if (grantResults.length>0){
List<String> permissions_fail = new ArrayList<>();
for (int i = 0;i<grantResults.length;i++){
if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
//被拒絕的權限
permissions_fail.add(permissions[i]);
}
}
if (permissions_fail.size()>0 && GetPermissionResultListener !=null){
//有一個權限沒被允許都將走失敗的分支
GetPermissionResultListener.getPermissionFail(permissions_fail);
}else if (GetPermissionResultListener!=null){
GetPermissionResultListener.getPermissionSuccess();
}
}
}
}
}