首先这个东西是这样的流程:

    不管你用mob还是移动还是自己的短信接口都一样的,在发送验证码的部分去请求,然后服务器返回给你短信息,然后你自己处理,达到效果。

    这样一说就是只需要去监听短信息的数据库变化就可以了,并且要监听到你想要的那一条。

    首先是

ContentObserver
import android.annotation.SuppressLint;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.provider.Settings;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;    public SmsObserver(Context context, Handler handler) {        super(handler);        mContext = context;        mHandler = handler;    }    @SuppressLint("NewApi")    @Override    public void onChange(boolean selfChange, Uri uri) {        super.onChange(selfChange, uri);        Log.e("DEBUG", "SMS has changed!");        Log.e("DEBUG", uri.toString());//        try {//            int isAirplaneOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);//            Log.i("奇怪了", " isAirplaneOpen -----> " + isAirplaneOpen);//            mHandler.obtainMessage(LoginActivity.MSG_RECEIVED_CODE, isAirplaneOpen)//                    .sendToTarget();//        } catch (Settings.SettingNotFoundException e) {//            e.printStackTrace();//        }        String code = "";        if (uri.toString().equals("content://sms/raw")) {            return;        }        String[] projection = new String[]{"_id", "address", "body", "type"};        Uri inboxUri = Uri.parse("content://sms/inbox");        Cursor c = mContext.getContentResolver().query(inboxUri, projection, null,                null, "date desc");        if (c != null) {            if (c.moveToFirst()) {                int _id = c.getInt(c.getColumnIndex("_id"));                String type = c.getString(c.getColumnIndex("type"));                String address = c.getString(c.getColumnIndex("address"));                String body = c.getString(c.getColumnIndex("body"));                Log.e("--------address------", address);                Log.v("-----草-----", "msgId : " + _id);                Log.v("-----草-----", "msgAddr : " + type);                Log.v("-----草-----", "msgBody : " + body);                Log.v("-----草-----", "msgType : " + address);                if (!address.contains("10657120610111")) {                    return;//10657120610111                }                Log.e("DEBUG", "发件人为:" + address + " " + "短信内容为:" + body);                Pattern pattern = Pattern.compile("(\\d{6})");                Matcher matcher = pattern.matcher(body);                if (matcher.find()) {                    code = matcher.group(0);                    Log.e("DEBUG", "code is " + code);                    mHandler.obtainMessage(LoginActivity.MSG_RECEIVED_CODE, code)                            .sendToTarget();                }            }            c.close();        }    }}

    这个就是观察者模式的类,作用就是针对短信进行监听,根据其变化来获取短信息的内容,并且根据正则表达式去截取想要的数字,然后handle一下。

    然后是

MainActivity
private SmsObserver mObserver;public static final int MSG_RECEIVED_CODE = 1;@SuppressLint("HandlerLeak")private Handler mHandler2 = new Handler() {    @Override    public void handleMessage(Message msg) {        if (msg.what == MSG_RECEIVED_CODE) {            String code = (String) msg.obj;            // update the UI            inputCodeEt.setText(code);        }    }};@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_login);    init();    mObserver = new SmsObserver(LoginActivity.this, mHandler2);    Uri uri = Uri.parse("content://sms");    getContentResolver().registerContentObserver(uri, true, mObserver);}@Overrideprotected void onDestroy() {    getContentResolver().unregisterContentObserver(mObserver);    super.onDestroy();}

    在main里面进行注册监听,别忘了最后要destroy 

    这样在监听状态下就会实时的对短信息的收发进行监听,并且得到我们想要的数字,通过子线程更新EditText达到自动填写的效果。

    

    最后总结一下,一般像短信息啦,飞行模式啦什么设置之类的建议用ContentObserver搞,像什么推送啦,更新啦,视频聊天啦,建议用service搞,合理的分配内存使用,优化app的性能。

    

    地址:http://down.51cto.com/data/2103679

更多相关文章

  1. android LinearLayout等view如何获取button效果
  2. Android退出整个应用的方法
  3. Android闪屏页动画不起作用的解决方法
  4. ListView、ScrollView、GridView等去除滑动时边缘模糊
  5. Android(安卓)实现ListView的弹性效果
  6. The Business of Android(安卓)Apps Development Making and Mar
  7. Android(安卓)Studio代码自动提示无效(not available in Power Sa
  8. Android之设计模式
  9. Android(安卓)CollapsingToolbarLayout

随机推荐

  1. 当开始使用数据-*时,无法识别AngularJS指
  2. 如何禁用Cell Handsontable中的写入并包
  3. ajax交互Struts2的action(1)
  4. 如何设置动画以使元素围绕圆圈移动?
  5. 通过切换a. localecompare (b) to (ab?1:
  6. 在Angular服务中使用$ http作为json数据
  7. JSON.parse(xhr.responseText)意外的字符串
  8. [jQuery知识]jQuery之知识四-DOM和CSS操
  9. 与jQuery ajax post方法相比,fetch方法没
  10. JavaScript中可见性检查的测试条件