1

我有一个 VOIP 通话和短信应用程序。我需要能够监控对本机阻止号码列表的更改,以便我可以在我的服务器上维护该列表。

按照https://developer.android.com/reference/android/provider/BlockedNumberContract.html上有关 BlockedNumberContract 的文档,它说要实现一个 ContentObserver 来监视用户何时对列表进行更改。

我的应用程序要求用户将其设置为默认的消息应用程序,这样就涵盖了文档中说明的部分

只有系统、默认 SMS 应用程序和默认电话应用程序(请参阅 getDefaultDialerPackage())和运营商应用程序(请参阅 CarrierService)可以读取和写入被阻止的号码提供程序。

我创建了一个服务并在清单中注册了它。该服务已正确启动,我可以看到我在 onStartCommand() 中的日志

public class MonitorBlockedContactsListService extends Service
{
    private static CallBlockedListContentObserver myObserver;

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

    @SuppressLint("NewApi")
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("starting MonitorBlockedContactsListService");
        myObserver = new CallBlockedListContentObserver(new Handler());
        getContentResolver().registerContentObserver
                (BlockedNumberContract.BlockedNumbers.CONTENT_URI, true, myObserver);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        getContentResolver().unregisterContentObserver(myObserver);
        super.onDestroy();
    }
}

这是 CallBlockedListContentObserver 的实现

public class CallBlockedListContentObserver extends ContentObserver
{
    public CallBlockedListContentObserver(Handler handler)
    {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange) {
        this.onChange(selfChange, null);
        Log.i("CallBlockedListContentObserver", "first method");
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        Log.i("CallBlockedListContentObserver", "2nd method uri= "+uri);
    }

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

我的问题是,当我阻止电话簿中的联系人时,2 onChange() 方法中的日志永远不会被打印出来,这导致我认为 ContentObserver 没有跟踪更改。我目前正在 Android 7 设备上进行测试,因此 BlockedNumberContract 是一个新的 API 没有问题。谁能告诉我我做错了什么?当我阻止联系人时,为什么我的应用程序没有收到通知?谢谢!!

4

0 回答 0