Я работаю над настраиваемой программой запуска Android для окна настройки и пытаюсь получить баннер телевизионных приложений (те, что показаны на изображении ниже), используя
packageInfo.applicationInfo.loadBanner(context.getPackageManager());
ИЛИ
context.getPackageManager().getApplicationBanner(packageName)
Он работает для большинства приложений, однако некоторые из них в результате возвращают значение null, например Google Play Games, хотя я могу получить значок (это логотип без текста рядом с ним).
Я использую правильный API? Есть ли способ получить это программно?
Из документации метода getApplicationBanner:
added in API level 20
public abstract Drawable
getApplicationBanner(String packageName)Retrieve the banner associated with an application. Given the name of the application's package, retrieves the information about it and calls
getApplicationIcon()to return its banner. If the application cannot be found,NameNotFoundExceptionis thrown.
Ваша функция также должна вызывать getApplicationIcon, чтобы вернуть свой баннер после вызова метода getApplicationBanner.
В документации говорится, что вы также должны вызвать getApplicationIcon, чтобы вернуть его баннер.
что я понял из документации, что getApplicationBanner будет называть getApplicationIcon, но в любом случае я вызываю его и тот же результат
У меня тоже такая проблема. Причина, по которой разработчики приложений не прикрепляли баннер к пакету, заключается в том, что они прикрепляют баннер к активности.
Образец:
<?xml version = "1.0" encoding = "utf-8" standalone = "no"?><manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "ru.tv1.android.tv">
......
<application android:allowBackup = "true" android:icon = "@drawable/ic_launcher" android:label = "@string/app_name" android:name = "ru.kino1tv.android.tv.App" android:supportsRtl = "true" android:theme = "@style/AppTheme.Leanback">
<activity android:banner = "@drawable/app_icon_banner" android:icon = "@drawable/app_icon_banner" android:label = "@string/app_name" android:logo = "@drawable/app_icon_banner" android:name = "ru.kino1tv.android.tv.ui.activity.MainActivity" android:screenOrientation = "landscape">
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name = "android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
<meta-data android:name = "android.app.searchable" android:resource = "@xml/searchable"/>
<intent-filter>
<action android:name = "android.intent.action.SEARCH"/>
</intent-filter>
</activity>
......
</application>
</manifest>
У каждого пакета может быть несколько запусков. Итак, вам нужно сначала попытаться загрузить баннер для активности, а затем, если это null, попытаться загрузить баннер для пакета.
Intent AppsIntent = new Intent(Intent.ACTION_MAIN, null);
AppsIntent.addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER);
List<ResolveInfo> apps = mPackageManager.queryIntentActivities(AppsIntent, 0);
for (ResolveInfo app : apps) {
Drawable banner = app.activityInfo.loadBanner(mPackageManager);
if (banner == null) {
banner = app.activityInfo.applicationInfo.loadBanner(mPackageManager);
}
}
спасибо наконец то работает! но любая идея, как я могу получить намерение для указанного пакета, не просматривая их все
Я использую
getApplicationIconпослеgetApplicationBannerв случае, если баннер имеет значение null, которое возвращает значок, как ожидалось. Но мне нужен баннер, а не значок