Android Browser.BOOKMARKS_URI不适用于所有设备.如何找出给定设备的正确uri?

Pas*_*cal 8 android bookmarks android-browser android-contentprovider

我正在尝试在我的应用中使用Android Browser.BOOKMARKS_URI到CRUD设备书签(https://play.google.com/store/apps/details?id=com.elementique.web)

它在大多数设备上工作正常,但在某些设备上不起作用:-(

在这些设备上,试图使用书签导致

java.lang.IllegalArgumentException: Unknown URL content://browser/bookmarks
Run Code Online (Sandbox Code Playgroud)

我现在明白Boookmark Uri可能与AOSP默认值不同(即"content:// browser/bookmarks").

题:

如何为给定设备获取正确的Bookmark 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");
Run Code Online (Sandbox Code Playgroud)

这是一种在设备上"列出"所有可用内容URI(内容:// ...)的方法吗?如果是,我可以列出它们并搜索"/ bookmarks"字符串的出现并尝试使用此URI.

注意:

我目前正在创建一个回退机制,如果应用程序无法获得"工作"书签URI(即我自己的书签数据库,因为我在我的应用程序中需要书签功能)

Zam*_*unk 4

有没有办法“列出”设备上所有可用的内容 URI (content://...)?

Play Store中有一个名为“Content Provider Helper”的开源 APP ,可以列出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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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