Android6.0 动态权限封装(代码非原创)

来源:互联网 发布:python清屏 编辑:程序博客网 时间:2024/05/17 06:59

类名:BaseActivity
直接调用函数,传入参数即可

import android.content.DialogInterface;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.widget.Toast;/** * @author Admin * @version $Rev$ * @des ${TODO} * @updateAuthor $Author$ * @updateDes ${TODO} */public class BaseActivity extends AppCompatActivity {    //**************** Android M Permission (Android 6.0权限控制代码封装)    private int permissionRequestCode = 88;    private PermissionCallback permissionRunnable;public interface PermissionCallback {    void hasPermission();    void noPermission();}/** * Android M运行时权限请求封装 * * @param permissionDes 权限描述 * @param runnable      请求权限回调 * @param permissions   请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS */public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) {    if (permissions == null || permissions.length == 0)        return;    //        this.permissionrequestCode = requestCode;    this.permissionRunnable = runnable;    if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) {        if (permissionRunnable != null) {            permissionRunnable.hasPermission();            permissionRunnable = null;        }    } else {        //permission has not been granted.        requestPermission(permissionDes, permissionRequestCode, permissions);    }}private boolean checkPermissionGranted(String[] permissions) {    boolean flag = true;    for (String p : permissions) {        if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {            flag = false;            break;        }    }    return flag;}private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) {    if (shouldShowRequestPermissionRationale(permissions)) {        /*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale()  返回 true,应该显示一些为什么需要这个权限的说明        2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale()  返回 false        3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale()  返回 false*/        // Provide an additional rationale to the user if the permission was not granted        // and the user would benefit from additional context for the use of the permission.        // For example, if the request has been denied previously.        //            Snackbar.make(getWindow().getDecorView(), requestName,        //                    Snackbar.LENGTH_INDEFINITE)        //                    .setAction(R.string.common_ok, new View.OnClickListener() {        //                        @Override        //                        public void onClick(View view) {        //                            ActivityCompat.requestPermissions(BaseAppCompatActivity.this,        //                                    permissions,        //                                    requestCode);        //                        }        //                    })        //                    .show();        //如果用户之前拒绝过此权限,再提示一次准备授权相关权限        new AlertDialog.Builder(this)                .setTitle("提示")                .setMessage(permissionDes)                .setPositiveButton("授权", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);                    }                }).show();    } else {        // Contact permissions have not been granted yet. Request them directly.        ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);    }}private boolean shouldShowRequestPermissionRationale(String[] permissions) {    boolean flag = false;    for (String p : permissions) {        if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) {            flag = true;            break;        }    }    return flag;}/** * Callback received when a permissions request has been completed. */@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,                                       @NonNull int[] grantResults) {    if (requestCode == permissionRequestCode) {        if (verifyPermissions(grantResults)) {            if (permissionRunnable != null) {                permissionRunnable.hasPermission();                permissionRunnable = null;            }        } else {            Toast.makeText(this, "暂无权限执行相关操作!", Toast.LENGTH_SHORT).show();            if (permissionRunnable != null) {                permissionRunnable.noPermission();                permissionRunnable = null;            }        }    } else {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }}public boolean verifyPermissions(int[] grantResults) {    // At least one result must be checked.    if (grantResults.length < 1) {        return false;    }    // Verify that each required permission has been granted, otherwise return false.    for (int result : grantResults) {        if (result != PackageManager.PERMISSION_GRANTED) {            return false;        }    }    return true;}//********************** END Android M Permission ****************************************

}
代码例子