Dostosowywanie ustawień wyświetlania

Android zawiera interfejsy API, które umożliwiają aplikacjom dostosowywanie ustawień wyświetlania na obsługiwanym sprzęcie. W systemie Android TV aplikacje mogą korzystać z tego mechanizmu, aby wyświetlać treści w najlepszym możliwym formacie, dopasowując częstotliwość wyświetlania klatek i profil kolorów, co zapewni użytkownikom optymalne wrażenia.

Dopasuj do liczby klatek treści

Gdy częstotliwość klatek filmu nie jest zgodna z częstotliwością odświeżania wyświetlacza, użytkownicy mogą zauważyć nieprzyjemne artefakty związane z trzęsieniem obrazu spowodowanym konwersją częstotliwości klatek. Jest to szczególnie widoczne podczas ujęć z powolnym panoramowaniem. Z tego powodu ważne jest, aby użyć interfejsu API SurfaceControl.Transaction.setFrameRate(), aby poinformować framework o częstotliwości odświeżania treści i o tym, czy materiał wideo kwalifikuje się do niepłynnego przełączania częstotliwości odświeżania.

Więcej informacji znajdziesz w przewodniku po częstotliwości odświeżania.

Dopasowywanie preferowanych profili zdjęć

Interfejs MediaQuality API w Androidzie 16 umożliwia programistom kontrolowanie profili zdjęć.

Oto kilka przykładowych scenariuszy:

  • W przypadku filmów i seriali telewizyjnych zmasterowanych z szerszym zakresem dynamicznym deweloperzy mogą poprosić o tryb reżyserski, aby wyświetlać treści zgodnie z zamierzeniami twórcy. Profil filmowy o większej dokładności kolorów uwydatnia subtelne szczegóły w cieni kosztem zwiększenia jasności.
  • Transmisje na żywo wydarzeń sportowych, które często są masterowane z wąskim zakresem dynamicznym i oglądane w świetle dziennym, mogą korzystać z profilu, który preferuje jasność nad dokładnością kolorów.
  • Deweloperzy gier mogą poprosić o profil o małym opóźnieniu z minimalnym przetwarzaniem obrazu, aby gracze mogli uzyskać najlepszą wydajność wyświetlacza.

Wybieranie profilu z zdjęciem systemowym

Zanim wybierzesz zdjęcie profilowe, sprawdź, czy Twoje urządzenie je obsługuje.

Ten fragment kodu pokazuje, jak za pomocą funkcji getAvailablePictureProfiles() wysłać zapytanie o wszystkie obsługiwane profile obrazów i zastosować profil sportowy:

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 go przekazać bezpośrednio do MediaCodec za pomocą identyfikatora za pomocą funkcji MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Obsługiwane profile mogą się różnić w zależności od urządzenia. Możesz dopasowywać je do tych znanych identyfikatorów profilu systemowego:

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"