序
今天是 2020 年的第一场大雪 ,朋友圈都在发 瑞雪兆丰年 。
直接上代码
1. 直接拨打电话
public void callPhone(String phoneNum) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
startActivity(intent);
}
PS :需要申请权限
<uses-permission android:name="android.permission.CALL_PHONE" />
2.跳转拨打电话界面
public void callPhone(String phoneNum) {
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
startActivity(intent);
}
PS :无需申请权限
在权限申请的时候 ,正常来说第一次点击需要弹出系统申请权限的一个弹窗 。你允许之后再次点击拨打电话功能就可以进行拨号了 。
AOP 权限申请 (切面编程)
可能在权限申请功能对这个需求要求不太高 。举个例子 ,如果项目中需要登录权限 ,比如进入订单或者收藏历史记录页面 ,需要先进行登录获取 token 之后才能进入页面 ,在这种情况下如果第一次跳转到登录页面 ,登录完成之后需要再次点击才能进入页面 。流程可能就有点繁琐了 。
AOP 切面编程 可以自己先百度一下 。 总之就是可以完美解决这些问题 。
1.申请权限注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission {
String[] value() default {};
boolean forceGoOn() default false;
boolean showCustomDialog() default true;
}
2. Aspect
@Aspect
public class PermissionAspect {
private static final String POINTCUT_METHOD_DEFAULT = "execution(@com.qsmaxmin.qsbase.common.aspect.Permission * *(..)) && @annotation(permission)";
@Around(POINTCUT_METHOD_DEFAULT) public Object onPermissionExecute(final ProceedingJoinPoint joinPoint, final Permission permission) throws Throwable {
startRequestPermission(joinPoint, permission);
return null;
}
/**
* 申请权限
*/
private void startRequestPermission(final ProceedingJoinPoint joinPoint, final Permission permission) {
if (permission == null) return;
String[] values = permission.value();
if (values.length < 1) {
return;
}
FragmentActivity activity = QsHelper.getInstance().getScreenHelper().currentActivity();
if (activity != null) {
PermissionBuilder builder = PermissionUtils.getInstance().createBuilder();
for (String permissionStr : values) {
builder.addWantPermission(permissionStr);
}
builder.setActivity(activity)//
.setShowCustomDialog(permission.showCustomDialog())//
.setListener(new PermissionCallbackListener() {
@Override public void onPermissionCallback(int requestCode, boolean isGrantedAll) {
if (permission.forceGoOn() || isGrantedAll) {
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
} else {
L.e("PermissionAspect", "current permission is not allow, you can set @Permission(forceGoOn = true), it will run the method whether permission is granted!!");
}
}
});
builder.start();
}
}
}
3. 具体使用
public class MainActivity extends QsActivity {
private Button btn_call;
@Override
public int layoutId() {
return R.layout.activity_main;
}
@Override
public void initData(Bundle savedInstanceState) {
btn_call = findViewById(R.id.btn_call);
btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callPhone("13501299453");
}
});
}
/**
* 拨打电话
* @param phoneNum
*/
@Permission(value = {Manifest.permission.CALL_PHONE})
public void callPhone(String phoneNum) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
startActivity(intent);
}
}
可以参考demo
QsBaseOne
PS :给所有人留言 ,这个框架可以用一个月时间突突突一遍 。
END