Android收发短信

来源:互联网 发布:java stringbuffer反转 编辑:程序博客网 时间:2024/05/26 19:17
发送短信

权限要求:

<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(){@Overridepublic 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(){@Overridepublic 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 {@Overridepublic 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方法来解析出所有的短信内容,