You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android电话呼叫功能失效求助:已配置Manifest权限仍无法通话

排查Android电话呼叫功能失效的问题

先揪出你代码里最显眼的问题——权限检查逻辑被你注释掉了!这大概率是功能罢工的核心原因,咱们一步步来梳理解决:

1. 恢复并完善动态权限申请逻辑

从Android 6.0(API 23)开始,CALL_PHONE属于「危险权限」,哪怕你在Manifest里配置了,也必须在运行时向用户申请权限,得到用户同意后才能发起呼叫。你现在直接跳过权限检查就调用startActivity,系统肯定会拦截这个请求。

修改后的点击事件代码应该是这样的:

call = (TextView) findViewById(R.id.GuestPhoneNo1);
call.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String no = call.getText().toString();
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + no));

        // 检查权限是否已授予
        if (ActivityCompat.checkSelfPermission(Accepted_Details.this, 
                Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // 未授权就发起权限申请,100是自定义请求码,后续用来判断结果
            ActivityCompat.requestPermissions(Accepted_Details.this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    100);
            return;
        }
        // 权限已通过,启动呼叫
        startActivity(callIntent);
    }
});

别忘了在你的Accepted_Details Activity里补充权限申请结果的回调:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意权限,再次执行拨号逻辑
            String no = call.getText().toString();
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + no));
            startActivity(callIntent);
        } else {
            // 用户拒绝权限,给个友好提示
            Toast.makeText(this, "需要授予拨号权限才能发起呼叫", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 检查号码格式是否合法

确保TextView里的号码是有效的——比如不要包含空格、特殊符号(除了国际号码用的+号)。可以在获取号码后做个简单清洗:

// 去除号码中非数字和+号的字符
String cleanedNo = no.replaceAll("[^0-9+]", "");
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + cleanedNo));

3. 备选方案:使用ACTION_DIAL打开拨号界面

如果你只是想让用户手动确认拨号,不需要直接发起呼叫,可以改用Intent.ACTION_DIAL,这个不需要CALL_PHONE权限,代码更简洁:

Intent dialIntent = new Intent(Intent.ACTION_DIAL);
dialIntent.setData(Uri.parse("tel:" + no));
startActivity(dialIntent);

4. 再次确认Manifest权限配置

最后再核对下AndroidManifest.xml里的权限是否正确添加,要放在<application>标签外面:

<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- Android 10及以上可添加这个可选权限 -->
<uses-permission android:name="android.permission.CALL_PHONE_PRIVILEGED" />

按上面的步骤排查,应该就能解决你的拨号问题了!

内容的提问来源于stack exchange,提问作者Simi Soman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:48