Android 애플 리 케 이 션 에서 ContentObserver 를 사용 하여 문자 인증 코드 를 자동 으로 작성 합 니 다.
15644 단어 정규 표현 식인증번호ContentObserver자동 작성
안녕하세요, 최근 에 프로젝트 를 할 때 작은 기능 을 추 가 했 습 니 다. 핸드폰 로그 인 애플 리 케 이 션 이나 등록 할 때 문자 인증 코드 를 자동 으로 작성 합 니 다. 물론 인터넷 에 좋 은 demo 가 많 습 니 다. 저도 여러분 과 공유 하 는 동시에 개인 노트 로 도 하 겠 습 니 다.
비교적 간단 하기 때문에 효과 그림 이 나 오지 않 는데 왜 방송 (BroadcastReceiver) 을 사용 하지 않 고 시스템 이 문 자 를 받 을 때의 방송 을 받 습 니까?그러나 이 방송 은 질서 있 는 방송 이다. 다른 프로그램 이 먼저 이 방송 을 얻 은 후에 너 에 게 전달 하 는 것 이다. 물론 이 방송 도 없 앨 수 있 고 받 지 못 하 게 할 수 있다. 그러면 너의 프로그램 은 틀림없이 이 방송 을 받 지 못 할 것 이다.인터넷 에는 이런 사례 가 많다. 방송 수신 기의 우선 순 위 를 높이 는 것 은 1000 과 10000 이다.여기 서 intent - filter 의 안 드 로 이 드: priority 의 값 을 1000 으로 설정 하 는 것 을 언급 했 습 니 다. 그러나 실시 간 으로 1000 을 설정 하면 방송 을 받 지 못 합 니 다. 핸드폰 에 있 는 다른 방송 문 자 를 마 운 트 해제 하지 않 는 한 360 GO 문자, 비 신 마 등 이 있 습 니 다.그들의 우선 순 위 는 항상 너의 것 보다 높다.BAIDU 를 계속 할 수 있 습 니 다. 어떤 사람 은 10000 9999 로 설정 할 수 있 습 니 다. 10000 으로 설정 할 때 가끔 받 을 수 있 습 니 다. 가끔 만 받 을 수 있 습 니 다.그럼 부 으 면 어 떡 해?
여러분 은 이 라디오 의 기본 소 개 를 보 실 수 있 습 니 다.http://wenku.baidu.com/view/226f9dd5b14e852458fb57ba.html
자, 몇 가지 핵심 점 을 말 해 봅 시다.
1. ContentObserver (사용 하 는 관찰자 모드) 를 이용 하여 핸드폰 문자 동적 데이터 베 이 스 를 감청 하고 문자 데이터 베 이 스 를 받 았 을 때 변화 한다. 최신 문자 받 으 면 돼.아니면 다른 생각 을 하 셔 도 됩 니 다.
2. 번 호 를 지정 할 수 있 습 니 다. 문자 만 읽 고 추출 원 오류 가 발생 하지 않도록 합 니 다.
3. 우리 와 필요 없 는 문 자 를 걸 러 낼 수 있 습 니 다.
4. 정규 표현 식 을 이용 하여 다양한 종류의 인증 코드 와 일치 할 수 있 습 니 다.
하하, 설 레 는 순간 이 왔 습 니 다. 코드 를 보 세 요.
이것 은 문자 인증 코드 를 가 져 오 는 도구 클래스 입 니 다.
public class SmsReciverUtil extends ContentObserver {
private Activity c;
private int codelength;
private Handler handler;
public SmsReciverUtil(Handler handler, Activity c, int codelength) {
super(handler);
this.c = c;
this.codelength = codelength;//
this.handler = handler;
}
// onchange . raw . .
// ,
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (uri.toString().equals("content://sms/raw")) {
return;
}
String code = getsmsCode(c, codelength);
if (!TextUtils.isEmpty(code)) {
// handler
Message msg = Message.obtain();
msg.what =0;
msg.obj = code;
handler.sendMessage(msg);
}
}
public String getsmsCode(Activity c, int codelength) {
ContentResolver contentresolver = c.getContentResolver();
// uri
Uri uri = Uri.parse("content://sms/inbox");
// address ,read 0 1 ,body
String[] projection = new String[]{"_id", "address", "read", "body"};
//
// String selection = "address=? and read=?"; // (xxxxxxx) (+86xxxxxxx) , , O(∩_∩)O ~, ,
// String [] selections = new String[]{" ","0"};
// id , date , ,
String sortOrder = "_id desc";
//
Cursor cur = contentresolver.query(uri, projection, null, null, sortOrder);
if (null == cur) {
return null;
}
if (cur.getCount() <= 0) {
return null;
}
if (!cur.moveToFirst()) {
return null;
}
String number = cur.getString(cur.getColumnIndex("address"));//
String body = cur.getString(cur.getColumnIndex("body"));//
//
cur.close();
// . ,
if (!number.startsWith(" xxxx ")) {
return null;
}
if (!body.contains(" "){
return null;
}
return getyzm(body, codelength);
}
/** * * * @param body * @param codelength 4 * @return */ public String getyzm(String body, int codelength) {
Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + codelength + "})(?![0-9])");
Matcher matcher = p.matcher(body);
if (matcher.find()) {
// ContentValues values = new ContentValues();
// values.put("read", "1"); //
return matcher.group(0);
}
return null;
}
}
우선 ([a - zA - Z0 - 9] {4}) 은 연속 적 인 4 자리 숫자 조합 을 얻 었 다.
(?! [a - ZA - Z0 - 9]) 단언 ([0 - 9] {YZMLENGTH}) 뒤에 숫자 가 나 오 면 안 돼
/ / Pattern p = Pattern. copile (? 감청 이 완료 되면 Activity 에서 getContentResolver (). unregisterContentObserver (c) 를 기억 하 십시오.감청 을 말소 하 다
와, 까 먹 을 뻔 했 어 요. 많은 친구 들 이 이런 실 수 를 했 을 거 라 고 믿 어 요. O (∩ ∩) O 하하 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
awk 상용 명령awk 는 모든 입력 줄 을 하나의 기록 으로 인식 하고 그 줄 의 모든 단어 도 메 인 을 하나의 필드 로 인식 합 니 다. ARGC 명령 줄 에 awk 스 크 립 트 가 들 어 오 는 매개...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.