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:点击短信按钮崩溃,电话/自定义按钮正常
常见原因
- 权限缺失:发送短信需要
SEND_SMS权限,Android 6.0(API 23)及以上还需动态申请权限,未声明或未申请会触发SecurityException导致崩溃。 - 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
相关产品推荐
相关产品推荐

