收發短信應該是每個手機最基本的功能之一了,即使是許多年前的老手機也都會具備這項功能,而Android 作為出色的智能手機操作系統,自然也少不了在這方面的支持。今天我們開始自己創建一個簡單的發送和接收短信的應用。
目錄導航
接收短信
項目的結構如下:一個簡單的接收和發送短信的功能
一、定義一個接收短信的廣播:當手機接收到一條短信的時候,系統會發出一條值為android.provider.Telephony.SMS_RECEIVED 的廣播,這條廣播里攜帶着與短信相關的所有數據。
// 接收短信的廣播 class MessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Object[] pdus = (Object[]) bundle.get("pdus"); // 提取短信消息 SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } String address = messages[0].getOriginatingAddress(); // 獲取發送方號碼 String fullMessage = ""; for (SmsMessage message : messages) { fullMessage += message.getMessageBody(); // 獲取短信內容 } textView.setText("address; " + address + ", message: " + fullMessage); abortBroadcast(); } }
二、 注冊廣播,這里我們動態在代碼中注冊:
// 注冊接收廣播 IntentFilter intentFilter1 = new IntentFilter(); intentFilter1.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); intentFilter1.addAction("android.provider.Telephony.SMS_RECEIVED"); messageReceiver = new MessageReceiver(); registerReceiver(messageReceiver, intentFilter1);
三、 聲明權限:
<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" />
發送短信
一、 發送短信:用getDefault方法得到SmsManager對象,調用sendTextMessage方法發送短信
// 發送短信 public void send(View view) { SmsManager smsManager = SmsManager.getDefault(); String destinationAddress = "15527100207"; String text = "我愛你!"; Intent intent1 = new Intent(SENT_SMS_ACTION); PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, intent1, 0); Intent intent2 = new Intent(DELIVERY_SMS_ACTION); PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 0, intent2, 0); smsManager.sendTextMessage(destinationAddress, null, text, sentIntent, deliveryIntent); // aidl服務,進程間的通信 }
我們具體了解一下sendTextMessage方法一個參數的含義:
public void sendTextMessage(String destinationAddress, String scAddress, String text,PendingIntent sentIntent, PendingIntent deliveryIntent) destinationAddress: // 目的地,也就是對方的手機號 scAddress: // 服務中心地址,為空的話就是默認的SMSC text: // 發送消息的具體內容 sentIntent: // 當消息成功或者失敗發送時,就發起這個廣播 deliveryIntent: // 當消息到達目的地時,就發起這個廣播
三、 sentIntent的廣播:
// 發送短信的狀態廣播 class MessageBroadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 一個10位數的號碼發送,也能成功,但是對方沒有接收短信。 if (getResultCode() == RESULT_OK) { Toast.makeText(MainActivity.this, "發送成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "發送失敗!", Toast.LENGTH_SHORT).show(); } } }
四、 deliveryIntent的廣播:
// 當消息被傳遞給收件人時 class DeliveryBroadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(MainActivity.this, "對方接收短信成功!", Toast.LENGTH_SHORT).show(); } }
友情鏈接
