這個(gè)工具類優(yōu)點(diǎn):可以在能拿到Context的任意地方去申請(qǐng)權(quán)限,不用依賴activity的onRequestPermissionsResult回調(diào)方法獲取返回結(jié)果。
使用的代碼看下面:
//可以一次申請(qǐng)一個(gè)或多個(gè)權(quán)限字币,而且只需下面這一段代碼就行了延赌,
//不需要在其他地方額外再加代碼,很簡(jiǎn)單有木有
AppPermissionUtil.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new AppPermissionUtil.OnPermissionListener() {
@Override
public void onPermissionGranted() {
//授權(quán)
}
@Override
public void onPermissionDenied() {
//沒有授權(quán)噩斟,或者有一個(gè)權(quán)限沒有授權(quán)
}
});
下面是工具類代碼库倘,一共兩個(gè)類
import android.content.Context;
import android.os.Build;
/**
* 新版動(dòng)態(tài)權(quán)限申請(qǐng)類
* 說明:不用依賴activity接收回調(diào)临扮,可以再任意地方請(qǐng)求權(quán)限
* Created by yangqin on 2018/5/28.
*/
public class AppPermissionUtil {
/**
* 去請(qǐng)求所有權(quán)限
* @param context
* @param permissions 需要請(qǐng)求的權(quán)限列表
* @param listener 請(qǐng)求權(quán)限回調(diào)
*/
public static void requestPermissions(Context context, String[] permissions, OnPermissionListener listener) {
if(context==null||listener==null){
throw new NullPointerException("context參數(shù)為空,或者listener參數(shù)為空");
}
if (Build.VERSION.SDK_INT <= 22) {
//SDK小于22之前的版本之前發(fā)返回權(quán)限允許
listener.onPermissionGranted();
} else {
//打開一個(gè)一像素的activity去請(qǐng)求權(quán)限教翩,并回調(diào)返回結(jié)果
RequestPermissionsHelpActivity.start(context,permissions,listener);
}
}
public interface OnPermissionListener {
void onPermissionGranted();//授權(quán)
void onPermissionDenied();//拒絕
}
}
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 動(dòng)態(tài)請(qǐng)求權(quán)限幫助activity杆勇,與AppPermissionUtil聯(lián)用。
* 注:這個(gè)不是我們app的頁面饱亿,所有不要輕易改動(dòng)蚜退。
*/
public class RequestPermissionsHelpActivity extends AppCompatActivity {
private int requestCode;
//設(shè)計(jì)兩個(gè)OnPermissionListener的原因是闰靴,有效緩解并發(fā)請(qǐng)求權(quán)限時(shí),OnPermissionListener公用一個(gè)會(huì)引發(fā)回調(diào)錯(cuò)亂或沒法回調(diào)的問題
private static AppPermissionUtil.OnPermissionListener transferOnPermissionListener;//這個(gè)靜態(tài)變量充當(dāng)一個(gè)傳遞者的角色,傳遞給mOnPermissionListener變量后关霸,就釋放引用了
private AppPermissionUtil.OnPermissionListener mOnPermissionListener;//這個(gè)才是我們每次權(quán)限請(qǐng)求使用的回調(diào)監(jiān)聽
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1像素的activity
Window window = getWindow();
window.setGravity(Gravity.LEFT | Gravity.TOP);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = 0;
params.height = 1;
params.width = 1;
window.setAttributes(params);
//獲取界面?zhèn)鬟^來的值
getIntentData();
}
private void getIntentData(){
//獲取傳遞過來回調(diào)監(jiān)聽
mOnPermissionListener=transferOnPermissionListener;
transferOnPermissionListener=null;
//傳過來的需要申請(qǐng)的權(quán)限
String[] permissions=getIntent().getStringArrayExtra("permissions");
if(permissions!=null&&permissions.length>0){
requestPermissions(permissions);
}else {
//手動(dòng)報(bào)錯(cuò)提示
throw new NullPointerException("申請(qǐng)的權(quán)限列表不能為空!");
}
}
/**
* 去申請(qǐng)所有權(quán)限
* @param permissions
*/
@TargetApi(Build.VERSION_CODES.M)
private void requestPermissions(String[] permissions){
Random random=new Random();
requestCode=random.nextInt(1000);
List<String> deniedPermissions = getDeniedPermissions(permissions);
if (deniedPermissions.size() > 0) {
//沒有授權(quán)過杰扫,去申請(qǐng)一下
requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
} else {
//都已經(jīng)授權(quán)過了
if(mOnPermissionListener!=null)
mOnPermissionListener.onPermissionGranted();
if(!isFinishing()) {
finish();
}
}
}
/**
* 請(qǐng)求權(quán)限結(jié)果
*/
public void requestPermissionsResult(int requestCode, int[] grantResults) {
if (requestCode != -1 && requestCode == requestCode) {
if (verifyPermissions(grantResults)) {
//都授權(quán)了
if(mOnPermissionListener!=null)
mOnPermissionListener.onPermissionGranted();
finish();
} else {
//有一個(gè)未授權(quán)或者多個(gè)未授權(quán)
if(mOnPermissionListener!=null)
mOnPermissionListener.onPermissionDenied();
finish();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//申請(qǐng)權(quán)限結(jié)果返回
requestPermissionsResult(requestCode,grantResults);
}
/**
* 獲取請(qǐng)求權(quán)限中需要授權(quán)的權(quán)限,有的可能已經(jīng)授權(quán)過了
*/
private List<String> getDeniedPermissions(String[] permissions) {
List<String> deniedPermissions = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) {
deniedPermissions.add(permission);
}
}
return deniedPermissions;
}
/**
* 驗(yàn)證所有權(quán)限是否都已經(jīng)授權(quán)
*/
private static boolean verifyPermissions(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
mOnPermissionListener=null;
}
/**
* 啟動(dòng)activity队寇,并帶些必要參數(shù)過來
* @param context
* @param permissions 申請(qǐng)權(quán)限列表
* @param listener 結(jié)果回調(diào)
*/
public static void start(Context context, String[] permissions, AppPermissionUtil.OnPermissionListener listener){
Intent intent = new Intent(context, RequestPermissionsHelpActivity.class);
intent.putExtra("permissions",permissions);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
transferOnPermissionListener=listener;
}
}
manifest也需要配置一下:
<activity
android:name=".RequestPermissionsHelpActivity"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
android:theme="@style/transparencyActivityStyle" />
這個(gè)是activity的透明樣式:
<style name="transparencyActivityStyle" parent="Theme.AppCompat">
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoDisplay">false</item>
<item name="android:windowDisablePreview">true</item>
</style>
最后就是一點(diǎn)透明顏色:
<color name="transparent">#00000000</color>
作者獨(dú)白:建一棟高樓,高樓的結(jié)構(gòu)沒有研究清楚章姓,卻一直在研究如何節(jié)省時(shí)間砌好一面墻佳遣。 哈哈哈,跑偏了 凡伊, 捂臉零渐。。系忙。诵盼。