欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发拨打电话功能实现方案

程序员文章站 2022-07-03 09:49:31
Android拨打电话 1 在Manifest清单中配置拨号权限 *注意: 在所有版本的 Android 中,您的应用都需要在其应用清单中同时声明它需要的正常权限...

Android拨打电话


1 在Manifest清单中配置拨号权限


*注意:
在所有版本的 Android 中,您的应用都需要在其应用清单中同时声明它需要的正常权限和危险权限

如果设备运行的是 Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。

如果设备运行的是 Android 6.0 或更高版本,或者应用的目标 SDK 为 23 或更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。


2 在事件中进行运行时授权

// 检查是否获得了权限
   if (ContextCompat.checkSelfPermission(MainActivity.this,
           Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
       // 若没有获得授权,申请授权
       if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
               Manifest.permission.CALL_PHONE)) {
// 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true.
//  如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false.
// 如果设备策略禁止应用拥有这条权限, 这个方法也返回false.
// 弹窗需要解释为何需要该权限,再次请求授权
           Toast.makeText(MainActivity.this, "请授权!", Toast.LENGTH_LONG).show();

           // 帮跳转到该应用的设置界面,让用户手动授权
           Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
           Uri uri = Uri.fromParts("package", getPackageName(), null);
           intent.setData(uri);
           startActivity(intent);
       }else{
           // 不需要解释为何需要该权限,直接请求授权
           ActivityCompat.requestPermissions(MainActivity.this,
                   new String[]{Manifest.permission.CALL_PHONE},
                   MY_PERMISSIONS_REQUEST_CALL_PHONE);
       }
   }else {
       // 已经获得授权,可以打电话
       callPhone();
   }

3 实现打电话的功能

private void callPhone(){
// 通过intent跳转到拨打电话的界面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
Uri phoneNum = Uri.parse("tel:" + str);
intent.setData(phoneNum);
startActivity(intent);
}

4 处理权限请求响应回调

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 授权成功,继续打电话
                    CallPhone();
                } else {
                    // 授权失败!
                    Toast.makeText(this, "授权失败!", Toast.LENGTH_LONG).show();
                }
                break;
            }
        }

}