1,邮箱和手机号的格式简单验证
private boolean AuthRegisterUser(String UserName) {
Pattern patternMailBox = Pattern
.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");// 正则表达的式匹配邮箱
Pattern patternTell = Pattern.compile("^1[0-9]\\d{9}$");
return patternMailBox.matcher(UserName).matches()
|| patternTell.matcher(UserName).matches();
}
2,获取验证码
btnGetCode=(Button) findViewById(R.id.btngetcode);
btnGetCode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
time=30;
btnGetCode.setEnabled(false);
runnable.run();
}
});
private int time=30;
public Runnable runnable=new Runnable() {
@Override
public void run() {
if((time)<=0){
btnGetCode.setText("获取验证码");
btnGetCode.setEnabled(true);
}else{
btnGetCode.setText(time+"秒后重试");
btnGetCode.postDelayed(this, 1000);
}
time--;
}
};
权限:<uses-permission android:name="android.permission.READ_SMS"/>
代码中使用:
SmsContent content= new SmsContent(LoginActivity.this, new Handler(), verifyText);
// 注册短信变化监听
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"),true, content);
package 填写自己的包名
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.widget.EditText;
public class SmsContent extends ContentObserver {
public static final String SMS_URI_INBOX = "content://sms/inbox";
private Activity activity = null;
private String smsContent = "";
private EditText verifyText = null;
public SmsContent(Activity activity, Handler handler, EditText verifyText) {
super(handler);
this.activity = activity;
this.verifyText = verifyText;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
((SMSAUTOreadActivity)activity).test();
Cursor cursor = null;// 光标
// 读取收件箱中指定号码的短信
// cursor = activity.managedQuery(Uri.parse(SMS_URI_INBOX), new String[] { "_id", "address", "body", "read" }, "address=? and read=?",
// new String[] { "106900977086", "0" }, "date desc");
/**因为我们获取短信的号码可能有变化,所以我是对短信的内容进行过滤的,我们的有下边4个字母 czmm*/
cursor=activity.getContentResolver().query(Uri.parse(SMS_URI_INBOX), new String[] { "_id", "address", "body", "read" }, "read=? and body like '%czmm%'",
new String[] { "0" }, "date desc");
if (cursor != null) {// 如果短信为未读模式
System.out.println("cursor=="+cursor.getCount());
if (cursor.moveToFirst()) {
String smsbody = cursor.getString(cursor.getColumnIndex("body"));
System.out.println("smsbody=======================" + smsbody);
String regEx = "[^0-9]";//匹配不是数字的,注意只是一个字符哦
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(smsbody.toString());
smsContent = m.replaceAll("").trim().toString();
verifyText.setText(smsContent);
}
}else{
System.out.println("cursor is null");
}
}
}
最后看下系统短信库的内容:
系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db
打开mmssms.db再打开sms表因为所有短信数据都储存在这张表上,下面分析一下这张表的字段。
_id 不用说了吧,标示它的唯一性
thread_id :这个字段很重要,同一个会话中他们的thread_id是一样的,也就是说通过thread_id就可以知道A与B在聊天还是 A与C在聊天
date :这条消息发送或接收的时间
read: 0 表示未读 1表示已读
type : 1表示接收 2 表示发出
body 表示消息的内容
我们在看看thread_id指向的thread表
上图中可以清晰的看到收到消息与回复消息的thread_id都为1 ,那么在thread_id这张表中
_id 不用说了吧,标示它的唯一性
date:表示最后接收或者发送消息的时间
message_count:表示发送消息的数量,这里我接收到了一条消息也回复了一条消息那么它的数量就为2
recipient_ids:联系人ID,指向表 canonical_addresses 里的id。
snippet :最后收到或者发送的消息内容,就是上图body中存的东西