获取可用内容提供商列表

Mar*_*k B 35 android

有没有办法以编程方式列出设备上的所有可用内容提供商?没有真正的用例,我只是觉得看到我在手机上安装了哪些已经暴露内容提供商的应用程序可能很简洁.

Mir*_* N. 55

应该可以通过调用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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我能够打印出提供商列表,但是如何确定可以查询的实际内容?ProviderInfo是否包含我可以传递给query()调用的URI? (2认同)

Sim*_*est 19

从命令行运行:

adb shell dumpsys | grep Provider{

注意开口支撑.这将为您提供通过各种包安装的所有提供程序的简短列表.


小智 13

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


Cor*_*son 7

List<ProviderInfo> providers = getContext().getPackageManager()
    .queryContentProviders(null, 0, 0);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


小智 6

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

adb shell dumpsys package providers

在 Android 8.1 Oreo 上测试