Dostosowywanie ustawień wyświetlania

Android zawiera interfejsy API, które umożliwiają aplikacjom dostosowywanie ustawień wyświetlania na obsługiwanym sprzęcie. W systemie operacyjnym Android TV aplikacje mogą wykorzystywać tę funkcję, aby zapewnić wyświetlanie treści w najlepszym możliwym formacie, dopasowując liczbę klatek na sekundę i profil kolorów, co zapewnia idealne wrażenia podczas oglądania.

Dopasuj do liczby klatek treści

Gdy liczba klatek filmu nie odpowiada częstotliwości odświeżania wyświetlacza, użytkownicy mogą doświadczać nieprzyjemnych artefaktów związanych z drganiami obrazu, które wynikają z konwersji liczby klatek. Jest to szczególnie widoczne podczas powolnych ujęć panoramicznych. Z tego powodu użyj interfejsu API Surface.setFrameRate, aby powiadomić platformę o liczbie klatek treści i zasygnalizować, czy treści wideo kwalifikują się do niepłynnego przełączania liczby klatek.

Więcej informacji znajdziesz w przewodniku po liczbie klatek.

Dopasowywanie preferowanych profili obrazu

Interfejs MediaQuality API w Androidzie 16 umożliwia deweloperom kontrolowanie profili obrazu.

Przykładowe scenariusze:

  • W przypadku filmów i seriali telewizyjnych, które są zmasterowane z szerszym zakresem dynamicznym, deweloperzy mogą poprosić o tryb filmowca, aby dokładnie wyświetlać treści zgodnie z zamierzeniami twórcy. Profil kinowy z większą dokładnością kolorów wydobywa subtelne szczegóły w cieniach, zwiększając jasność.
  • Wydarzenia sportowe na żywo, które często są transmitowane z wąskim zakresem dynamiki i oglądane w świetle dziennym, mogą skorzystać na profilu, który preferuje jasność nad dokładnością kolorów.
  • Deweloperzy gier mogą poprosić o profil o niskim opóźnieniu z minimalnym przetwarzaniem obrazu, aby gracze mogli uzyskać najlepszą wydajność wyświetlacza.

Wybieranie systemowego profilu obrazu

Przed wybraniem profilu obrazu należy najpierw sprawdzić, czy urządzenie go obsługuje.

Poniższy fragment kodu pokazuje, jak użyć getAvailablePictureProfiles do wysłania zapytania o wszystkie obsługiwane profile obrazu i zastosowania profilu sportowego:

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

Aby uzyskać konkretny profil według nazwy, użyj getPictureProfile:

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

Jeśli nie musisz sprawdzać, czy profil jest dostępny, możesz podać go bezpośrednio w MediaCodec za pomocą identyfikatora, używając MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Obsługiwane profile mogą się różnić w zależności od urządzenia, ale możesz rozważyć dopasowanie do tych znanych identyfikatorów profili systemowych:

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"