2009-09-09 12 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

FYI - URI People.CONTENT_URIは(前今日まで - 2011年3月15日)は推奨されません。 ContactsContracts.Contacts.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(); 

} 

だから、あなたは間違ったことをする必要があります。

オブザーバーが登録されているカーソルで変更していますか?

Observer関数deliverSelfNotifications()で確認してください。 People.CONTENT_URIが正しい値(android.provider.Contacts.People)を参照していることを確認します

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

(それはデフォルトではfalseを返す)あなたはのようなもので、そのオブザーバ機能を無効にすることもできます。

また、ContentObserverでHandlerを使用することをお勧めしますが、この場合はコードが間違っているわけではありません。

+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

関連する問題