Android接收和發(fā)送短信的實(shí)現(xiàn)代碼
Android收到短信時(shí)會(huì)廣播android.provider.Telephony.SMS_RECEIVED消息,因此只要定義一個(gè)Receiver,收聽該消息,就能接收短信。
<receiver android:name=".smsReceiver" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
還可以為intent-filter加上一個(gè)優(yōu)先級(jí):
<intent-filter android:priority="100">
這樣,由于優(yōu)先級(jí)較高,應(yīng)用將先于系統(tǒng)接收到android.provider.Telephony.SMS_RECEIVED消息。
Java文件:
package com.hzhi.smsReceiver; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; public class smsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 短信內(nèi)容 StringBuilder strBody = new StringBuilder(); // 短信時(shí)間 String strTime = new String(); // 短信發(fā)件人 StringBuilder number = new StringBuilder(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] _pdus = (Object[]) bundle.get("pdus"); SmsMessage[] message = new SmsMessage[_pdus.length]; for (int i = 0; i < _pdus.length; i++) { message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]); } for (SmsMessage currentMessage : message) { strBody.append(currentMessage.getDisplayMessageBody()); number.append(currentMessage.getDisplayOriginatingAddress()); strTime = formatter.format(new Date(currentMessage.getTimestampMillis())); } String smsBody = strBody.toString(); String smsNumber = number.toString(); Log.v("NUMBER=", smsNumber); Log.v("TIME=", strTime); Log.v("BODY=", smsBody); // 取消消息 this.abortBroadcast(); } } }
接收到消息后,通過Intent.getExtras()方法獲得Intent的Extras(Bundle變量),再使用Bundle.get("pdus")得到短信數(shù)組。為什么是短信數(shù)組呢?這是因?yàn)橛行┒绦艃?nèi)容比較長(zhǎng),所以需要一個(gè)數(shù)組來存儲(chǔ)。對(duì)數(shù)組中的每一個(gè)元素,再分別取出短信內(nèi)容、短信來源號(hào)碼、短信時(shí)間。其中,這些元素的短信來源號(hào)碼和短信時(shí)間都是一樣的,短信內(nèi)容不一樣,需要拼接起來,構(gòu)成一條完整的短信的內(nèi)容。
最后,this.abortBroadcast()取消android.provider.Telephony.SMS_RECEIVED消息。如果為intent-filter設(shè)置了較高的優(yōu)先級(jí),應(yīng)用先于系統(tǒng)接收到android.provider.Telephony.SMS_RECEIVED消息,然后再將該消息丟棄,這樣,系統(tǒng)就不會(huì)收到android.provider.Telephony.SMS_RECEIVED消息,也不會(huì)發(fā)出短信的提示音、震動(dòng)等。如果沒有設(shè)置優(yōu)先級(jí),系統(tǒng)將首先收到android.provider.Telephony.SMS_RECEIVED消息,發(fā)出短信的提示音、震動(dòng)等,然后應(yīng)用再收到短信。
// 發(fā)送短信 public void sendMsg(){ String content = edtSend.getText().toString(); SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessage(content); for (String text : divideContents) { smsManager.sendTextMessage(smsWidget.str_number, null, text, null, null); } }
首先獲得一個(gè)SmsManager實(shí)例;再用divideMessage()方法將短信內(nèi)容(content)劃分成幾個(gè)部分,這是因?yàn)槿绻绦艃?nèi)容太長(zhǎng),可能會(huì)超出允許發(fā)送的最大長(zhǎng)度,這時(shí)就需要把短信內(nèi)容劃分成幾個(gè)字符串,一般情況下,內(nèi)容都不會(huì)超過最大長(zhǎng)度,所以還是一個(gè)字符串;最后,對(duì)所有的字符串,使用sendTextMessage()方法發(fā)送,其中smsWidget.str_number是對(duì)方號(hào)碼,text是每一個(gè)字符串。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類
- Android使用MobSDK短信驗(yàn)證
- Android實(shí)現(xiàn)短信驗(yàn)證碼獲取自動(dòng)填寫功能(詳細(xì)版)
- Android實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)攔截讀取功能
- Android開發(fā)工程中集成mob短信驗(yàn)證碼功能的方法
- Android手機(jī)號(hào)注冊(cè)、綁定手機(jī)號(hào)獲取短信驗(yàn)證碼實(shí)例
- Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
- Android如何通過手機(jī)自動(dòng)獲取短信驗(yàn)證碼
- android教程之intent的action屬性使用示例(intent發(fā)短信)
- Android實(shí)戰(zhàn)教程第九篇之短信高效備份
相關(guān)文章
詳解升級(jí)Android Studio3.0時(shí)遇到的幾個(gè)問題
本篇文章主要介紹了升級(jí)Android Studio3.0時(shí)遇到的幾個(gè)問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10詳解用RxJava實(shí)現(xiàn)事件總線(Event Bus)
本篇文章主要介紹了用RxJava實(shí)現(xiàn)事件總線(Event Bus),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Android底部菜單欄實(shí)現(xiàn)的實(shí)例代碼
這篇文章主要介紹了Android底部菜單欄實(shí)現(xiàn)的實(shí)例代碼,本文通過使用RadioGroup來實(shí)現(xiàn)底部導(dǎo)航菜單欄?,F(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Android實(shí)現(xiàn)可以展開的TextView
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可以展開的TextView,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11解決Fedora14下eclipse進(jìn)行android開發(fā),ibus提示沒有輸入窗口的方法詳解
本篇文章是對(duì)Fedora14下eclipse進(jìn)行android開發(fā),ibus提示沒有輸入窗口的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android開發(fā)Jetpack組件LiveData使用講解
LiveData是Jetpack組件的一部分,更多的時(shí)候是搭配ViewModel來使用,相對(duì)于Observable,LiveData的最大優(yōu)勢(shì)是其具有生命感知的,換句話說,LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動(dòng)生命周期狀態(tài)的時(shí)候才會(huì)更新數(shù)據(jù)2022-08-08音量控制鍵控制的音頻流(setVolumeControlStream)描述
當(dāng)開發(fā)多媒體應(yīng)用或者游戲應(yīng)用的時(shí)候,需要使用音量控制鍵來設(shè)置程序的音量大小,在Android系統(tǒng)中有多種音頻流,感興趣的朋友可以了解下2013-01-01MPAndroidChart 自定義圖表繪制使用實(shí)例
這篇文章主要為大家介紹了MPAndroidChart 自定義圖表繪制使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09