2014-03-05 3 views
0

기본 메시징 앱에서 보낸 SMS를 수신 대기하는 앱을 작성했습니다.Android : ContentObserver가 더 많은 횟수 실행

다음 코드를 사용하면 전송 된 SMS에 대해 앱이 실행되지 않았습니다.

SMSSentObserver smsSentObserver = new SMSSentObserver(null, this); 
    ContentResolver contentResolver = this.getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, smsSentObserver); 

다음 코드를 사용하면 ContentObserver가 트리거됩니다.

SMSSentObserver smsSentObserver = new SMSSentObserver(null, this); 
    ContentResolver contentResolver = this.getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsSentObserver); 

내가 보낸 SMS를 수신 할 수 있었지만 SMSSentObserver는에서 onCreate() 메소드를 한 번 이상 호출 (ContentObserver를 구현). 그런 다음 코드에 조건을 추가하여 보낸 SMS 이벤트를 확인했습니다. 그러나 조건은 두 가지 사건에 의해 통과된다.

public class SMSSentObserver extends ContentObserver { 
     private final Context _context; 

     public SMSSentObserver(Handler handler, Context context) { 
      super(null); 
      _context = context; 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      saveSentSMS(); 
      super.onChange(selfChange); 
     } 

     private void saveSentSMS() { 
      Uri uriSMSURI = Uri.parse("content://sms/sent"); 
      Cursor cur = this._context.getContentResolver().query(uriSMSURI, null, null, null, null); 

      if(null == cur) { 
       return; 
      } 

      if(cur.moveToFirst()) { 
       String strProtocol = cur.getString(cur.getColumnIndex("protocol")); 
       if(null != strProtocol) { //for sent messages protocol will be null. 
        return; 
       } 

       int type = cur.getInt(cur.getColumnIndex("type")); 
       if(type == 2) { 
        String strSMSBody = cur.getString(cur.getColumnIndex("body")); 
        String strPhoneNo = cur.getString(cur.getColumnIndex("address")); 
        long smsDateTime = cur.getLong(cur.getColumnIndex("date")); 
        String serviceCenter = cur.getString(cur.getColumnIndex("service_center")); 
        String strStatus = cur.getString(cur.getColumnIndex("status")); 
        String strPerson = cur.getString(cur.getColumnIndex("person")); 
        Log.e("Info", "SMS saved"); 
       } 
      } 
     } 
    } 

"SMS saved"는 catlog에 두 번 표시되는 것이 아니라 한 번에 catlog에 두 번 표시됩니다. 다른 사람이 보낸 SMS를 찾을 수있는 방법이 있습니까?
도움이 필요하십니까?

답변

0

이것은 일반적인 문제인 것처럼 보입니다. 나는 여러 가지 다른 방법을 시도해 보았고 결국 해결책을 찾았다.

내 경우에는 ContentObserver의 onChange()가 내 보낸 SMS에 대해 세 번 트리거됩니다. 유형 -> cur.getColumnIndex ("type")을 사용하여 시도한 것을 볼 수 있습니다. 유형은 6, 4 또는 2가 될 수 있습니다. 제 경우에는 이벤트가 트리거 된 세 번 중 두 번 유형 2가 발생했습니다. 그것은 신뢰할 수없는 것 같습니다. 또한 모든 기기에서 이것이 동일한 지 여부는 불확실합니다. smsCursor.getString (msgIndex)을 사용하여 messageID를 확인하여이 문제를 해결했습니다. 이것을 SharedPreference에 저장하십시오. 다음 번에 이벤트가 트리거되면 이전 messageID와 새 messageID를 비교합니다. ID가 다른 경우에만 내용을 추출하십시오. 이렇게하면 중복을 피할 수 있습니다.

관련 문제