Android 动态权限申请 BaseActivity 封装 拨打电话

Posted 早起的年轻人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 动态权限申请 BaseActivity 封装 拨打电话相关的知识,希望对你有一定的参考价值。

志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

如果你有兴趣 你可以关注一下公众号 biglead 来获取最新的学习资料。


BaseActivity

BaseActivity 中封装了校验与请求,代码如下

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;


import com.example.studyapp.interfac.PermissionInterface;

public class BaseActivity extends AppCompatActivity {
    private Context mContext;
    /**
     * 子Activity 权限申请使用的回调
     */
    private PermissionInterface mPermissionInterface;

    /**
     * 权限没有通过时 true 显示一个弹框再确认
     */
    private boolean isShowPermissionAlert;
    private String showPermissionMessage = "权限申请没有通过";
    private AlertDialog alertDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }


    /**
     * 子 Activity 调用申请权限功能
     *
     * @param permissionInterface
     * @return
     */
    protected boolean checkPermisson(PermissionInterface permissionInterface, String permission, int requestCode) {
        return this.checkPermisson(permissionInterface, permission, requestCode, false);
    }

    /**
     * 子 Activity 调用申请权限功能
     *
     * @param permissionInterface
     * @return
     */
    protected boolean checkPermisson(PermissionInterface permissionInterface, String permission, int requestCode, boolean showAlert) {
        mPermissionInterface = permissionInterface;
        isShowPermissionAlert = showAlert;
        //检查是否有权限
        int checkSelfPermission = ContextCompat.checkSelfPermission(this, permission);
        if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            //申请
            ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
            return false;
        }
    }

    /**
     * 权限申请的回调
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (mPermissionInterface != null) {

            if (permissions.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                if (isShowPermissionAlert) {
                    //显示弹框
                    showAlertFunction();
                } else {
                    //没有通过权限
                    mPermissionInterface.noPass(requestCode);
                }

            } else {
                //申请通过
                mPermissionInterface.onPass(requestCode);
            }

        }
    }

    private void showAlertFunction() {
        //创建构建器
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        alertDialog = builder.setTitle("温馨提示").setMessage(showPermissionMessage).setNegativeButton("知道了 暂不使用", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //没有通过权限申请的弹框
                mPermissionInterface.noPass(0);
                alertDialog.dismiss();
            }
        }).setPositiveButton("去设置中心", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.setData(Uri.fromParts("package", mContext.getPackageName(), null));
                mContext.startActivity(intent);
                alertDialog.dismiss();
            }
        }).create();
        //显示弹框
        alertDialog.show();
    }
}

PermissionInterface

在这里是通过 接口回调来调用 子 Activity 中通过权限申请后的方法功能

public interface PermissionInterface {
    void onPass(int requestCode);
    void noPass(int requestCode);
}

子Activity 中的调用

public class PhoneDetailsActivity extends BaseActivity implements View.OnClickListener {

    private String phone = "1233245325321";
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phone_details);
 
        TextView phoneTextView = findViewById(R.id.tv_phone);
        //设置点击事件
        phoneTextView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.tv_phone:
                //检查是否有权限
                checkPermisson(new PermissionInterface() {
                    @Override
                    public void onPass(int requestCode) {
                        callPhone(phone);
                    }

                    @Override
                    public void noPass(int requestCode) {
                        Toast.makeText(PhoneDetailsActivity.this, "没有同意使用权限", Toast.LENGTH_LONG).show();
                    }
                }, Manifest.permission.CALL_PHONE, 101,true);

                break;
        }

    }


    /**
     * Android 6.0 以上 需要动态申请权限
     * 直接拨打电话
     *
     * @param phone
     */
    private void callPhone(String phone) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + phone);
        intent.setData(data);
        startActivity(intent);
    }

    /**
     * 跳转拨号
     *
     * @param phone
     */
    private void callDialPhone(String phone) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        Uri data = Uri.parse("tel:" + phone);
        intent.setData(data);
        startActivity(intent);
    }

}

以上是关于Android 动态权限申请 BaseActivity 封装 拨打电话的主要内容,如果未能解决你的问题,请参考以下文章

Android6.0动态权限申请

Android 动态申请权限

Android权限篇 Android 6.0动态权限申请

Android系统动态申请权限的机制流程总结

Android动态权限申请

android 6.0动态权限的申请