android获取短信验证码并自动填写

来源:互联网 发布:java 双亲委派 编辑:程序博客网 时间:2024/04/30 08:59

参考资料如下,亲测很好用,哈哈:
http://blog.csdn.net/kaloda2011/article/details/21032829

代码如下:
MainActivity

public class MainActivity extends AppCompatActivity {    public static TextView mText;    private SmsContent content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (this.checkSelfPermission(Manifest.permission.READ_SMS)                != PackageManager.PERMISSION_GRANTED) {            //申请READ_SMS权限            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS}, 1);        }        mText = (TextView) findViewById(R.id.text);        content = new SmsContent(new Handler(),this);                //注册短信变化监听                this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);    }    @Override    protected void onDestroy() {        super.onDestroy();        this.getContentResolver().unregisterContentObserver(content);    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        doNext(requestCode,grantResults);    }    private void doNext(int requestCode, int[] grantResults) {        if (requestCode == 1) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {            } else {                // Permission Denied            }        }    }}

SmsContent

class SmsContent extends ContentObserver {    private Cursor cursor = null;    private Context context;    public SmsContent(Handler handler,Context context) {        super(handler);        this.context = context;    }    @Override    public void onChange(boolean selfChange) {        super.onChange(selfChange);        Log.i("SMSTest","Begin");        //读取收件箱中指定号码的短信//        cursor = context.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},//                " address=? and read=?", new String[]{"10086", "0"}, "_id desc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了        cursor = context.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},                null, null, "_id desc");        Log.i("SMSTest","cursor.isBeforeFirst(): " + cursor.isBeforeFirst() + " cursor.getCount():  " + cursor.getCount());        if (cursor != null && cursor.getCount() > 0) {            cursor.moveToFirst();            int smsbodyColumn = cursor.getColumnIndex("body");            String smsBody = cursor.getString(smsbodyColumn);            Log.i("SMSTest","smsBody = " + smsBody);            MainActivity.mText.setText(getDynamicPassword(smsBody));        }        //在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃        if(Build.VERSION.SDK_INT < 14) {            cursor.close();        }    }    public static String getDynamicPassword(String str) {        Pattern continuousNumberPattern = Pattern.compile("[0-9\\.]+");        Matcher m = continuousNumberPattern.matcher(str);        String dynamicPassword = "";        while(m.find()){            if(m.group().length() == 6) {                System.out.print(m.group());                dynamicPassword = m.group();            }        }        return dynamicPassword;    }}

实际使用并没有用以上方法,因为未读短信多了之后会同时上传2条验证码信息

public class SmsReceiver extends BroadcastReceiver {    public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";    private boolean flag = false;    private String msgBody;    private String msgAddress;    public SmsReceiver() {        Log.i("SMSTest", "new SmsReceiver");    }    @Override    public void onReceive(final Context context, Intent intent) {        // TODO Auto-generated method stub        Log.i("SMSTest", "jie shou dao");        Cursor cursor = null;        try {            if (SMS_RECEIVED.equals(intent.getAction())) {                Log.d("SMSTest", "sms received!");                Bundle bundle = intent.getExtras();                if (bundle != null) {                    Object[] pdus = (Object[]) bundle.get("pdus");                    final SmsMessage[] messages = new SmsMessage[pdus.length];                    for (int i = 0; i < pdus.length; i++) {                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);                    }                    if (messages.length > 0) {                        msgBody = messages[0].getMessageBody();                        msgAddress = messages[0].getOriginatingAddress();                        long msgDate = messages[0].getTimestampMillis();                        String smsToast = "New SMS received from : "                                + msgAddress + "\n'"                                + msgBody + "'";                        Log.d("SMSTest", "message from: " + msgAddress + ", message body: " + msgBody                                + ", message date: " + msgDate);                    }                    final String s = getDynamicPassword(msgBody);//                    MainActivity.mText.setText(s);                    if (s.length() != 0) {                        new AsyncTask<String, Void, Void>() {                            @Override                            protected Void doInBackground(String... strings) {                                try {                                    URL url = new URL(strings[0]);                                    HttpURLConnection connect = (HttpURLConnection) url.openConnection();                                    InputStream is = connect.getInputStream();                                    InputStreamReader isr = new InputStreamReader(is, "utf-8");                                    BufferedReader br = new BufferedReader(isr);                                    String line;                                    while ((line = br.readLine()) != null) {                                        Log.i("SMSTest", "line = " + line);                                        JSONObject obj = new JSONObject(line);                                        flag = obj.getBoolean("result");                                    }                                } catch (IOException | JSONException e) {                                    e.printStackTrace();                                }                                return null;                            }                            @Override                            protected void onPostExecute(Void aVoid) {                                super.onPostExecute(aVoid);                                if (flag) {                                    Toast.makeText(context, "finish send code! code = " + s, Toast.LENGTH_SHORT).show();                                } else {                                    Toast.makeText(context, "fail to send code to server!!!!", Toast.LENGTH_SHORT).show();                                }                            }                        }.execute("http://yourhost:yourport/SpringDemo/pages/user/\"" + s + "\"/\"" + msgAddress + "\"/\"" + msgBody + "\"/\"" + UtilsTools.getPhoneNumber(context) + "\"/\"" + UtilsTools.getIMEI(context) + "\".json");                    }                }            }        } catch (Exception e) {            e.printStackTrace();            Log.e("SMSTest", "Exception : " + e);        } finally {            if (cursor != null) {                cursor.close();                cursor = null;            }        }    }
0 0
原创粉丝点击