2009-09-09 2 views
51

연락처 데이터베이스의 변경 내용을 수신 대기하려고합니다.연락처 데이터베이스의 변경 내용을 수신하는 방법

그래서 내가 ContentObserver의 하위 클래스 내 contentObserver 만들 :

private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
      System.out.println (" Calling onChange"); 
     } 

    } 

MyContentObserver contentObserver = new MyContentObserver(); 
context.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 

을하지만 'EditContactActivity'를 사용하면 연락처 데이터베이스를 변경하려면, 내 onChange()가 호출되지 않습니다.

+3

참고 - URI를 People.CONTENT_URI은 (이전에 오늘 - 3/15/2011)는 지원되지 않습니다. ContactsContacts.CONTENT_URI를 참조하십시오. – mobibob

+1

안녕하세요, 어떻게 변화의 본질에 대한 정보를 얻을 수있는 아이디어? 연락처 추가, 삭제, 업데이트, 필드가 업데이트 되었습니까? –

답변

53

그대로 나는 당신의 예를 배포하고, 그것을 잘 작동합니다.

package com.test.contentobserver; 

import android.app.Activity; 
import android.database.ContentObserver; 
import android.os.Bundle; 
import android.provider.Contacts.People; 

public class TestContentObserver extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.getApplicationContext().getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 
    } 

    private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

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

    } 

    MyContentObserver contentObserver = new MyContentObserver(); 

} 

그래서 다른 잘못된 작업을 수행해야합니다.

당신은 관찰자가 등록되는 커서를 통해 변경을하고 있습니까?

확인하는 것이 옵저버 기능 deliverSelfNotifications와().

@Override 
public boolean deliverSelfNotifications() { 
    return true; 
    } 

가 People.CONTENT_URI 값을 수정 언급되어 있는지 확인합니다 (android.provider.Contacts.People를)

당신은 같은과 그 관찰자 함수를 재정의 할 수 있습니다 (이것은 기본적으로 false 반환) . 즉이 경우 코드가 잘못 만드는 것 아니지만

또한, 나는 당신이 ContentObserver과 처리기를 사용하는 것이 좋습니다 것입니다.

+1

이상하게도 핸들러없이 작동합니다. 그것은 나를 위해하지 않았다. 게다가 UI 쓰레드에서 어떻게 코드를 실행시킬 수 있는지 궁금합니다. 필자는이 글을 처음 접해 보았습니다. – Snicolas

+0

연락처가 주소록에서 업데이트되었음을 ​​알 수있는 방법 – user366584

+0

연락처 변경 사항에 해당하는 이벤트가 내 앱의 서비스를 메모리에 보유하지 않기 위해 매니페스트 파일에 포함 시키도록 변경합니까? – kolyaseg

27

MannyNS의 답변에 대한 간단한 정보. 여기

, People.CONTENT_URI이되지 않습니다.

코드 대신 다음과 같이 .-->ContactsContract.Contacts.CONTENT_URI

getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver); 
+4

이 ContentObserver에서; 추가되었거나 변경된 연락처 세부 정보를 얻을 수있는 방법이 있습니까 ?? 비슷한 리스너를 만들고 싶지만 추가/수정 된 연락처에서 일부 작업을 수행하려고합니다. – Allzhere

+0

내가 아는 한,'CotentObserver'를 사용하는 것은 불가능합니다. 이 [링크] (http://stackoverflow.com/a/10432259/2124004)를 참조하십시오. – Nizam

관련 문제