有没有办法以编程方式列出设备上的所有可用content providers?没有真正的用例,我只是觉得看到我在手机上安装了哪些应用程序有暴露的内容提供商可能会很好。
答案 0 :(得分:54)
应该可以通过GET_PROVIDERS
来调用PackageManager.getInstalledPackages()。
编辑:示例:
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);
}
}
}
答案 1 :(得分:17)
从命令行运行:
adb shell dumpsys | grep Provider{
注意开口支撑。这将为您提供通过各种软件包安装的所有提供程序的简短列表。
答案 2 :(得分:13)
我使用了像此$ adb shell dumpsys > dumpsys.txt
这样的adb shell命令,并在输出文件中搜索内容提供程序字符串。从那里我可以看到设备/模拟器中的内容提供商列表。
答案 3 :(得分:7)
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。
答案 4 :(得分: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;
答案 5 :(得分:0)
可以通过以下方式收集注册内容提供商的列表:
adb shell dumpsys package providers
在Android 8.1 Oreo上测试