西斯莫 發表於 2025-11-18 08:52:29

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>前言</li><li>一、Intent与系统权限</li><ul class="second_class_ul"><li>1.1 隐式意图</li><li>1.2 系统权限机制</li></ul><li>二、实战一:打电话功能实现(两种方式)</li><ul class="second_class_ul"><li>2.1 方式一:直接拨号(ACTION_CALL)</li><ul class="third_class_ul"><li>2.1.1 步骤1:声明静态权限(AndroidManifest.xml)</li><li>2.1.2 步骤2:代码实现</li></ul><li>2.2 方式二:跳转到拨号盘(ACTION_DIAL)</li><ul class="third_class_ul"><li>2.2.1 代码实现(无需动态权限)</li><li>2.2.2 两种方式对比表</li></ul></ul><li>三、实战二:发短信功能实现</li><ul class="second_class_ul"><li>3.1 步骤1:声明静态权限</li><ul class="third_class_ul"></ul><li>3.2 步骤2:代码实现</li><ul class="third_class_ul"></ul><li>3.4 关键注意事项</li><ul class="third_class_ul"></ul></ul></ul></div><p class="maodian"></p><h2>前言</h2>
<ul><li>本文将聚焦<strong>系统级功能调用</strong>&mdash;&mdash;打电话与发短信。这两个功能是移动应用的核心基础能力,本质是通过<code>Intent</code>(意图)唤醒Android系统自带的电话/短信应用,实现跨应用交互。</li><li>对于后端开发者,系统功能调用可类比&ldquo;后端接口调用第三方服务&rdquo;(如调用短信平台API、支付接口):<code>Intent</code>相当于&ldquo;请求参数&rdquo;,系统应用相当于&ldquo;第三方服务&rdquo;,权限申请相当于&ldquo;接口调用授权&rdquo;,整个流程遵循&ldquo;请求&rarr;授权&rarr;执行&rdquo;的逻辑。</li></ul>
<p class="maodian"></p><h2>一、Intent与系统权限</h2>
<p>调用系统功能的核心是<code>Intent</code>的&ldquo;隐式意图&rdquo;(无需指定具体Activity,只声明动作和数据),再配合Android的&ldquo;权限机制&rdquo;(保护用户隐私,需明确申请敏感权限)。</p>
<p class="maodian"></p><h3>1.1 隐式意图</h3>
<p>隐式意图不直接指定目标组件(如系统电话应用的Activity),而是通过<code>Action</code>(动作)和<code>Data</code>(数据)描述&ldquo;要做什么&rdquo;,由Android系统匹配对应的系统应用来执行。</p>
<table><thead><tr><th>核心要素</th><th>作用</th><th>示例(打电话)</th></tr></thead><tbody><tr><td><code>Action</code></td><td>声明要执行的动作(如打电话、发短信)</td><td><code>Intent.ACTION_CALL</code>(直接拨号)</td></tr><tr><td><code>Data</code></td><td>传递动作所需的数据(如电话号码、收件人)</td><td><code>Uri.parse(&quot;tel:666666&quot;)</code>(目标号码)</td></tr></tbody></table>
<p class="maodian"></p><h3>1.2 系统权限机制</h3>
<p>打电话、发短信属于&ldquo;敏感权限&rdquo;(涉及用户通信隐私和费用),Android 6.0(API 23)及以上版本要求<strong>动态申请权限</strong>(仅在Manifest中声明不够,需在代码中弹窗询问用户授权)。</p>
<table><thead><tr><th>权限类型</th><th>声明方式</th><th>适用场景</th></tr></thead><tbody><tr><td>静态权限</td><td>在AndroidManifest.xml中声明</td><td>低风险功能(如访问网络、读取外部存储)</td></tr><tr><td>动态权限</td><td>代码中申请+用户手动授权</td><td>高风险功能(如打电话、发短信、获取位置)</td></tr></tbody></table>
<p class="maodian"></p><h2>二、实战一:打电话功能实现(两种方式)</h2>
<p>打电话有两种常用实现方式:<strong>直接拨号</strong>(无需用户确认,需危险权限)和<strong>跳转到拨号盘</strong>(用户手动点击拨打,需普通权限),可根据场景选择。</p>
<p class="maodian"></p><h3>2.1 方式一:直接拨号(ACTION_CALL)</h3>
<p>直接唤醒系统电话应用并拨打指定号码,无需用户额外操作,但需申请<code>CALL_PHONE</code>危险权限。</p>
<p class="maodian"></p><h4>2.1.1 步骤1:声明静态权限(AndroidManifest.xml)</h4>
<p>在<code>manifests/AndroidManifest.xml</code>中添加权限声明(放在<code>&lt;application&gt;</code>标签外):</p>
<div class="jb51code"><pre class="brush:plain;">&lt;!-- 打电话权限(危险权限) --&gt;
&lt;uses-permission android:name="android.permission.CALL_PHONE" /&gt;
</pre></div>
<p class="maodian"></p><h4>2.1.2 步骤2:代码实现</h4>
<p>以下是完整实现(含动态权限申请):</p>
<div class="jb51code"><pre class="brush:java;">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 &gt; 0 &amp;&amp; grantResults == PackageManager.PERMISSION_GRANTED) {
                callPhoneDirect("666666");
            } else {
                // 用户拒绝授权,提示无法使用功能
                Toast.makeText(this, "未授权打电话权限,功能无法使用", Toast.LENGTH_SHORT).show();
            }
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>2.2 方式二:跳转到拨号盘(ACTION_DIAL)</h3>
<p>仅打开系统拨号盘并填充号码,需用户手动点击&ldquo;拨打&rdquo;按钮,无需动态权限(仅需静态声明,甚至可省略),更安全。</p>
<p class="maodian"></p><h4>2.2.1 代码实现(无需动态权限)</h4>
<div class="jb51code"><pre class="brush:java;">// 按钮点击事件中直接执行
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);
    }
});
</pre></div>
<p class="maodian"></p><h4>2.2.2 两种方式对比表</h4>
<table><thead><tr><th>实现方式</th><th>核心Action</th><th>权限要求</th><th>优点</th><th>缺点</th></tr></thead><tbody><tr><td>直接拨号</td><td><code>Intent.ACTION_CALL</code></td><td>动态申请<code>CALL_PHONE</code>权限</td><td>操作便捷,无需用户额外点击</td><td>风险高(误触会产生费用),需处理权限</td></tr><tr><td>跳转拨号盘</td><td><code>Intent.ACTION_DIAL</code></td><td>无需动态权限(静态声明可选)</td><td>安全(用户确认后拨打),无权限风险</td><td>多一步用户操作</td></tr></tbody></table>
<p class="maodian"></p><h2>三、实战二:发短信功能实现</h2>
<p>发短信功能通过<code>ACTION_SENDTO</code>指定收件人,配合<code>.putExtra(&quot;sms_body&quot;)</code>传递默认短信内容,用户可修改后发送,权限要求低于打电话。</p>
<p class="maodian"></p><h3>3.1 步骤1:声明静态权限</h3>
<p>发短信的<code>SEND_SMS</code>权限属于危险权限,但<code>ACTION_SENDTO</code>方式会跳转到系统短信应用,由系统应用执行发送操作,<strong>无需申请动态权限</strong>(仅需在Manifest中声明静态权限,部分设备可不声明):</p>
<div class="jb51code"><pre class="brush:xml;">&lt;!-- 发短信权限(静态声明即可,无需动态申请) --&gt;
&lt;uses-permission android:name="android.permission.SEND_SMS" /&gt;
</pre></div>
<p class="maodian"></p><h3>3.2 步骤2:代码实现</h3>
<div class="jb51code"><pre class="brush:java;">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);
    }
});
</pre></div>
<p>点击&ldquo;发短信&rdquo;按钮后,会自动打开系统短信应用:</p>
<ul><li>收件人已填充为&ldquo;10086&rdquo;;</li><li>短信内容已填充为&ldquo;java1&rdquo;;</li><li>用户可修改号码或内容,点击发送即可。</li></ul>
<p class="maodian"></p><h3>3.4 关键注意事项</h3>
<ul><li>协议格式:<code>smsto:</code>不能省略,否则系统无法识别是&ldquo;发送短信&rdquo;动作,可能跳转错误应用。</li><li>内容传递:必须使用<code>intent.putExtra(&quot;sms_body&quot;, 内容)</code>,<code>key</code>固定为<code>sms_body</code>(系统短信应用只识别该key)。</li><li>权限说明:若直接使用<code>SmsManager</code>类发送短信(不跳转到系统应用),则需动态申请<code>SEND_SMS</code>权限,推荐新手使用跳转到系统应用的方式(简单且安全)。</li></ul>
<p>到此这篇关于Android系统中调用电话和短信功能的实现方法的文章就介绍到这了,更多相关Android调用电话和短信功能内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Android使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信界面</li><li>android ContentResolver获取手机电话号码和短信内容</li><li>Android 实现自动打电话与发短信的实例</li><li>Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码</li><li>Android中简单的电话管理与短信管理App编写实例</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Android系统中调用电话和短信功能的实现方法