【发布时间】:2011-01-01 09:01:57
【问题描述】:
有没有办法以编程方式列出设备上所有可用的content providers?没有真正的用例,我只是想看看我在手机上安装的哪些应用程序暴露了内容提供者可能会很好。
【问题讨论】:
-
您可以从命令行运行
adb bugreport,它将转储有关活动设备的吨信息,包括有关每个包及其提供的所有内容的大量信息:活动、服务、内容提供商...
标签: android
有没有办法以编程方式列出设备上所有可用的content providers?没有真正的用例,我只是想看看我在手机上安装的哪些应用程序暴露了内容提供者可能会很好。
【问题讨论】:
adb bugreport,它将转储有关活动设备的吨信息,包括有关每个包及其提供的所有内容的大量信息:活动、服务、内容提供商...
标签: android
应该可以通过调用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);
}
}
}
【讨论】:
从命令行运行:
adb shell dumpsys | grep Provider{
注意左大括号。这将为您提供通过各种软件包安装的所有提供程序的简短列表。
【讨论】:
我使用 $ adb shell dumpsys > dumpsys.txt 这样的 adb shell 命令并在输出文件中搜索内容提供者字符串。从中我可以看到设备/模拟器中的内容提供者列表。
【讨论】:
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。
【讨论】:
注册内容提供商的列表可以通过以下方式收集:
adb shell dumpsys package providers
在 Android 8.1 Oreo 上测试
【讨论】:
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;
【讨论】: