Android收发短信

发送短信

权限要求:

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

private void sendSMS(String phoneNumber, String message) {

	PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, SMS.class), 0);
	SmsManager sms = SmsManager.getDefault();
	sms.sendTextMessage(phoneNumber, null, message, pi, null);

}

如果需要监控短信发送的状态,可以使用两个PendingIntent对象和两个BroadcastReceiver对象来实现。

private void sendSMS(String phoneNumber, String message) {

	String SENT = "SMS_SENT";
	String DELIVERED = "SMS_DELIVERED";
 
	PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
 
	PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
 
	//---when the SMS has been sent---
	registerReceiver(new BroadcastReceiver(){
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			switch (getResultCode()) {
			case Activity.RESULT_OK:
				Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
				break;
			case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
				Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
				break;
			case SmsManager.RESULT_ERROR_NO_SERVICE:
				Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
				break;
			case SmsManager.RESULT_ERROR_NULL_PDU:
				Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
				break;
			case SmsManager.RESULT_ERROR_RADIO_OFF:
				Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
				break;
			}
		}
	}, new IntentFilter(SENT));
 
	//---when the SMS has been delivered---
	registerReceiver(new BroadcastReceiver(){
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			switch (getResultCode()) {
			case Activity.RESULT_OK:
				Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
				break;
			case Activity.RESULT_CANCELED:
				Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
				break;
			}
		}
	}, new IntentFilter(DELIVERED));
 
	SmsManager sms = SmsManager.getDefault();
	sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}

上面的代码中,第一个PendingIntent对象(sentPI)用来监视短信的发送(send)过程,当短信发送时,将会触发第一个BroadcastReceiver的onReceive事件,你可以在这里监视发送的状态。第二个PendingIntent对象(deliveredPI)对象用来监视短信的分发(delivery)过程,短信被成功分发后,将会触发第二个BroadcastReceiver的onReceive事件。


如果你不想自己处理发送短信的所有细节,可以使用一个Intent对象来帮助完成发送短信,下面的代码片段展示了如何调用系统内建的短信应用来发送短信。

Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("sms_body", "Content of the SMS goes here...");
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

接受短信


除了可以通过编程来发送短信之外,还可以通过BroadcastReceiver对象来监视短信的接收过程。
要在应用程序里面接收短信,必须在AndroidManifest.xml中添加<receiver>元素,以便应用程序拦截系统接收到的短信。

<receiver android:name=".SmsReceiver">
	<intent-filter>
		<action android:name="android.provider.Telephony.SMS_RECEIVED" />
	</intent-filter>
</receiver>
public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {

		//---get the SMS message passed in---
		Bundle bundle = intent.getExtras();
		SmsMessage[] msgs = null;
		String str = "";

		if (bundle != null) {
			//---retrieve the SMS message received---
			Object[] pdus = (Object[]) bundle.get("pdus");
			msgs = new SmsMessage[pdus.length];
			for (int i=0; i<msgs.length; i++){
				msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
				str += "SMS from " + msgs[i].getOriginatingAddress();
				str += " :";
				str += msgs[i].getMessageBody().toString();
				str += "\n";
			}

			//---display the new SMS message---
			Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
		}
	}
}

当收到短信时,将会调用onReceive()方法,短信内容通过Bundle对象包含在Intent对象里面(onReceive方法的参数),短信以PDU格式存储在对象数组里面,你可以使用SmsMessage对象的createFromPdu方法来解析出所有的短信内容,

要在 Android 上接收短信,可以使用 BroadcastReceiver。以下是一个简单的示例: 1. 创建一个类来扩展 BroadcastReceiver: ``` public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 在此处处理接收到的短信 } } ``` 2. 在 AndroidManifest.xml 文件中注册 BroadcastReceiver: ``` <uses-permission android:name="android.permission.RECEIVE_SMS" /> <application> <receiver android:name=".SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> ``` 3. 在 onReceive() 方法中处理接收到的短信: ``` @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus != null) { for (Object pdu : pdus) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu); String messageBody = smsMessage.getMessageBody(); String phoneNumber = smsMessage.getOriginatingAddress(); // 在此处处理短信内容和发送者号码 } } } } } ``` 请注意,要接收短信,您需要在 AndroidManifest.xml 文件中声明 RECEIVE_SMS 权限。此外,从 Android 4.4 KitKat 开始,只有默认短信应用程序才能接收到 SMS_RECEIVED 意图。如果您的应用程序不是默认短信应用程序,则可以使用 SMS Retriever API 来接收短信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值