您的位置:首页 > 移动开发 > Android开发

Android Studio第二期 - 短信自动填写项目流程讲解

2015-10-09 11:33 781 查看
首先这个东西是这样的流程:

不管你用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);
}
}
};

@Override
protected 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);
}
@Override
protected void onDestroy() {
getContentResolver().unregisterContentObserver(mObserver);
super.onDestroy();
}
在main里面进行注册监听,别忘了最后要destroy

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




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




地址:http://down.51cto.com/data/2103679
本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1701144
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: