短信(一)

本篇介紹android短信的接收,發送和攔截

當手機收到短信時,系統會發送一條廣播android.provider.Telephony.SMS_RECEIVED,所以我們寫一個接收器,當收到廣播時去獲取短信的內容就好(發現有一些app在獲取驗證碼時會自動將短信中的驗證碼提取出來填上,很方便,估計就是這麼做的)

Class SmsReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context,Intent intent){

Bundle bundle = intent.getExtras();//裏面存了短信信息

Object[] pdus = (Object[])bundle.get("pdus");//把短信內容拿出來

SmsMessage smsMessages = new SmsMessage[pdus.length];

for(int i=0 ; i<smsMessages.length ; i++){

smsMessages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);//這兩個數組是一一對應的

}

String tel_sender = smsMessages[0].getOriginatingAddress();//獲取發送方的電話號

StringBuffer content = new StringBuffer();//用於存放短信的內容

for(SmsMessage smsMessage : smsMessages){

content .append(smsMessage.getMessageBody());//獲取短信內容

}

    }

}

注意導包時import android.telephony.SmsMessage; 不要導gsm.SmsMessage,這個包已經廢棄了

(簡單說下StringBuffer與StringBuilder的區別,StringBuffer線程安全,StringBuilder線程不安全,但StringBuilder效率比StringBuffer高一些)

以上就是廣播接收器的代碼了,獲取到的東西大家可以隨意放到佈局中,佈局代碼就不放上了,隨便發揮。

千萬別忘了加權限<uses-permission android:name="android.permission.RECEIVE_SMS"/>

廣播動態註冊:

IntentFilter filter = new IntentFilter();

filter.addAction("android.provider.Telephony.SMS_RECEIVED");

SmsReceiver receiver = new SmsReceiver();

registerReceiver(receiver,filter);

廣播靜態註冊,在AndroidManifest.xml的application中:

<receiver android.name=".SmsReceiver">

<intent-filter>

<action android.name="android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

</receiver>

在onDestroy中unregisterReceiver(receiver);註銷掉

發送短信和接收差不太多,有幾個不同點

發送的action是SENT_SMS_ACTION,即filter.addAction("SENT_SMS_ACTION");

比如我們用一個button控制發送短信,則在onclick裏可以這麼寫

SmsManager manager = SmsManager.getDefault();

Intent intent = new Intent("SENT_SMS_ACTION");

PendingIntent pendingIntent = PendingIntent.getBroadcast(context,int requestCode,intent,int flag);//requestCode隨便寫應該就可以,flag在介紹Notification的文章中已經說過了,這裏不再贅述

manager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);//最重要的發送

destinationAddress:這是你要發送給的那個電話號

scAddress:短信中心號碼,傳null則爲默認中心號碼(一般是null,不知道有多大用處)

text:短信的內容

sendIntent:把上面的intent放上就行

deliveryIntent:當消息發送到對方手機時這個intent會被廣播(也是PendingIntent)

如果想知道是否發送成功則可以在發送的廣播接收onReceive中判斷getResultCode如果和RESULT_OK相等,則則成功了

短信廣播是有序廣播,所以我們可以攔截掉

加上filter.setPriority(int值);給個優先級然後在onReceive中調用abortBroadcast();中斷廣播就好了

先說這麼多,感謝大家支持。



發佈了36 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章