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

Posted

技术标签:

【中文标题】Android Browser.BOOKMARKS_URI 不适用于所有设备。如何找出给定设备的正确 uri?【英文标题】:Android Browser.BOOKMARKS_URI does not work on all devices. How to find out the correct uri for a given device? 【发布时间】:2015-03-18 09:24:37 【问题描述】:

我正在尝试使用 android Browser.BOOKMARKS_URI 从我的应用程序 (https://play.google.com/store/apps/details?id=com.elementique.web) 中对设备书签进行 CRUD 处理

它在大多数设备上都可以正常工作,但在某些设备上无法正常工作:-(

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

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

我现在了解到,书签 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 (content://...) 的方法吗? 如果是,我可以列出它们并搜索“/bookmarks”字符串的出现并尝试使用此 URI。

注意

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

【问题讨论】:

【参考方案1】:

这是搜索书签的查询;

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");

【讨论】:

问题是“如何找出给定设备的正确 uri?”【参考方案2】:

有没有办法“列出”设备上所有可用的内容 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;
    

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

【讨论】:

谢谢!似乎几乎是我要找的。我只需要能够过滤 contentProvider 以保留书签。我认为我们不能做得比这更好,所以,从我的角度来看,这是正确的答案。谢谢:-) 希望对您有所帮助。如果您设法收集了更多浏览器 URI,也请分享 ;-) 它肯定会为我们所有人节省时间。

以上是关于Android Browser.BOOKMARKS_URI 不适用于所有设备。如何找出给定设备的正确 uri?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制