【问题标题】:Get a list of available Content Providers获取可用内容提供者的列表
【发布时间】:2011-01-01 09:01:57
【问题描述】:

有没有办法以编程方式列出设备上所有可用的content providers?没有真正的用例,我只是想看看我在手机上安装的哪些应用程序暴露了内容提供者可能会很好。

【问题讨论】:

  • 您可以从命令行运行adb bugreport,它将转储有关活动设备的信息,包括有关每个包及其提供的所有内容的大量信息:活动、服务、内容提供商...

标签: android


【解决方案1】:

应该可以通过调用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);
            }
        }
    }

【讨论】:

  • 我可以打印出提供者列表,但是如何确定可以查询的实际内容? ProviderInfo 是否包含我可以传递给 query() 调用的 URI?
  • @gonzobrains 不,你永远不会知道,直到你发布他们的应用程序的秘密:)
  • 我正在寻找给定设备的书签 URI。我无法使用您的代码找到 content://browser/bookmarks uri?关于如何找到合适的书签 uir 的任何想法? (见我的问题stackoverflow.com/questions/28040445/…
【解决方案2】:

从命令行运行:

adb shell dumpsys | grep Provider{

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

【讨论】:

  • 我相信这个grep命令匹配的实际行显示了应用程序的包和提供者的包。如果您想查看与其关联的权限,它位于方括号内的前一行。您可能希望将其转储到文件中并结合上下文查看。
【解决方案3】:

我使用 $ adb shell dumpsys > dumpsys.txt 这样的 adb shell 命令并在输出文件中搜索内容提供者字符串。从中我可以看到设备/模拟器中的内容提供者列表。

【讨论】:

    【解决方案4】:
    List<ProviderInfo> providers = getContext().getPackageManager()
        .queryContentProviders(null, 0, 0);
    

    列出此设备上可供您使用的所有内容提供商。

    或者,如果您知道提供程序的进程名称和 UID,则可以通过指定这两个参数来减少列表。我以前用它来检查我的自己的内容提供商的存在,更具体地说是以前(免费与付费)安装的那些:

    List<ProviderInfo> providers = getContext().getPackageManager()
        .queryContentProviders("com.mypackage", Process.myUid(), 0);
    

    注意android.os.Process.myUid() 以获取我自己的进程的用户 ID。

    【讨论】:

      【解决方案5】:

      注册内容提供商的列表可以通过以下方式收集:

      adb shell dumpsys package providers

      在 Android 8.1 Oreo 上测试

      【讨论】:

        【解决方案6】:
        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多