Androidはショートメッセージの検証コードを実現して自動で記入します。


Androidアプリケーションはしばしば登録登録機能に関連しますが、多くの登録やパスワード変更機能はしばしばショートメッセージの検証コードを入力する必要があります。通常、ユーザーはショートメッセージを受信すると、アプリケーションを最小限にしてメールを確認し、検証コードを記入する必要があります。
原理解説:
主にメール情報をリアルタイムで取得することです。ContentObserver類の使用に関連します。ContentProviderを使ってショートメールデータベースの変化をモニターし、ユーザー定義のContentObserverでワンChangeを実現し、特定の携帯電話番号のショートメッセージを傍受し、充填が必要な場所に情報を傍受する。 
ContentObserverは、コンテンツの傍受者です。携帯電話にメールを送ると、ContentObserverの指定方法を自動的に呼び出してメールの変化を通知します。次にメールの内容を読んで、検証コードを取り出して自動的に入力ボックスに記入します。これで自動記入機能が完成します。ContentObserver類は主にメールの内容の変化を監督して、ここでandroidの常用する1種の設計のモードつまり観察者のモードに関連します。 
コンテントObserver解説-観察者モード:
観察者モード(時にはリリースモードと呼ばれる)-購読(Subscribe)モード、モデル-ビュー(View)モード、ソース-聴取者(Listener)モードまたはスレーブモード)は、ソフトウェア設計モードの一種である。このようなモードでは、目的物は、その観察者に依存するすべてのものを管理し、その自身の状態が変化したときに、自ら通知を出す。これは、一般に、観察者によって提供される方法を呼び出して実現される。このようなモードは、通常、イベント処理システムを実現するために用いられる。 
観察者モード(Observer)は完璧に観察者と観察された対象を分離します。観察者モードはモジュール間で明確な限界を定めており、アプリケーションのメンテナンス性と再利用性を高めている。 
観察者設計モードは、オブジェクト間の1対の複数の依存関係を定義し、オブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新されます。 
特定のUriによるデータベースの変化を観察(捕捉)することを目的として、データベース技術におけるトリガーのような対応をしています。ConttentObserverで観察されたUriが変化すると、トリガーがトリガされます。 
•観察者(すなわち私たちの応用):Observerは、観察対象(Subject)に自分を登録し、観察対象者は観察者を一つの容器に保存する。 
•観察されている(すなわちシステムのショートメッセージアプリケーション):観察対象に何らかの変化が生じ(図中のSomeChangeのような)、登録済みの観察者を容器から入手し、変化を観察者に通知する。 
•観察を取り消す:観察者は観察者に観察を撤回するように告げ、観察者は容器から観察者を取り除く。 
具体的には、私達のプロジェクトの中で、つまりアプリケーションが実行を開始したばかりの時に、私達の携帯電話システムのショートメッセージアプリケーションに観察者を登録します。メールが変化した時、登録した観察者にメールアプリが変化したことを知らせます。私達の観察者はこのような通知を受けた時、コードによって操作を行います。自動で認証コードを記入する機能を実現します。私たちが必要な機能を完成したら、観察を取り消して登録を解除します。観察者は容器から観察者を削除します。観察者は削除された後、メールの内容変更通知を受けない。 
特定のユリを観察する手順は以下の通りです。 
1.私達の特定のContentObserver派生類を作成するには、父親の構造方法を重載しなければならず、オンChange()の方法を再負荷して、フィードバック後の機能を処理して実現しなければならない。
2.context.getContentResolover()を利用してContentResoloveオブジェクトを獲得し、続いてregister ContentObserver()を呼び出してコンテンツ観察者を登録する。
3.ContentObserverのライフサイクルはActivityやServiceなどに同期していないため、不要な場合は手動でunregister ContentObserver()を呼び出して登録をキャンセルします。 
activitymain.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".MainActivity">

 <EditText
 android:id="@+id/et_validateCode"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentTop="true"
 android:layout_centerHorizontal="true"
 android:ems="10" />
</RelativeLayout> 

MainActivity.java 

package smsdemo.com.smsdemo;

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

/**
 *               
 *
 * Created by huangminzheng on 16/3/15.
 */
public class MainActivity extends Activity {

 public static final int MSG_RECEIVED_CODE = 1;
 private EditText metValidateCode = null;
 private SmsObserver mObserver;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 metValidateCode = (EditText) findViewById(R.id.et_validateCode);

 mObserver = new SmsObserver(MainActivity.this, mHandler);
 Uri uri = Uri.parse("content://sms");
 //       
 getContentResolver().registerContentObserver(uri, true, mObserver);
 }

 @Override
 protected void onPause() {
 super.onPause();
 //         
 getContentResolver().unregisterContentObserver(mObserver);
 }

 private Handler mHandler = new Handler() {
 @Override
 public void handleMessage(Message msg) {
  if (msg.what == MSG_RECEIVED_CODE) {
  String code = (String) msg.obj;
  metValidateCode.setText(code);
  }
 }
 };

}

SmsObserver.java

package smsdemo.com.smsdemo;

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by huangminzheng on 16/3/15.
 *
 *      
 */
public class SmsObserver extends ContentObserver{

 private Context mContext;
 private Handler mHandler;

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

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

 Log.d("main", "SMS has changed!");
 Log.d("main", uri.toString());
 //        ,                       ,return
 if (uri.toString().equals("content://sms/raw")) {
  return;
 }
 getValidateCode();//       

 }

 /**
 *        
 */
 private void getValidateCode() {
 String code = "";
 Uri inboxUri = Uri.parse("content://sms/inbox");
 Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");//
 if (c != null) {
  if (c.moveToFirst()) {
  String address = c.getString(c.getColumnIndex("address"));
  String body = c.getString(c.getColumnIndex("body"));

  //13162364720         
  if (!address.equals("13162364720")) {
   return;
  }
  Log.d("main", "    :" + address + " ," + "     :" + body);

  Pattern pattern = Pattern.compile("(\\d{6})");
  Matcher matcher = pattern.matcher(body);

  if (matcher.find()) {
   code = matcher.group(0);
   Log.d("main", "    : " + code);
   mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE, code).sendToTarget();
  }

  }
  c.close();
 }
 }
}
メールのUriにはいくつかの種類があります。 
content://sms/inbox     受信箱        
content://sms/sent      送信済み
content://sms/draft     草稿          
content://sms/outbox    配送箱  (送信中のメッセージ)
content://sms/failed    送信に失敗しました    
content://sms/queued    送信待ちリスト  (たとえば飛行モードをオンにすると、送信待ちリストにメッセージが表示されます。
もちろん、メールの読み込み権限を追加することを忘れないでください。
<uses-permission android:name=“android.permission.READ_”SMS'/>
ソースのダウンロード:Androidショートメッセージの検証コードは自動的に記入します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。