Android 애플 리 케 이 션 에서 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. 정규 표현 식 을 이용 하여 다양한 종류의 인증 코드 와 일치 할 수 있 습 니 다.
하하, 설 레 는 순간 이 왔 습 니 다. 코드 를 보 세 요.
  • 당신 의 Activity 에서 감청 문자 데이터 베 이 스 를 등록 하고 c 는 Activity 의 대상
  • 입 니 다.
  • 등록 코드 는 getContentResolver (). registerContentObserver (Uri. parse (")content://sms"), true, c);  
  • 다양한 유형의 uri 에 대해 참고 하 시기 바 랍 니 다.http://www.2cto.com/kf/201203/123797.html블 로그.

  • 이것 은 문자 인증 코드 를 가 져 오 는 도구 클래스 입 니 다.
    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   1body    
            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 하하 ~

    좋은 웹페이지 즐겨찾기