Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android调用电话和短信功能

Android系统中调用电话和短信功能的实现方法

作者:珹洺

本文将介绍系统级功能调用:打电话与发短信,这两个功能是移动应用的核心基础能力,本质是通过Intent(意图)唤醒Android系统自带的电话/短信应用,实现跨应用交互,文章通过代码示例讲解的非常详细,需要的朋友可以参考下

前言

一、Intent与系统权限

调用系统功能的核心是Intent的“隐式意图”(无需指定具体Activity,只声明动作和数据),再配合Android的“权限机制”(保护用户隐私,需明确申请敏感权限)。

1.1 隐式意图

隐式意图不直接指定目标组件(如系统电话应用的Activity),而是通过Action(动作)和Data(数据)描述“要做什么”,由Android系统匹配对应的系统应用来执行。

核心要素作用示例(打电话)
Action声明要执行的动作(如打电话、发短信)Intent.ACTION_CALL(直接拨号)
Data传递动作所需的数据(如电话号码、收件人)Uri.parse("tel:666666")(目标号码)

1.2 系统权限机制

打电话、发短信属于“敏感权限”(涉及用户通信隐私和费用),Android 6.0(API 23)及以上版本要求动态申请权限(仅在Manifest中声明不够,需在代码中弹窗询问用户授权)。

权限类型声明方式适用场景
静态权限在AndroidManifest.xml中声明低风险功能(如访问网络、读取外部存储)
动态权限代码中申请+用户手动授权高风险功能(如打电话、发短信、获取位置)

二、实战一:打电话功能实现(两种方式)

打电话有两种常用实现方式:直接拨号(无需用户确认,需危险权限)和跳转到拨号盘(用户手动点击拨打,需普通权限),可根据场景选择。

2.1 方式一:直接拨号(ACTION_CALL)

直接唤醒系统电话应用并拨打指定号码,无需用户额外操作,但需申请CALL_PHONE危险权限。

2.1.1 步骤1:声明静态权限(AndroidManifest.xml)

manifests/AndroidManifest.xml中添加权限声明(放在<application>标签外):

<!-- 打电话权限(危险权限) -->
<uses-permission android:name="android.permission.CALL_PHONE" />

2.1.2 步骤2:代码实现

以下是完整实现(含动态权限申请):

public class MainActivity extends AppCompatActivity {

    // 权限请求码(自定义,需唯一)
    private static final int REQUEST_CALL_PERMISSION = 100;
    private Button callBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化按钮
        callBtn = findViewById(R.id.call);
        callBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String phoneNum = "666666"; // 目标电话号码
                // 1. 检查是否已获得权限
                if (ContextCompat.checkSelfPermission(MainActivity.this, 
                        Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                    // 2. 权限已授权,执行打电话逻辑
                    callPhoneDirect(phoneNum);
                } else {
                    // 3. 未授权,申请动态权限(弹窗询问用户)
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.CALL_PHONE},
                            REQUEST_CALL_PERMISSION);
                }
            }
        });
    }

    // 直接拨号核心逻辑
    private void callPhoneDirect(String phoneNum) {
        Intent intent = new Intent(Intent.ACTION_CALL);
        // 设置电话号码(tel:是固定协议,不能省略)
        intent.setData(Uri.parse("tel:" + phoneNum));
        startActivity(intent);
    }

    // 监听权限申请结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CALL_PERMISSION) {
            // 用户同意授权
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                callPhoneDirect("666666");
            } else {
                // 用户拒绝授权,提示无法使用功能
                Toast.makeText(this, "未授权打电话权限,功能无法使用", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

2.2 方式二:跳转到拨号盘(ACTION_DIAL)

仅打开系统拨号盘并填充号码,需用户手动点击“拨打”按钮,无需动态权限(仅需静态声明,甚至可省略),更安全。

2.2.1 代码实现(无需动态权限)

// 按钮点击事件中直接执行
callBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String phoneNum = "666666";
        Intent intent = new Intent(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:" + phoneNum));
        startActivity(intent);
    }
});

2.2.2 两种方式对比表

实现方式核心Action权限要求优点缺点
直接拨号Intent.ACTION_CALL动态申请CALL_PHONE权限操作便捷,无需用户额外点击风险高(误触会产生费用),需处理权限
跳转拨号盘Intent.ACTION_DIAL无需动态权限(静态声明可选)安全(用户确认后拨打),无权限风险多一步用户操作

三、实战二:发短信功能实现

发短信功能通过ACTION_SENDTO指定收件人,配合.putExtra("sms_body")传递默认短信内容,用户可修改后发送,权限要求低于打电话。

3.1 步骤1:声明静态权限

发短信的SEND_SMS权限属于危险权限,但ACTION_SENDTO方式会跳转到系统短信应用,由系统应用执行发送操作,无需申请动态权限(仅需在Manifest中声明静态权限,部分设备可不声明):

<!-- 发短信权限(静态声明即可,无需动态申请) -->
<uses-permission android:name="android.permission.SEND_SMS" />

3.2 步骤2:代码实现

Button smsBtn = findViewById(R.id.sms);
smsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String phoneNum = "10086"; // 收件人号码
        String smsContent = "java1"; // 默认短信内容

        // 1. 创建隐式意图,指定动作:发送短信
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        // 2. 设置收件人(smsto:是固定协议,不能省略)
        intent.setData(Uri.parse("smsto:" + phoneNum));
        // 3. 传递默认短信内容(key固定为"sms_body")
        intent.putExtra("sms_body", smsContent);
        // 4. 启动系统短信应用
        startActivity(intent);
    }
});

点击“发短信”按钮后,会自动打开系统短信应用:

3.4 关键注意事项

到此这篇关于Android系统中调用电话和短信功能的实现方法的文章就介绍到这了,更多相关Android调用电话和短信功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文