GetApplicationBanner возвращает null

Я работаю над настраиваемой программой запуска Android для окна настройки и пытаюсь получить баннер телевизионных приложений (те, что показаны на изображении ниже), используя packageInfo.applicationInfo.loadBanner(context.getPackageManager()); ИЛИ context.getPackageManager().getApplicationBanner(packageName)

GetApplicationBanner возвращает null Он работает для большинства приложений, однако некоторые из них в результате возвращают значение null, например Google Play Games, хотя я могу получить значок (это логотип без текста рядом с ним).

Я использую правильный API? Есть ли способ получить это программно?

0
0
510
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из документации метода 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, NameNotFoundException is thrown.

Ваша функция также должна вызывать getApplicationIcon, чтобы вернуть свой баннер после вызова метода getApplicationBanner.

Я использую getApplicationIcon после getApplicationBanner в случае, если баннер имеет значение null, которое возвращает значок, как ожидалось. Но мне нужен баннер, а не значок

beginner1 09.10.2018 12:36

В документации говорится, что вы также должны вызвать getApplicationIcon, чтобы вернуть его баннер.

jess 10.10.2018 04:16

что я понял из документации, что getApplicationBanner будет называть getApplicationIcon, но в любом случае я вызываю его и тот же результат

beginner1 10.10.2018 07:59
Ответ принят как подходящий

У меня тоже такая проблема. Причина, по которой разработчики приложений не прикрепляли баннер к пакету, заключается в том, что они прикрепляют баннер к активности.

Образец:

<?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);
    }
}

спасибо наконец то работает! но любая идея, как я могу получить намерение для указанного пакета, не просматривая их все

beginner1 08.11.2018 10:35

Другие вопросы по теме