Android 拨打电话代码实现 (附加 :AOP切面实现方式)

今天是 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 

发布了57 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37492806/article/details/103851017