Android大法好总结经验

封装Android M动态权限申请库

2016-09-23  本文已影响1233人  Ggx的代码之旅

这段时间,由于项目上适配android M 中的动态权限申请,频繁的写了一些重复的权限申请代码,都快想吐了,还有各种fragment中嵌套fragment的问题,既如此何不把它封装一下。下面直接看代码。

public class MPermission {
    private static final int PERMISSION_CODE = 0x100;
    private Object obj;
    private static Method methodOK, methodFail;
    private String[] permissions;//权限数组
    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("必须填写需要申请的权限");
        }
        this.permissions = permissions;
        return this;
    }
    public void requestPermission() {
        int index=hasPermission(permissions);
        if (index!=-1) {
            //当检查时发现系统不存在这个权限的时候,需要判断当前系统版本是否>=23
            if(Build.VERSION.SDK_INT>=23){
                requestPermissionApi23();
            }else{
                //此处模仿官方API中的方法 进行回调
                //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;
                    }
                }
                //权限都允许了,
                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();
                    }
                }
            }
        }
    }
}

剩下的还有两个是注解类:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionFail {}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionOK {}

以上就是所以的源码,他的使用方式很简单

在Fragment个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("权限通过");
}
@PermissionFail
public void validateFail(){
    Log.i("没有相应的权限");
}
如此一劳永逸,是不是很简单

欢迎共同探讨更多安卓,java,c/c++相关技术QQ群:392154157
上一篇 下一篇

猜你喜欢

热点阅读