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

参考资料如下,亲测很好用,哈哈:
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条验证码信息,可以根据cursor.getCount()来控制下。。。

下面第二种方法在oppo r9s上不见效果。。各位使用的小伙伴注意哦

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;
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值