Браузер ContentObserver не вызывается даже с использованием разных URI

Мой ContentObserver для просмотра истории в браузере не вызывается. Я не понимаю, почему это не так. Я не делаю ничего необычного или странного, я точно следую спецификациям API, но безрезультатно! Ниже мой код:

В моей службе:

public class MonitorService extends Service {
    //some global variables declared here
    private ContentObserver historyObserver, searchObserver, chromeObserver;

    public void onCreate() {
        super.onCreate();
        isRunning = false;
        this.preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        //this.historyObserver = new HistoryObserver();
        this.historyObserver = new HistoryObserver(new Handler());
        this.searchObserver = new HistoryObserver(new Handler());
        this.chromeObserver = new HistoryObserver(new Handler());

        getApplicationContext().getContentResolver().registerContentObserver(Uri.parse("content://com.android.chrome.browser/history"), false, this.chromeObserver);
        getApplicationContext().getContentResolver().registerContentObserver(android.provider.Browser.BOOKMARKS_URI, false, this.historyObserver);
        getApplicationContext().getContentResolver().registerContentObserver(android.provider.Browser.SEARCHES_URI, false, this.searchObserver);
    }
//Other required methods in class
}//end of class

Затем в моем классе HistoryObserver у нас есть:

public class HistoryObserver extends ContentObserver {

    public final String TAG = "HistoryObserver";

    public HistoryObserver(Handler handler) {
        super(handler);
        Log.d(TAG, "Creating new HistoryObserver");
    }

    public HistoryObserver() {
        super(null);
        Log.d(TAG, "Creating a new HistoryObserver without a Handler");
    }

    @Override
    public boolean deliverSelfNotifications() {
        Log.d(TAG, "delivering self notifications");
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Log.d(TAG, "onChange without uri: " + selfChange);
        //onChange(selfChange, null);
    }

    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        Log.d(TAG, "onChange: " + selfChange + "\t " + uri.toString());
    }
}

Как я уже сказал, в этой реализации нет ничего особенного или уникального. Тем не менее, когда я перехожу на новый веб-сайт или ищу что-то в Chrome, метод onChange никогда не запускается.


person lilott8    schedule 26.08.2014    source источник
comment
Служба создается правильно в действии. Я получаю журналы от создания объекта HistoryObserver, поэтому я знаю, что служба запускается правильно и объекты правильно инициализированы.   -  person lilott8    schedule 27.08.2014
comment
По сути, у меня такая же реализация: stackoverflow.com/questions/18987919/, но мой не работает :(   -  person lilott8    schedule 27.08.2014


Ответы (1)


Я понял проблему. Поставщик содержимого /history не является наблюдаемым. Наблюдаемые поступают через /bookmark uri. Как только я это обнаружил, все заработало очень быстро и очень хорошо.

person lilott8    schedule 27.08.2014
comment
Работает ли ContentObserver для Chrome с текущей официальной стабильной версией Chrome 39.0.2171.59? Я сравнил версию 33 с текущей и в текущей, обозреватель закладок/истории больше не срабатывает... - person arne.jans; 19.11.2014
comment
Я не знаю. Проект был конечным проектом - использовался в течение недели, а затем закрывался. Поэтому я не могу ответить вам на это. - person lilott8; 19.11.2014
comment
В текущей версии Chrome он снова должен предоставлять путь к провайдеру с .../history. См. эту проблему: code.google.com/p/chromium/issues/ подробно?id=433804 - person arne.jans; 20.11.2014