我有一个 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 没有问题。谁能告诉我我做错了什么?当我阻止联系人时,为什么我的应用程序没有收到通知?谢谢!!