當(dāng)手機(jī)接收到一條短信的時(shí)候徐伐,系統(tǒng)就會(huì)發(fā)出一條值為
android.provider.Telephony.SMS_RECEIVED
的廣播,這條廣播里攜帶著與短信相關(guān)的所有數(shù)據(jù)扫夜,系統(tǒng)發(fā)出的短信廣播是一條有序廣播
接收短信
- 在活動(dòng)創(chuàng)建的時(shí)候俘闯,組件初始化操作并注冊(cè)接收短信的監(jiān)聽器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
....
eceiveFilter = new IntentFilter();
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
messageReceiver = new MessageReceiver();
//動(dòng)態(tài)注冊(cè)監(jiān)聽器
registerReceiver(messageReceiver, receiveFilter);
}
- 動(dòng)態(tài)注冊(cè)廣播接收器,需要在活動(dòng)銷毀時(shí)慌随,取消注冊(cè)
@Override
protected void onDestroy() {
super.onDestroy();
//取消注冊(cè)廣播接收器
unregisterReceiver(messageReceiver);
}
- 實(shí)現(xiàn)接收短信的廣播接收器
class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 從Intent參數(shù)中取出一個(gè)Bundle對(duì)象
Bundle bundle = intent.getExtras();
//使用pdu密鑰來提取一個(gè)SMS pdus數(shù)組,其中每一個(gè)pdu都表示一條短信消息
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
//使用SmsMessage()的靜態(tài)方法createFromPdu()方法將每一個(gè)pdu字節(jié)數(shù)組轉(zhuǎn)換為SmsMessage對(duì)象
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
//調(diào)用SmsMessage對(duì)象的getOriginatingAddress()方法就可以獲取到短信的發(fā)送發(fā)號(hào)碼
String address = messages[0].getOriginatingAddress();
String fullMessage = "";
for (SmsMessage message : messages) {
//調(diào)用SmsMessage對(duì)象的getMessageBody()方法就可以獲取到短信的內(nèi)容躺同,將每一個(gè)SmsMessage對(duì)象中的短信內(nèi)容拼接起來阁猜,就組成了一條完整的短信內(nèi)容
fullMessage += message.getMessageBody();
}
//給界面上的組件設(shè)置內(nèi)容,將信息發(fā)送方的電話號(hào)碼和信息內(nèi)容顯示在界面上
sender.setText(address);
content.setText(fullMessage);
}
}
- 接收短信要聲明權(quán)限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
攔截短信
系統(tǒng)發(fā)出的短信廣播是一條有序廣播
- 提高我們自定義信息接收器的優(yōu)先級(jí)蹋艺,讓它能夠先于系統(tǒng)短信程序接收到短信廣播
receiveFilter = new IntentFilter();
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
//設(shè)置優(yōu)先級(jí)
receiveFilter.setPriority(100);
messageReceiver = new MessageReceiver();
registerReceiver(messageReceiver, receiveFilter);
- 自定義的信息接收器接收到廣播程序剃袍,處理完邏輯以后,需要終止廣播的繼續(xù)傳遞
sender.setText(address);
content.setText(fullMessage);
//終止此廣播的繼續(xù)傳遞
abortBroadcast();
攔截短信的功能謹(jǐn)慎使用捎谨,防止丟失重要的數(shù)據(jù)
發(fā)送短信
- 發(fā)送普通文本內(nèi)容內(nèi)的短信民效,使用的是
SmsMessage
類的sendTextMessage()
方法
//首先調(diào)用SmsMessage類的getDefault()方法獲取到SmsMessage的實(shí)例對(duì)象
SmsManager smsManager = SmsManager.getDefault();
/*
* destinationAddress:手機(jī)號(hào)碼
* scAddress:服務(wù)中心號(hào)碼
* text:短信內(nèi)容
* sentIntent:PendingIntent,信息發(fā)送成功或失敗時(shí)觸發(fā)
* deliveryIntent:PendingIntent涛救,信息抵達(dá)收件人觸發(fā)
*/
smsManager.sendTextMessage((String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent);
- 當(dāng)發(fā)送過長文本內(nèi)容的短信時(shí)研铆,首先將信息內(nèi)容切割(不超過一條短信的長度要求),而后發(fā)送
//切割短信內(nèi)容
ArrayList<String> texts = smsManager.divideMessage(String text);
//發(fā)送短信內(nèi)容(參數(shù)代表的意義相同)
smsManager.sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)
短信發(fā)送成功的提示
發(fā)送短信時(shí)州叠,第四個(gè)參數(shù)sentIntent,是一個(gè)PendingIntent類型凶赁,此參數(shù)在短信發(fā)送成功或失敗時(shí)觸發(fā)
當(dāng)信息發(fā)送成功或失敗時(shí)咧栗,我們發(fā)出一個(gè)廣播,通過監(jiān)聽這個(gè)廣播來實(shí)現(xiàn)通知用戶信息是否發(fā)送成功
- 接收廣播的邏輯實(shí)現(xiàn)
class SendStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() == RESULT_OK) {
Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(context, "Send failed", Toast.LENGTH_LONG)
.show();
}
}
}
- 注冊(cè)廣播接收器以及給按鈕添加發(fā)送短信的功能邏輯
//注冊(cè)廣播接收器虱肄,指定監(jiān)聽的廣播內(nèi)容
IntentFilter sendFilter = new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendStatusReceiver = new SendStatusReceiver();
registerReceiver(sendStatusReceiver, sendFilter);
//發(fā)送短信致板,并當(dāng)短信發(fā)送成功或失敗時(shí),觸發(fā)發(fā)出指定內(nèi)容的廣播
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SmsManager smsManager = SmsManager.getDefault();
Intent sentIntent = new Intent("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(
MainActivity.this, 0, sentIntent, 0);
smsManager.sendTextMessage(to.getText().toString(), null,
msgInput.getText().toString(), pi, null);
}
});