Получить список доступных поставщиков контента
Есть ли способ программно перечислить всех доступных поставщиков контента на устройстве? Нет реального варианта использования, я просто подумал, что было бы неплохо увидеть, какие приложения, которые я установил на свой телефон, выставили провайдеров контента.
5 ответов
Это должно быть возможно путем вызова 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, как это $ adb shell dumpsys > dumpsys.txt
и поиск строки поставщиков контента в выходном файле. Из этого я могу видеть список поставщиков контента в устройстве / эмуляторе.
Список зарегистрированных поставщиков контента можно собрать с помощью:
adb shell dumpsys package providers
Протестировано на Android 8.1 Oreo
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()
чтобы получить идентификатор пользователя моего собственного процесса.
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;