Android實現(xiàn)獲取短信驗證碼并自動填寫功能
本文實例為大家分享了Android短信驗證碼獲取并自動填寫功能的具體代碼,供大家參考,具體內(nèi)容如下
代碼如下:
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權(quán)限 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS}, 1); } mText = (TextView) findViewById(R.id.text); content = new SmsContent(new Handler(),this); //注冊短信變化監(jiān)聽 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排序的話,修改手機(jī)時間后,讀取的短信就不準(zhǔn)了 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的時候,不能主動調(diào)用close()方法, 否則在Android 4.0+的系統(tǒng)上, 會發(fā)生崩潰 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條驗證碼信息,可以根據(jù)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; } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
FFmpeg?Principle分析Out?put?File?數(shù)據(jù)結(jié)構(gòu)
這篇文章主要為大家介紹了FFmpeg?Principle分析Out?put?File?數(shù)據(jù)結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10mui.init()與mui.plusReady()區(qū)別和關(guān)系
給大家分享一下在使用MUI進(jìn)行APP開發(fā)的時候,mui.init()與mui.plusReady()區(qū)別以及使用上不同之處。2017-11-11Android Retrofit和Rxjava的網(wǎng)絡(luò)請求
這篇文章主要介紹了Android Retrofit和Rxjava的網(wǎng)絡(luò)請求的相關(guān)資料,需要的朋友可以參考下2017-03-03Android根據(jù)包名停止其他應(yīng)用程序的方法
這篇文章主要介紹了Android根據(jù)包名停止其他應(yīng)用程序,需要的朋友可以參考下2020-03-03Android Studio做超好玩的拼圖游戲 附送詳細(xì)注釋源碼
這篇文章主要介紹了用Android Studio做的一個超好玩的拼圖游戲,你是0基礎(chǔ)Android小白也能包你學(xué)會,另外附送超詳細(xì)注釋的源碼,建議收藏!2021-08-08Android Studio實現(xiàn)簡易登錄界面制作
這篇文章主要為大家詳細(xì)介紹了Android Studio實現(xiàn)簡易登錄界面制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Android ADT和SDK Manager無法更新下載解決方案
這篇文章主要介紹了Android ADT和SDK Manager無法更新下載解決方案的相關(guān)資料,需要的朋友可以參考下2017-04-04