這段時(shí)間歹河,由于項(xiàng)目上適配android M 中的動(dòng)態(tài)權(quán)限申請(qǐng),頻繁的寫(xiě)了一些重復(fù)的權(quán)限申請(qǐng)代碼花吟,都快想吐了秸歧,還有各種fragment中嵌套fragment的問(wèn)題,既如此何不把它封裝一下衅澈。下面直接看代碼键菱。
public class MPermission {
private static final int PERMISSION_CODE = 0x100;
private Object obj;
private static Method methodOK, methodFail;
private String[] permissions;//權(quán)限數(shù)組
private MPermission(Object obj) {
this.obj=obj;
methodOK=null;
methodFail=null;
findMethod(obj);
}
private void findMethod(Object o) {
Method[] methods = o.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(PermissionOK.class)) {
methodOK = method;
if(methodFail!=null){
break;
}
}else
if(method.isAnnotationPresent(PermissionFail.class)){
methodFail=method;
if(methodOK!=null){
break;
}
}
}
}
public static MPermission with(Object obj) {
return new MPermission(obj);
}
public MPermission setPermission(String... permissions) {
if (permissions != null && permissions.length == 0) {
throw new RuntimeException("必須填寫(xiě)需要申請(qǐng)的權(quán)限");
}
this.permissions = permissions;
return this;
}
public void requestPermission() {
int index=hasPermission(permissions);
if (index!=-1) {
//當(dāng)檢查時(shí)發(fā)現(xiàn)系統(tǒng)不存在這個(gè)權(quán)限的時(shí)候,需要判斷當(dāng)前系統(tǒng)版本是否>=23
if(Build.VERSION.SDK_INT>=23){
requestPermissionApi23();
}else{
//此處模仿官方API中的方法 進(jìn)行回調(diào)
//API23一下的版本直接返回失敗
int[] grantResults = new int[permissions.length];
for (int i = 0; i < grantResults.length; i++){
if(i<index){
grantResults[i] =PackageManager.PERMISSION_GRANTED;
}else {
grantResults[i]=PackageManager.PERMISSION_DENIED;
}
}
requestPermissionApi(grantResults);
}
} else {
if(methodOK!=null) {
try {
methodOK.setAccessible(true);
methodOK.invoke(obj, new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
@TargetApi(Build.VERSION_CODES.M)
private void requestPermissionApi23(){
if(obj instanceof Activity){
((Activity)obj).requestPermissions(permissions,PERMISSION_CODE);
}else if(obj instanceof Fragment){
((Fragment)obj).requestPermissions(permissions,PERMISSION_CODE);
}
}
private void requestPermissionApi(int[] grantResults){
if(obj instanceof ActivityCompat.OnRequestPermissionsResultCallback){
((ActivityCompat.OnRequestPermissionsResultCallback)obj).onRequestPermissionsResult(PERMISSION_CODE,permissions,grantResults);
}else if(obj instanceof Fragment){
((Fragment)obj).onRequestPermissionsResult(PERMISSION_CODE,permissions,grantResults);
}
}
private int hasPermission(String[] permissions) {
int index=-1;
for (int i=0,j=permissions.length;i<j;i++) {
if (ActivityCompat.checkSelfPermission(Zilla.APP.getApplicationContext(), permissions[i])
!= PackageManager.PERMISSION_GRANTED) {
index=i;
break;
}
}
return index;
}
public static void onRequestPermissionsResult(Object o,int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_CODE) {
if (grantResults.length == permissions.length) {
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
if(methodFail!=null){
try {
methodFail.invoke(o,new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return;
}
}
//權(quán)限都允許了,
if(methodOK!=null) {
try {
methodOK.setAccessible(true);
methodOK.invoke(o, new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} else {
if(methodFail!=null){
try {
methodFail.invoke(o,new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
}
剩下的還有兩個(gè)是注解類(lèi):
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionFail {}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionOK {}
以上就是所以的源碼今布,他的使用方式很簡(jiǎn)單
在Fragment個(gè)Activity中你可以這樣做
//Call it anywhere you want it to.
MPermission.with(this)
.setPermission(Manifest.permission.READ_EXTERNAL_STORAGE
,Manifest.permission.WRITE_EXTERNAL_STORAGE...)
.requestPermission();
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MPermission.onRequestPermissionsResult(this,requestCode,permissions,grantResults);
}
@PermissionOK
private void valdateSuccess(){
Log.i("權(quán)限通過(guò)");
}
@PermissionFail
public void validateFail(){
Log.i("沒(méi)有相應(yīng)的權(quán)限");
}
如此一勞永逸纱耻,是不是很簡(jiǎn)單
歡迎共同探討更多安卓,java险耀,c/c++相關(guān)技術(shù)QQ群:392154157