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



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);
}

}