Android Browser.BOOKMARKS_URI не работает на всех устройствах. Как узнать правильный uri для данного устройства?

Я пытаюсь использовать Android Browser.BOOKMARKS_URI для закладок устройства CRUD из моего приложения (https://play.google.com/store/apps/details?id=com.elementique.web)

Он отлично работает на большинстве устройств, но не работает на некоторых: - (

На этих устройствах попытка использования закладок приводит к

java.lang.IllegalArgumentException: Unknown URL content://browser/bookmarks

Теперь я понимаю, что Boookmark Uri может отличаться от значения по умолчанию AOSP (т.е. "content://browser/bookmarks" ).

Вопрос:

Как я могу получить правильную закладку Uri для данного устройства?

Я уже "собрал" следующий URI

private static final Uri BOKKMARKS_DEFAULT = Browser.BOOKMARKS_URI; // = Uri.parse("content://browser/bookmarks")
private static final Uri BOKKMARKS_URI_CHROME = Uri.parse("content://com.android.chrome.browser/bookmarks");
private static final Uri BOKKMARKS_URI_SAMSUNG_S_ = Uri.parse("content://com.sec.android.app.sbrowser.browser/bookmarks");

Это способ "перечислить" все доступные URI контента (контент://...) на устройствах? Если да, я мог бы перечислить их и найти появление строки "/bookmarks" и попробовать с этим URI.

Примечание:

В настоящее время я создаю резервный механизм, если приложение не может получить "рабочий" URI закладки (т.е. моя собственная закладная, поскольку мне нужна функция закладки в моем приложении)

Ответ 1

Есть ли способ "перечислить" все доступные URI содержимого (content://...) на устройствах?

В приложении Play Store имеется приложение AP с открытым исходным кодом, которое может отображать все доступные content:// URI на устройстве. Он использует PackageManager.GET_PROVIDER

Здесь соответствующий класс, который ищет всех доступных поставщиков содержимого:

SearchProviderTask.java

package com.jensdriller.contentproviderhelper.task;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.net.Uri;

public class SearchProvidersTask extends DialogAsyncTask<Uri, Void, List<String>> {
    public SearchProvidersTask(Context context) {
        super(context);
    }

    @Override
    protected List<String> doInBackground(Uri... params) {
        List<String> contentProviders = new ArrayList<String>();

        try {
            PackageManager pm = mContext.getPackageManager();
            for (PackageInfo pack : pm.getInstalledPackages(PackageManager.GET_PROVIDERS)) {
                ProviderInfo[] providers = pack.providers;
                if (providers != null) {
                    for (ProviderInfo provider : providers) {
                        contentProviders.add("content://" + provider.authority);
                    }
                }
            }
        } catch (Exception e) {
            // PackageManager has died?
            mException = e;
        }

        // Sort alphabetically and ignore case sensitivity
        Collections.sort(contentProviders, new Comparator<String>() {
            @Override
            public int compare(String lhs, String rhs) {
                return lowerCase(lhs).compareTo(lowerCase(rhs));
            }

            private String lowerCase(String s) {
                return s.toLowerCase(Locale.getDefault());
            }
        });
        return contentProviders;
    }
}

Github: https://github.com/jenzz/ContentProviderHelper

Ответ 2

Это запрос для поиска закладок;

cursor = mContentResolver.query(Browser.BOOKMARKS_URI, BOOKMARKS_PROJECTION,
                Browser.BookmarkColumns.BOOKMARK + " == 1" + 
                    " AND LOWER(" + Browser.BookmarkColumns.TITLE + ") LIKE ?", 
                new String[] { searchText + "%" },
                Browser.BookmarkColumns.TITLE + " ASC");