Android自動填充短信驗(yàn)證碼

項(xiàng)目需求:

Android開發(fā)中用戶登錄往會用到短信驗(yàn)證的功能,如果讓用戶先查看短信,然后再回到界面填寫驗(yàn)證碼,用戶體驗(yàn)不是很好只怎,有時就需要實(shí)現(xiàn)驗(yàn)證碼的自動填寫功能跟衅。

做法:
我以前的做法是先創(chuàng)建一個廣播接收器,接受短信變化的廣播,收到廣播時,再把驗(yàn)證碼提取出來谤饭。

那時有用戶測試反饋他的手機(jī)安裝了其他一些短信應(yīng)用或者手機(jī)本身限制了權(quán)限的情況下,這種方式可能起不了作用炫欺,即使把優(yōu)先級設(shè)高乎完,也不能保證不會被別的應(yīng)用搶先。

以前用戶卸載掉第三方軟件后品洛,就沒再追究了树姨。

現(xiàn)在發(fā)現(xiàn)可以通過監(jiān)聽短信數(shù)據(jù)庫的方式實(shí)現(xiàn)摩桶。監(jiān)聽短信數(shù)據(jù)庫主要是通過ContentObserver這個類來完成。ContentObserver主要是通過Uri來監(jiān)測特定的Databases的表帽揪,當(dāng)ContentObserver所觀察的Uri發(fā)生變化時硝清,便會觸發(fā)它。ContentObserver內(nèi)容觀察者转晰,可監(jiān)聽觀察特定Uri指向的數(shù)據(jù)庫項(xiàng)的變化芦拿,進(jìn)而進(jìn)行相應(yīng)的處理。

public class MessageContentObserver extends ContentObserver {

    private Context mContext; 
    private Handler mHandler; 
    private String code; 

    public MessageContentObserver(Context context, Handler handler) {        
        super(handler);
        mContext = context;
        mHandler = handler;
    }    
   /**
     * 回調(diào)函數(shù), 當(dāng)監(jiān)聽的Uri發(fā)生改變時查邢,會回調(diào)該方法
     * 需要注意的是當(dāng)收到短信的時候會回調(diào)兩次
     * 收到短信一般來說都是執(zhí)行了兩次onchange方法.第一次一般都是raw的這個.
     * 雖然收到了短信.但是短信并沒有寫入到收件箱里
     */
    @Override
    public void onChange(boolean selfChange, Uri uri) {      
       if (uri.toString().equals("content://sms/raw")) {          
         return;
       }       
     Uri inboxUri = Uri.parse("content://sms/inbox");      
     Cursor c = mContext.getContentResolver().query(inboxUri,  null, null, null, "date desc");  // 按時間順序排序短信數(shù)據(jù)庫
        if (c != null) {            
              if (c.moveToFirst()) {             
                  String address = c.getString(c.getColumnIndex("address"));//發(fā)送方號碼
                  String body = c.getString(c.getColumnIndex("body")); // 短信內(nèi)容
                if (!address.equals("10086")) {            
                        return;
                }                
                Pattern pattern = Pattern.compile("(\\d{6})");//正則表達(dá)式匹配驗(yàn)證碼
                Matcher matcher = pattern.matcher(body);                if (matcher.find()) {
                    code = matcher.group(0);                   
                    Message msg = Message.obtain();
                    msg.what = MainActivity.MSG_RECEIVE_CODE;
                    msg.obj = code;
                    mHandler.sendMessage(msg);
                }
            }
            c.close();
        }
    }
}

調(diào)用:

/**
 * 短信驗(yàn)證碼自動填寫功能的實(shí)現(xiàn)
 */
public class MainActivity extends Activity {  
    public static final int MSG_RECEIVE_CODE = 1; //收到短信的驗(yàn)證碼
    private EditText codeEdt; //短信驗(yàn)證碼的輸入框
    private MessageContentObserver messageContentObserver;    //回調(diào)接口
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {        
    @Override
    public void handleMessage(Message msg) {      
      if (msg.what == MSG_RECEIVE_CODE) {
              //設(shè)置讀取到的內(nèi)容
            }
        }
    };    
    @Override
    protected void onCreate(Bundle savedInstanceState) {     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        codeEdt = (EditText) findViewById(R.id.smsCode);
        findViewById(R.id.send_sms_btn).setOnClickListener(new View.OnClickListener() {        
           @Override
            public void onClick(View v) {
                senSMSCode();
            }
        });
        messageContentObserver = new MessageContentObserver(MainActivity.this, handler);
  getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, messageContentObserver);
    }    
     /**
     * 取消注冊
     */
    @Override
    protected void onDestroy() {      
       super.onDestroy();
  getContentResolver().unregisterContentObserver(messageContentObserver);
    }    
    private void senSMSCode() {
    }
}

需要在AndroidManifest.xml加上權(quán)限


<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />

關(guān)于content://sms/inbox表蔗崎,大致包含的域有:

_id | 短消息序號 如100 thread_id | 對話的序號 如100
address | 發(fā)件人地址,手機(jī)號.如+8613811810000 person | 發(fā)件人扰藕,返回一個數(shù)字就是聯(lián)系人列表里的序號缓苛,陌生人為null
date | 日期 long型。如1256539465022 protocol | 協(xié)議 0 SMS_RPOTO, 1 MMS_PROTO
read | 是否閱讀 0未讀邓深, 1已讀
status | 狀態(tài) -1接收未桥,0 complete, 64 pending, 128 failed
type | 類型 1是接收到的,2是已發(fā)出
body | 短消息內(nèi)容
service_center | 短信服務(wù)中心號碼編號芥备。

content://sms/inbox 收件箱
content://sms/sent 已發(fā)送
content://sms/draft 草稿
content://sms/outbox 發(fā)件箱 (正在發(fā)送的信息)
content://sms/failed 發(fā)送失敗
content://sms/queued 待發(fā)送列表

項(xiàng)目地址
https://github.com/88ios/SMSContentObserver-master

項(xiàng)目主要用第三方bomb來發(fā)短信冬耿,感興趣不妨看看。
[END]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萌壳,一起剝皮案震驚了整個濱河市淆党,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讶凉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山孔,死亡現(xiàn)場離奇詭異懂讯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)台颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門褐望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人串前,你說我怎么就攤上這事瘫里。” “怎么了荡碾?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵谨读,是天一觀的道長。 經(jīng)常有香客問我坛吁,道長劳殖,這世上最難降的妖魔是什么铐尚? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮哆姻,結(jié)果婚禮上宣增,老公的妹妹穿的比我還像新娘。我一直安慰自己矛缨,他們只是感情好爹脾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箕昭,像睡著了一般灵妨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟广,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天闷串,我揣著相機(jī)與錄音,去河邊找鬼筋量。 笑死烹吵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桨武。 我是一名探鬼主播肋拔,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀酸!你這毒婦竟也來了凉蜂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤性誉,失蹤者是張志新(化名)和其女友劉穎窿吩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错览,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纫雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倾哺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧邪。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羞海,靈堂內(nèi)的尸體忽然破棺而出忌愚,到底是詐尸還是另有隱情,我是刑警寧澤却邓,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布硕糊,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏癌幕。R本人自食惡果不足惜衙耕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勺远。 院中可真熱鬧橙喘,春花似錦、人聲如沸胶逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽初坠。三九已至和簸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碟刺,已是汗流浹背锁保。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留半沽,地道東北人爽柒。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像者填,于是被迫代替她去往敵國和親浩村。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容