java,Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:1234567890"));,intent.putExtra("sms_body", "Hello, this is a test message!");,startActivity(intent);,
“
在AndroidManifest.xml文件中添加以下权限,以允许应用发送短信:
<uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/>
1、使用Intent启动系统短信界面
步骤:
创建一个Intent对象,设置其Action为Intent.ACTION_SENDTO
,并指定接收短信的号码(在URI中以“smsto:”为前缀)。
使用putExtra
方法将短信内容添加到Intent中。
调用startActivity
方法启动系统短信界面,用户可以在其中编辑短信并发送。
代码示例:
private void sendMessage(String number, String message) { // 创建Intent对象,指定发送到的号码和动作 Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + number)); // 添加短信内容 smsIntent.putExtra("sms_body", message); // 启动系统短信界面 startActivity(smsIntent); }
注意事项:此方法不会自动发送短信,而是打开系统短信应用的编辑界面,用户需要手动点击发送按钮,由于手机可能存在双卡双待、网络短信等情况,用户可能需要选择发送的卡。
2、使用SmsManager发送短信
步骤:
获取SmsManager
实例。
拆分短信内容(如果短信长度超过运营商限制,通常中文70字节或英文160字节),可以使用SmsManager
的divideMessage
方法进行拆分。
遍历拆分后的短信内容片段,使用SmsManager
的sendTextMessage
方法发送每一段短信。
可以注册广播接收器来监听短信发送状态和送达状态。
代码示例:
private void sendSMS(String phoneNumber, String message) { // 获取短信管理器 android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); // 拆分短信内容 List<String> divideContents = smsManager.divideMessage(message); for (String text : divideContents) { smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI); } }
注意事项:此方法不会启动系统短信发送界面,但由于短信在发送成功、失败、接收者接收成功、失败、是否已读等消息时,安卓系统都会通过广播形式向系统所有app进行广播,所以仍然会在系统自带短信功能中留下痕迹,在使用SmsManager
发送短信时,需要自定义短信发送广播接收事件、短信送达广播接收事件,另外要注意将短信按运营商的限制长度进行分割。
1、问题:为什么使用Intent启动系统短信界面的方式不能自动发送短信?
解答:使用Intent启动系统短信界面是为了让用户有更多的控制权和灵活性,比如可以选择发送的卡、编辑短信内容后再决定是否发送等,自动发送短信可能会带来一些安全和隐私问题,例如误发重要信息等,而且不同的手机和系统版本可能对自动发送短信有不同的限制和处理方式,所以这种方式更通用和安全。
2、问题:如何判断短信是否发送成功和接收成功?
解答:当使用SmsManager
发送短信时,可以通过注册广播接收器来判断短信是否发送成功和接收成功,对于发送状态,可以在发送广播接收器的onReceive
方法中根据getResultCode()
的值来判断,例如Activity.RESULT_OK
表示发送成功,其他值表示不同的错误类型,对于接收状态,同样可以在接收广播接收器的onReceive
方法中进行处理,当接收到特定的广播(如定义的“DELIVERED_SMS_ACTION”)且结果码为Activity.RESULT_OK
时,表示接收成功。