是否可以通过编程方式列出设备上所有可用的content providers?没有实际用例,我只是想看看我的手机上安装了哪些暴露了内容提供程序的应用程序可能会很整洁。
应该可以通过用PackageManager.getInstalledPackages()调用GET_PROVIDERS
。
EDIT:示例:
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,则可以通过指定这两个参数来缩小列表。我之前曾用它来检查我的own内容提供程序的存在,更具体地说是以前的(免费与付费)安装的内容提供程序:
List<ProviderInfo> providers = getContext().getPackageManager()
.queryContentProviders("com.mypackage", Process.myUid(), 0);
注意android.os.Process.myUid()
以获取我自己的进程的用户ID。
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;
可以通过以下方式收集已注册内容提供者的列表:
adb shell dumpsys package providers
在Android 8.1 Oreo上进行测试