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

Android应用点击按钮崩溃:ActivityNotFoundException问题求助

问题原因及修复方案

核心问题

崩溃的直接原因是电话URI格式错误:代码中拼接的是"tel" + call,正确的电话URI规范要求以tel:开头(冒号不可省略),错误格式导致系统找不到能处理该Intent的应用。另外使用ACTION_CALL需要额外权限,部分设备也可能限制直接拨打电话的操作。

修复步骤

1. 修正URI格式

将按钮点击事件里的字符串拼接代码修改为:

String s = "tel:" + call; // 补充冒号,符合tel URI标准格式

2. 添加并处理拨打电话权限

在AndroidManifest.xml中声明权限:

<uses-permission android:name="android.permission.CALL_PHONE" />

如果应用的targetSdkVersion >=23(Android 6.0及以上),还需要动态申请权限:

callBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 检查是否已获取权限
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // 发起权限申请
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CALL_PHONE}, 100);
            return;
        }
        // 权限已获取,执行拨打电话逻辑
        String s = "tel:" + call;
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse(s));
        startActivity(intent);
    }
});

// 处理权限申请结果
@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 s = "tel:" + call;
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse(s));
            startActivity(intent);
        } else {
            Toast.makeText(getContext(), "需要拨打电话权限才能使用该功能", Toast.LENGTH_SHORT).show();
        }
    }
}

3. 兼容性备选方案:使用ACTION_DIAL(无需权限)

如果不需要直接拨打电话,仅需打开拨号界面让用户手动确认,可改用ACTION_DIAL,这种方式无需申请权限,兼容性更强:

callBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String s = "tel:" + call;
        Intent intent = new Intent(Intent.ACTION_DIAL);
        intent.setData(Uri.parse(s));
        startActivity(intent);
    }
});

4. 额外优化:避免无拨号应用的崩溃

添加Intent可处理性检查,防止设备无拨号应用时再次崩溃:

String s = "tel:" + call;
Intent intent = new Intent(Intent.ACTION_CALL); // 或ACTION_DIAL
intent.setData(Uri.parse(s));
if (intent.resolveActivity(getContext().getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(getContext(), "未找到可用的拨号应用", Toast.LENGTH_SHORT).show();
}

内容的提问来源于stack exchange,提问作者Md Ahaduzzaman Apon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:30