• BaseActivity


    package com.glandroid.smssender;
    
    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.
    */
    @Override
    public 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 ****************************************
    }

    调用:

         performCodeWithPermission("发送短信权限", new PermissionCallback() {
                    @Override
                    public void hasPermission() {
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(phoneNumber, null, message, null, null);
                    }
    
                    @Override
                    public void noPermission() {
    
                    }
                }, Manifest.permission.SEND_SMS);
  • 相关阅读:
    grails框架中在使用domain的save方法保存时保存不成功
    模块的循环导入问题、包、json与pickle模块、time与datetime模块、random模块
    模块
    迭代器、生成器、函数的递归调用、二分法
    叠加多个装饰器、有参装饰器、三元表达式、列表生成式、字典生成式、匿名函数
    函数、名称空间与作用域、闭包函数、装饰器
    函数详解
    文件处理
    字符编码
    列表、元祖、字典、集合
  • 原文地址:https://www.cnblogs.com/xiaofu007/p/10562512.html
Copyright © 2020-2023  润新知