标签: contentobserver

ContentObserver和DatasetObserver之间的区别?

ContentObserver和之间有什么区别DatasetObserver

什么时候应该使用?

Cursor用单排.我希望收到有关数据更改的通知 - 例如.当行更新时.

我应该注册哪个观察员班?

android cursor android-contentprovider contentobserver

31
推荐指数
2
解决办法
2万
查看次数

如何让我的Contacts ContentObserver for ContactsContract检测添加,更新或删除的联系人?

我能够得到一个通用通知"联系人数据库发生了变化",但我想知道插入,更新或删除的特定记录.以下是注册并获取onChange通知的代码.不幸的是,它并不具体,这使得我的处理功能详尽且效率低下.

这是代码存根:

            if ((mNativeContactsObserver == null) && (mHandler == null)) {
            mHandler = new Handler(this.getMainLooper()) {
            };
            mNativeContactsObserver = new ContentObserver(mHandler) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);

                    Bundle data = null;
                    Message message = mHandler.obtainMessage();
                    if (message != null) {
                        data = message.getData();
                        if (data != null) {
                            Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");
                            Logs.d(TAG, "Contents = [" + message.describeContents() + "]");
                        }
                    }

                    if (!selfChange) {
                        final Account accountListen = …
Run Code Online (Sandbox Code Playgroud)

android crud contactscontract contentobserver

31
推荐指数
2
解决办法
2万
查看次数

如何在地址簿中收听插入/更新/删除的联系人

有很多与之相关的问题,但没有一个能帮助我找到解决方案.

我正在尝试将所有联系人从设备同步到远程服务器,并且能够轻松完成,但是当更新/删除/插入(新联系人)等联系人发生更改时无法找到解决方案.

尝试使用ContentObserveronChange()被多次调用.很难找到联系人更改数据.

    public class ContactService extends Service {

    private int mContactCount;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContactCount = getContactCount();

        Log.d("Contact Service", mContactCount + "");

        this.getContentResolver().registerContentObserver(
                ContactsContract.Contacts.CONTENT_URI, true, mObserver);
    }

    private int getContactCount() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(
                    ContactsContract.Contacts.CONTENT_URI, null, null, null,
                    null);
            if (cursor != null) {
                return cursor.getCount();
            } else {
                return 0;
            }
        } catch (Exception ignore) { …
Run Code Online (Sandbox Code Playgroud)

android sync android-contacts contentobserver

17
推荐指数
1
解决办法
1万
查看次数

当为给定的URI调用ContentResolver.notifyChange()时,ContentObservers是否会通知此URI的后代URI?

一个有希望直截了当的问题:当ContentResolver.notifyChange()为某个给定URI调用时,是否会ContentObserver观察到此URI的后代 URI?

例如,假设我有一个游标设置来观察特定资源的URI:

 Uri uriA = Uri.parse("content://" + AUTHORITY + "/orders/21");
 cursor.setNotificationUri(getContext().getContentResolver(), uriA);
Run Code Online (Sandbox Code Playgroud)

然后我通知ContentResolver更改此URI的祖先(例如,因为我删除了所有订单):

 Uri uriB = Uri.parse("content://" + AUTHORITY + "/orders");
 getContext().getContentResolver().notifyChange(uriB, null);
Run Code Online (Sandbox Code Playgroud)

我的Cursor注册观察uriA会被通知吗?

android uri android-contentresolver android-contentprovider contentobserver

16
推荐指数
2
解决办法
9001
查看次数

为什么ContentObserver被多次调用?

我有以下ContentObserver接收和编写SMS的实现,但它被多次调用.

码:

public class SMSObserverActivity extends Activity {
    protected MyContentObserver observer = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String url = "content://mms-sms/";
        Uri uri = Uri.parse(url);
        observer = new MyContentObserver(new Handler());
        getContentResolver().registerContentObserver(uri, true, observer);
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();

        getContentResolver().unregisterContentObserver(observer);
    }

    class MyContentObserver extends ContentObserver {
        ContentValues values = new ContentValues();
        Handler handler;

        public MyContentObserver(Handler handler){
            super(handler);
            this.handler = handler;
        }

        @Override
        public boolean deliverSelfNotifications(){
            return …
Run Code Online (Sandbox Code Playgroud)

android android-2.2-froyo contentobserver

13
推荐指数
1
解决办法
7519
查看次数

你能用registerContentObserver确定联系人的变化吗?

只是尝试确定在使用registerContentObserver或其他方法时是否有一种简单的方法来确定哪些联系人发生了变化?我可以告诉数据库何时更改,但不确定每次更新/更改发生时我都要检查所有记录.

基本上,如果我有一个联系人列表,一个通过手动方法更新(即我更改联系人的电话号码或添加新的联系人),或自动(说ActiveSync照片添加,更改).我希望能够A)知道某些事情发生了变化,并且B)知道哪些联系人的某些数据发生了变化.

我正在尝试寻找某些用户,我可以从远程服务中匹配他们的照片.如果有更多信息添加到用户帐户,我希望能够检查它以查看它是否提供匹配.我不想安排它,我想在更新发生后这样做.

克里斯.

android contacts contentobserver

12
推荐指数
1
解决办法
6697
查看次数

观察Audio.Media.EXTERNAL_CONTENT_URI的Android内容观察者的更改

我正在开发一个Android应用程序,我必须检测Android SD卡中音频文件的变化,文件名,文件路径和执行的操作.例如,如果我在SD卡中添加文件,那么我想知道

  1. 添加的文件的名称
  2. 文件的路径
  3. 操作 - 添加

以前我已经尝试过文件观察器但是为此我必须在每个目录上应用它.所以我搜索了一些其他解决方案,并获得了有关Audio.Media.EXTERNAL_CONTENT_URI的信息.然后我创建了一个像这样的内容观察者

UriObserver.java - 一个内容观察者

class UriObserver extends ContentObserver {

    public UriObserver(Handler handler) {
        super(handler);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onChange(boolean selfChange) {
        // TODO Auto-generated method stub
        super.onChange(selfChange);

        Log.d("INSTANT", "GETTING CHANGES");
    }

}
Run Code Online (Sandbox Code Playgroud)

这是注册的代码

UriObserver observer = new UriObserver(new Handler());

Log.d("INSTANT", "registered content observer");

this.getApplicationContext()
    .getContentResolver()
    .registerContentObserver(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,
    observer);

Log.d("INSTANT", "registered content observer");
Run Code Online (Sandbox Code Playgroud)

它让我知道在与音频文件相关的SD卡中发生了一些变化.但它没有提供有关添加,编辑或删除哪个文件的任何信息.

然后我搜索了解决方案并得到了这篇文章

Android:如何通过MTP连接时检测MediaStore中的更改

在这篇文章中,Bhiefer给出了一些代码作为答案,我认为它可以起作用,所以我试图实现它,但我无法这样做.

我能为此做些什么?

更新

我可以查询Audio.Media.EXTERNAL_CONTENT_URI的最新更改吗?这段代码:

mCursor = context.getContentResolver().query(
                    Audio.Media.EXTERNAL_CONTENT_URI, …
Run Code Online (Sandbox Code Playgroud)

android android-sdcard android-mediascanner contentobserver fileobserver

12
推荐指数
1
解决办法
8375
查看次数

电话簿更新时Android通知(内容观察者)

如果联系人数据库中有任何更改(添加,删除),我想在手机上收到通知.现在我正在使用ContentObserver获得通知.以下是我的代码.问题是我无法知道哪个联系人改变了.任何人都可以帮忙???

public class ContentObserverActivity extends Activity {
    Button registerbutton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        registerbutton=(Button)findViewById(R.id.button1);
        registerbutton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
            getContentResolver()
                .registerContentObserver(
                        ContactsContract.Contacts.CONTENT_URI, true,
                        new MyCOntentObserver());   
            }
        });
    }


    public class MyCOntentObserver extends ContentObserver{
        public MyCOntentObserver() {
            super(null);
        }
        @Override
        public void onChange(boolean selfChange) {
        super.onChange(selfChange);
            Log.e("","~~~~~~"+selfChange);
        }  

        @Override
        public boolean deliverSelfNotifications() {
            return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

android contacts contentobserver

11
推荐指数
2
解决办法
7698
查看次数

当且仅当ContactsContract.Contacts.CONTENT_URI更改时,ContentObserver才应调用

由于我的应用程序使用来自android.provider.ContactsContract.Data(API> 11)和ContactsContract.Contacts.CONTENT_URI(API <11)的内容来填充Contacts.

我试图registerContentObserver()反对这些提供商.但ContentObserver即使我在拨打电话时试图通过设备呼叫某个人,它也会调用我的电话.它确实会触发我ContentObserver对我没用的内容,因为没有内容更改Contacts Provider.

根本原因:

当从合法唤醒的设备发出呼叫时,似乎LAST_TIME_CONTACTED或某些事情ContactsContract.Contacts.CONTENT_URI会发生变化ContentObserver.

尝试:

private class ContactsContentObserver extends ContentObserver {
    public ContactsContentObserver() {
        super(null);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Zname.getPreferences().setRefreshContact(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

注册ContentObserverOnCreate()Activity

ContactsContentObserver contactsContentObserver = new ContactsContentObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver);
Run Code Online (Sandbox Code Playgroud)

试着用notifyForDescendentsfalseregisterContentObserver.它仍会触发ContentObserver

QUES:

当且仅当联系人信息在CRUD(创建,更新,删除)或其后代之外时,如何注册ContentObserver哪个触发Last_Time_Contacted

android android-contentprovider contentobserver

11
推荐指数
2
解决办法
5741
查看次数

如何在RecyclerView中使用ContentObserver?

随着ListView我们有一个很好的本土模式的一些数据从数据库到列表图:

DB- > ContentProvider- > CursorLoader- > CursorAdapter- >ListView

这种方法在数据层分离,性能和自动数据更新方面表现良好.但这种模式并不适合新的RecyclerView.有一些模仿旧行为的方法:

将recyclerview与数据库一起使用

但有使用旧式的问题notifyDataSetChangedRecyclerView.它不能使用ItemAnimator功能,它会失去滚动位置,而且它只是无效.

那么,在使用数据库封装时,我们如何从优质变更通知中受益ContentProviderCursor是静态的,要从中获取新数据,我们需要获得新的数据Cursor.因此,似乎我们需要一个自定义中间数据层,它将合并来自Cursors的数据并将List实体暴露给RecyclerView.Adapter.此外,我们还必须手动将ContentObserver onChange()事件映射到RecyclerView通知.这也意味着我们必须摆脱CursorLoader.对于这样的基本任务来说,这是一项令人难以置信的工作.

有没有更好的解决方案?

android android-contentprovider contentobserver android-recyclerview

11
推荐指数
1
解决办法
634
查看次数