获取可用内容提供商列表。

40

有没有一种以编程方式列出设备上所有可用的内容提供者的方法?没有真正的用例,我只是想看看我手机上安装的哪些应用程序公开了内容提供者。


2
你可以从命令行运行 adb bugreport 命令,它会转储有关活动设备的大量信息,包括每个软件包及其提供的所有信息:活动、服务、内容提供者等。 - Christopher Orr
可能是Android内容提供者列表的重复问题。 - richq
6个回答

58

可以通过调用PackageManager.getInstalledPackages()并使用GET_PROVIDERS参数来实现。

编辑:例如:

    for (PackageInfo pack : getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS)) {
        ProviderInfo[] providers = pack.providers;
        if (providers != null) {
            for (ProviderInfo provider : providers) {
                Log.d("Example", "provider: " + provider.authority);
            }
        }
    }

3
我可以打印出提供者列表,但是我该如何确定可以查询的实际内容呢?ProviderInfo是否包含可传入query()调用的URI? - gonzobrains
@gonzobrains 直到他们发布应用程序的秘密,你永远不会知道它 :) - dharmendra
1
我正在寻找给定设备的书签URI。使用您的代码无法找到content://browser/bookmarks uri,有任何找到正确书签URI的想法吗?(请参见我的问题https://dev59.com/MYfca4cB1Zd3GeqPdxBp) - Pascal
请查看此链接: (https://dev59.com/MYfca4cB1Zd3GeqPdxBp#28403816) - Dhiraj Himani

23

从命令行运行:

adb shell dumpsys | grep Provider{

注意开括号。这将为您提供通过各种软件包安装的所有提供程序的简短列表。


我认为此 grep 命令匹配的实际行显示了应用程序的包和提供程序的包。 如果您想查看与其关联的权限,则在方括号内的前一行中。 您可能需要将其转储到文件中,并使用上下文查看它。 - rmeador

14

我使用了类似下面这样的adb shell命令 $ adb shell dumpsys > dumpsys.txt 并在输出文件中查找内容提供程序字符串。 通过这种方式,我可以看到设备/模拟器中的内容提供程序列表。


11

可以使用以下命令收集已注册内容提供程序的列表:

adb shell dumpsys package providers

在 Android 8.1 Oreo 上测试通过


9
List<ProviderInfo> providers = getContext().getPackageManager()
    .queryContentProviders(null, 0, 0);

列出此设备上所有可用的内容提供程序。 或者,如果您知道提供程序的进程名称和UID,则可以通过指定这两个参数来缩小列表。我之前使用过这个功能来检查我的自己的内容提供程序是否存在,更具体地说是先前安装(免费 vs. 付费)的那些内容提供程序:
List<ProviderInfo> providers = getContext().getPackageManager()
    .queryContentProviders("com.mypackage", Process.myUid(), 0);

使用android.os.Process.myUid()获取自己进程的用户ID。


1
List<ProviderInfo> returnList = new ArrayList<ProvderInfo>();
   for (PackageInfo pack:getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS)) 
   {
    ProviderInfo[] providers = pack.providers;
   if (providers != null) 
   { 
      returnList.addAll(Arrays.asList(providers)); 
   } 
 } 
 return returnList;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接