Android提取短信中的驗證碼

現在用短信驗證碼來實現登錄和註冊功能已經越來越常見了。如果你想用戶在收到短信驗證碼後,不需要再手動輸入進去的話,而是自動填入,那麼你就需要做些特殊處理了!

1.監聽短信變化

    首先需要的是通過ContentObserver類中的OnChange()監聽你的短信變化。簡單的介紹下ContentObserver:內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理。

2.獲取驗證碼

    檢測到了短信變化後,讀取該條短信的內容,並且通過正則表達式來獲取內容中的驗證碼。

3.修改UI

    ContentObserver構造方法中有一個handler,通過handler來修改主線程中ui內容,將接收到的驗證碼呈現在ui上。


貼上代碼,代碼中有註釋講解:

MainActivity.java

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;


public class MainActivity extends Activity {
    private TextView mSmsTV;
    private SmsObserver mSmsObserver;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what == 1) {
                String code = (String) msg.obj;
                mSmsTV.setText(code);
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSmsTV = (TextView) findViewById(R.id.tv_sms);

        mSmsObserver = new SmsObserver(this, mHandler);
        Uri smsUri = Uri.parse("content://sms");
        getContentResolver().registerContentObserver(smsUri, true, mSmsObserver);//註冊短信uri的監聽
    }

    @Override
    protected void onPause() {
        super.onPause();
        getContentResolver().unregisterContentObserver(mSmsObserver);//取消監聽
    }
}

SmsObserver.java

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SmsObserver extends ContentObserver {
    private Context mContext;
    private Handler mHandler;//更新ui

    public SmsObserver(Context context, Handler handler) {
        super(handler);
        mContext = context;
        mHandler = handler;

    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        /* 收到一條短信,onChange()會執行兩次,uri不同 */
        if (uri.toString().equals("content://sms/raw")) {//未寫入數據庫,不進行任何操作
            return;
        } else {//此時已經寫入數據庫
            Uri inboxUri = Uri.parse("content://sms/inbox");
            /* 按照日期倒序排序 */
            Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
            if (cursor != null) {
                if (cursor.moveToFirst()) {//遊標移動到first位置
                    /* 發件人的號碼 */
                    String address = cursor.getString(cursor.getColumnIndex("address"));
                    /* 短信內容 */
                    String body = cursor.getString(cursor.getColumnIndex("body"));
                    Log.i("wyk", "address:" + address + ",body:" + body);

                    /* 利用正則提取驗證碼(根據實際情況修改) */
                    Pattern pattern = Pattern.compile("(\\d{6})");//提取六位數字
                    Matcher matcher = pattern.matcher(body);//進行匹配
                    if(matcher.find()){//匹配成功
                        String code = matcher.group(0);
                        Message msg = mHandler.obtainMessage(1, code);
                        mHandler.sendMessage(msg);
                        Log.i("wyk","code:"+code);
                    }
                }
                cursor.close();
            }
        }

    }
}

最後別忘了再manifest中加入讀取短信的權限

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章