Displayeinstellungen anpassen

Android enthält APIs, mit denen Apps die Anzeigeeinstellungen auf unterstützter Hardware anpassen können. Auf Android TV OS können Apps dies nutzen, um sicherzustellen, dass Inhalte im bestmöglichen Format angezeigt werden. Dazu wird die Framerate und das Farbprofil für ein optimales Seherlebnis angepasst.

An Framerate des Inhalts anpassen

Wenn die Framerate eines Videos nicht mit der Aktualisierungsrate des Displays übereinstimmt, können Nutzer unangenehme Ruckler durch die Framerate-Konvertierung bemerken. Das ist besonders bei langsamen Schwenks sichtbar. Aus diesem Grund ist es wichtig, die SurfaceControl.Transaction.setFrameRate() API zu verwenden, um das Framework über die Framerate der Inhalte zu informieren und zu signalisieren, ob die Videoinhalte für einen nicht nahtlosen Framerate-Wechsel infrage kommen.

Weitere Informationen finden Sie im Leitfaden zur Bildrate.

Bevorzugte Bildprofile abgleichen

Mit der MediaQuality API in Android 16 können Entwickler die Kontrolle über Bildprofile übernehmen.

Beispiele:

  • Bei Filmen und Serien, die mit einem größeren Dynamikbereich gemastert wurden, können Entwickler den Filmmaker-Modus anfordern, um Inhalte so anzuzeigen, wie der Creator sie sich vorgestellt hat. Ein Kinoprofil mit höherer Farbgenauigkeit bringt subtile Details in Schatten zum Vorschein, anstatt die Helligkeit zu erhöhen.
  • Live-Sportveranstaltungen, die oft mit einem geringen Dynamikbereich gemastert und bei Tageslicht angesehen werden, können von einem Profil profitieren, das Helligkeit gegenüber Farbgenauigkeit bevorzugt.
  • Spieleentwickler können ein Profil mit niedriger Latenz und minimaler Bildverarbeitung anfordern, damit Spieler die bestmögliche Leistung von ihrem Display erhalten.

Systembildprofil auswählen

Bevor Sie ein Bildprofil auswählen, müssen Sie zuerst prüfen, ob das Gerät es unterstützt.

Das folgende Snippet zeigt, wie Sie mit getAvailablePictureProfiles() alle unterstützten Bildprofile abfragen und ein Sportprofil anwenden:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
    val mediaQualityManager: MediaQualityManager =
        context.getSystemService(MediaQualityManager::class.java)
    val profiles = mediaQualityManager.getAvailablePictureProfiles(null)
    for (profile in profiles) {
        // If we have a system sports profile, apply it to our media codec
        if (profile.profileType == PictureProfile.TYPE_SYSTEM
            && profile.name == NAME_SPORTS
        ) {
            val bundle = Bundle().apply { 
                putParcelable(MediaFormat.KEY_PICTURE_PROFILE_INSTANCE, profile)
            }
            mediaCodec.setParameters(bundle)
        }
    }
}

So rufen Sie ein bestimmtes Profil anhand des Namens ab: getPictureProfile():

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
    val profile = mediaQualityManager.getPictureProfile(
        PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}

Wenn Sie nicht abfragen müssen, ob ein Profil verfügbar ist, können Profile direkt über ihre ID an einen MediaCodec übergeben werden. Verwenden Sie dazu MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Die unterstützten Profile können je nach Gerät variieren. Sie können jedoch die folgenden bekannten Systemprofil-IDs abgleichen:

const val NAME_STANDARD: String = "standard"
const val NAME_VIVID: String = "vivid"
const val NAME_SPORTS: String = "sports"
const val NAME_GAME: String = "game"
const val NAME_MOVIE: String = "movie"
const val NAME_ENERGY_SAVING: String = "energy_saving"
const val NAME_USER: String = "user"