有没有一种以编程方式列出设备上所有可用的内容提供者的方法?没有真正的用例,我只是想看看我手机上安装的哪些应用程序公开了内容提供者。
可以通过调用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命令 $ adb shell dumpsys > dumpsys.txt
并在输出文件中查找内容提供程序字符串。 通过这种方式,我可以看到设备/模拟器中的内容提供程序列表。
可以使用以下命令收集已注册内容提供程序的列表:
adb shell dumpsys package providers
在 Android 8.1 Oreo 上测试通过
List<ProviderInfo> providers = getContext().getPackageManager()
.queryContentProviders(null, 0, 0);
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 bugreport
命令,它会转储有关活动设备的大量信息,包括每个软件包及其提供的所有信息:活动、服务、内容提供者等。 - Christopher Orr