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

Android开发:switch分支报错及短信跳转崩溃问题求助

Android调用系统应用常见问题解决

问题1:switch(view.getId())报错“Constant expression required”

原因

Android API 21及以后,资源ID不再是编译期常量(启用AndroidX或新资源ID机制时尤为明显),而Java的switch语句要求case后的表达式必须是编译时常量,因此用view.getId()作为判断条件时会触发该错误。

解决方法

  • 方法一:用if-else替代switch,示例代码:
public void onClick(View view) {
    if (view.getId() == R.id.btn_call) {
        // 处理电话按钮逻辑
    } else if (view.getId() == R.id.btn_sms) {
        // 处理短信按钮逻辑
    } else if (view.getId() == R.id.btn_custom) {
        // 处理自定义按钮逻辑
    }
}
  • 方法二:给每个控件单独设置OnClickListener,避免统一判断ID:
findViewById(R.id.btn_call).setOnClickListener(v -> {
    // 电话按钮逻辑
});
findViewById(R.id.btn_sms).setOnClickListener(v -> {
    // 短信按钮逻辑
});
  • 方法三:若用Kotlin开发,直接使用支持非常量条件的when语句:
override fun onClick(view: View) {
    when(view.id) {
        R.id.btn_call -> // 电话逻辑
        R.id.btn_sms -> // 短信逻辑
        R.id.btn_custom -> // 自定义逻辑
    }
}

问题2:点击短信按钮崩溃,电话/自定义按钮正常

常见原因

  1. 权限缺失:发送短信需要SEND_SMS权限,Android 6.0(API 23)及以上还需动态申请权限,未声明或未申请会触发SecurityException导致崩溃。
  2. Intent配置错误:未指定正确的短信Action,或数据格式不正确,导致系统无法识别短信请求。

解决方法

步骤1:声明静态权限

在AndroidManifest.xml中添加权限声明:

<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 仅跳转短信编辑页无需此权限,直接发送短信必须添加 -->

步骤2:动态申请权限(API 23+)

若应用目标SDK≥23,需在代码中动态申请权限:

private static final int REQUEST_SMS_PERMISSION = 100;

public void onSmsButtonClick(View view) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.SEND_SMS},
                REQUEST_SMS_PERMISSION);
    } else {
        sendSms();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_SMS_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            sendSms();
        } else {
            Toast.makeText(this, "需要短信权限才能发送", Toast.LENGTH_SHORT).show();
        }
    }
}

private void sendSms() {
    String phoneNumber = "10086";
    String message = "测试短信";
    // 方式1:跳转系统短信编辑页(无需权限)
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("smsto:" + phoneNumber));
    intent.putExtra("sms_body", message);
    startActivity(intent);

    // 方式2:直接发送短信(需SEND_SMS权限)
    // SmsManager smsManager = SmsManager.getDefault();
    // smsManager.sendTextMessage(phoneNumber, null, message, null, null);
}

步骤3:检查Intent配置

确保短信Intent的Action正确:

  • 跳转短信编辑页用Intent.ACTION_SENDTO,并设置smsto:开头的Uri;
  • 直接发送短信优先使用SmsManager,而非Intent的ACTION_SEND(若用后者需配置正确的Extra参数)。

内容的提问来源于stack exchange,提问作者King Ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:10:09