TV donanımını işleme

TV donanımı diğer Android cihazlardan önemli ölçüde farklıdır. Diğer Android cihazlarda bulunan dokunmatik ekran, kamera ve GPS alıcıları gibi donanım özelliklerinden bazıları TV'lerde bulunmaz. TV'ler de tamamen ikincil donanım cihazlarına bağlıdır: Kullanıcıların TV uygulamalarıyla etkileşimde bulunabilmesi için uzaktan kumanda veya oyun kumandası kullanması gerekir. (Çeşitli giriş yöntemleri hakkında bilgi edinmek için TV kumandalarını yönetme bölümüne bakın.)

TV için uygulama geliştirirken, TV donanımında çalışmayla ilgili donanım sınırlamalarını ve gereksinimlerini dikkatlice değerlendirin. Uygulamanızın TV'de çalışıp çalışmadığını ve desteklenmeyen donanım özelliklerini kullanıp kullanmadığını kontrol edin.

TV cihazı olup olmadığını kontrol edin

Hem TV cihazlarında hem de diğer cihazlarda çalışan bir uygulama oluşturuyorsanız uygulamanızın ne tür bir cihazda çalıştığını kontrol etmeniz ve uygulamanızın çalışmasını ayarlamanız gerekebilir. Örneğin, Intent ile başlatılabilecek bir uygulamanız varsa TV odaklı bir etkinlik mi yoksa telefon etkinliği mi başlatacağınızı belirlemek için cihaz özelliklerini kontrol edin.

Uygulamanızın bir TV cihazında çalışıp çalışmadığını belirlemenin önerilen yolu, cihazın televizyon modunda çalışıp çalışmadığını kontrol etmek için PackageManager.hasSystemFeature() yöntemini kullanmaktır. Aşağıdaki örnek kodda, uygulamanızın bir TV cihazında çalışıp çalışmadığını nasıl kontrol edeceğiniz gösterilmektedir:

Kotlin

const val TAG = "DeviceTypeRuntimeCheck"

val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device")
} else {
    Log.d(TAG, "Running on a non-TV Device")
}

Java

public static final String TAG = "DeviceTypeRuntimeCheck";

boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device");
} else {
    Log.d(TAG, "Running on a non-TV Device");
}

Desteklenmeyen donanım özelliklerini ele alma

Uygulamanızın tasarımına ve işlevine bağlı olarak, kullanılamayan belirli donanım özelliklerine geçici çözüm bulmanız mümkün olabilir. Bu bölümde TV'de genellikle hangi donanım özelliklerinin kullanılamadığı, eksik donanım özelliklerinin nasıl tespit edileceği ve bu özelliklere hangi alternatiflerin önerildiği anlatılmaktadır.

Desteklenmeyen TV donanımı özellikleri

TV'lerin amacı diğer cihazlardan farklı olduğundan Android destekli diğer cihazların genellikle sahip olduğu donanım özellikleri yoktur. Bu nedenle, Android sistemi TV cihazında aşağıdaki özellikleri desteklemez:

Donanım Android özellik açıklayıcısı
Dokunmatik ekran android.hardware.touchscreen
Dokunmatik ekran emülatörü android.hardware.faketouch
Telefon Hizmeti android.hardware.telephony
Kamera android.hardware.camera
Near Field Communication (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Mikrofon android.hardware.microphone
Sensörler android.hardware.sensor
Ekran dikey yönde android.hardware.screen.portrait

Not: Bazı TV kumandalarında mikrofon bulunur. Bu, burada açıklanan mikrofon donanımı özelliğiyle aynı değildir. Kumanda mikrofonu tam olarak destekleniyor.

Özelliklerin, alt özelliklerin ve tanımlayıcılarının tam listesi için Özellikler referansına bakın.

TV için donanım gereksinimlerini beyan etme

Android uygulamaları, bu özellikleri sağlamayan cihazlara yüklenmediklerinden emin olmak için uygulama manifest dosyasında donanım özelliği gereksinimlerini beyan edebilir. Mevcut bir uygulamayı TV'de kullanmak üzere genişletiyorsanız uygulamanın TV cihazına yüklenmesini engelleyebilecek donanım gereksinimi beyanları için uygulamanızın manifest dosyasını yakından inceleyin.

Uygulamanız, TV'de bulunmayan dokunmatik ekran veya kamera gibi donanım özellikleri kullanmasına rağmen bu özellikler kullanılmadan çalışabiliyorsa uygulamanızın manifestini, bu özelliklerin gerekli olmadığını belirtecek şekilde değiştirin. Aşağıdaki manifest kod snippet'i, uygulamanızın TV cihazlarında bulunmayan donanım özellikleri gerektirmediğini, ancak bu özellikleri TV dışındaki cihazlarda kullandığını nasıl beyan edeceğinizi gösterir:

<uses-feature android:name="android.hardware.touchscreen"
        android:required="false"/>
<uses-feature android:name="android.hardware.faketouch"
        android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
        android:required="false"/>
<uses-feature android:name="android.hardware.camera"
        android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
        android:required="false"/>
<uses-feature android:name="android.hardware.location.gps"
        android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
        android:required="false"/>
<uses-feature android:name="android.hardware.sensor"
        android:required="false"/>
<!-- Some TV devices have an ethernet connection only -->
<uses-feature android:name="android.hardware.wifi"
        android:required="false"/>

Not: Özellik referansı bölümünde açıklandığı üzere bazı özelliklerin (android.hardware.camera.front gibi) alt özellikleri vardır. Uygulamanızda kullanılan tüm alt özellikleri de required="false" olarak işaretlediğinizden emin olun.

TV cihazlarında kullanılması amaçlanan tüm uygulamalar, TV uygulamalarını kullanmaya başlama bölümünde açıklandığı gibi dokunmatik ekran özelliğinin gerekli olmadığını beyan etmelidir. Uygulamanız normalde TV cihazları tarafından desteklenmeyen özelliklerden birini veya daha fazlasını kullanıyorsa manifest dosyanızdaki bu özellikler için android:required özellik ayarını false olarak değiştirin.

Dikkat: Bir donanım özelliğinin değerini true olarak ayarlayarak gerektiği gibi tanımlanması, uygulamanızın TV cihazlarına yüklenmesini veya Android TV ana ekran başlatıcıda görünmesini engeller.

Donanım özelliklerini ima eden izinlere dikkat edin

Bazı uses-permission manifest beyanları yalnızca donanım özelliklerini belirtir. Bu davranışa göre, uygulama manifestinizde bazı izinler istediğinizde, uygulamanız TV cihazlarına yüklenemeyecek ve kullanılmaya engel olabilir. Genellikle istenen aşağıdaki izinler, örtülü donanım özelliği gereksinimi oluşturur:

İzin Dolaylı donanım özelliği
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera ve
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (yalnızca API düzeyi 20'yi veya altını hedefleyin)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (yalnızca API düzeyi 20'yi veya altını hedefleyin)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Bazı TV cihazlarında yalnızca ethernet bağlantısı vardır.

Donanım özelliği gereksinimi olduğunu belirten izin isteklerinin tam listesi için uses-feature kılavuzuna bakın. Uygulamanız daha önce listelenen özelliklerden birini istiyorsa ima edilen donanım özelliği için manifest dosyanıza uses-feature beyanı ekleyerek bunun gerekli olmadığını belirtin. android:required="false".

Not: Uygulamanız Android 5.0 (API düzeyi 21) veya sonraki sürümleri hedefliyorsa ve ACCESS_COARSE_LOCATION ya da ACCESS_FINE_LOCATION iznini kullanıyorsa kullanıcılar, TV cihazında ağ kartı veya GPS alıcısı olmasa bile uygulamanızı bir TV cihazına yükleyebilirler.

Uygulamanız için donanım özelliklerini isteğe bağlı hale getirdikten sonra, çalışma zamanında bu özelliklerin kullanılabilirliğini kontrol etmeniz ve ardından uygulamanızın davranışını ayarlamanız gerekir. Bir sonraki bölümde, donanım özelliklerinin nasıl kontrol edileceği açıklanmakta ve uygulamanızın davranışını değiştirmeye yönelik bazı yaklaşımlar önerilmiştir.

Manifest'teki filtreleme ve özellikleri bildirme hakkında daha fazla bilgi için uses-feature kılavuzuna bakın.

Donanım özelliklerini kontrol edin

Android çerçevesi, uygulamanızın çalıştığı cihazda donanım özelliklerinin kullanılamadığını size söyleyebilir. Çalışma zamanında belirli özellikleri kontrol etmek için hasSystemFeature(String) yöntemini kullanın. Bu yöntem, kontrol etmek istediğiniz özelliği belirten tek dizeli bir bağımsız değişkeni alır.

Aşağıdaki kod örneğinde, çalışma zamanında donanım özelliklerinin kullanılabilirliğinin nasıl algılanacağı gösterilmektedir:

Kotlin

// Check whether the telephony hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls")
}

// Check whether android.hardware.touchscreen feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.")
}

Java

// Check whether the telephony hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls");
}

// Check whether android.hardware.touchscreen feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.");
}

Dokunmatik ekran

Çoğu TV'de dokunmatik ekran bulunmadığından Android, TV cihazları için dokunmatik ekran etkileşimini desteklemez. Ayrıca dokunmatik ekran, kullanıcının ekrandan 3 metre uzakta oturduğu görüntüleme ortamıyla tutarlı değildir. Kullanıcı arayüzü öğelerinizin ve metninizin, dokunmatik ekran kullanımını gerektirmediğinden veya ima etmediğinden emin olun.

TV cihazlarında uygulamanızı, TV uzaktan kumandasında yön tuşları (D-pad) kullanarak navigasyonu destekleyecek şekilde tasarlayın. TV'ye uygun kontrolleri kullanarak navigasyonu düzgün şekilde destekleme hakkında daha fazla bilgi için TV'de gezinme bölümüne bakın.

Kamera

Televizyonda normalde kamerası olmasa da fotoğrafçılıkla ilgili bir uygulamayı TV'de sağlayabilirsiniz. Örneğin, fotoğraf çeken, görüntüleyen ve düzenleyen bir uygulamanız varsa bu uygulamanın TV'ler için resim alma işlevini devre dışı bırakabilir, kullanıcıların fotoğrafları görüntülemesine ve hatta düzenlemesine izin verebilirsiniz. Kamerayla ilgili uygulamanızın TV'de çalışmasına karar verirseniz uygulama manifest dosyanıza aşağıdaki özellik beyanını ekleyin:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Uygulamanızı kamera olmadan çalışacak şekilde etkinleştirirseniz uygulamanıza kamera özelliğinin kullanılıp kullanılamadığını algılayan ve uygulamanızın çalışmasında düzenlemeler yapan kod ekleyin. Aşağıdaki kod örneğinde, kamera varlığının nasıl algılanacağı gösterilmektedir:

Kotlin

// Check whether the camera hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!")
} else {
    Log.d("Camera test", "No camera available. View and edit features only.")
}

Java

// Check whether the camera hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!");
} else {
    Log.d("Camera test", "No camera available. View and edit features only.");
}

GPS

TV'ler sabit, iç mekan cihazlarıdır ve yerleşik küresel konumlandırma sistemi (GPS) alıcılarına sahip değildir. Uygulamanız konum bilgilerini kullanıyorsa kullanıcıların konum aramasına veya TV cihazı kurulumu sırasında yapılandırılan posta kodu gibi statik bir konum sağlayıcıyı kullanmasına izin verebilirsiniz.

Kotlin

// Request a static location from the location manager.
val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val location: Location = locationManager.getLastKnownLocation("static")

// Attempt to get postal code from the static location object.
val geocoder = Geocoder(this)
val address: Address? =
        try {
            geocoder.getFromLocation(location.latitude, location.longitude, 1)[0]
                    .apply {
                        Log.d(TAG, postalCode)
                    }
        } catch (e: IOException) {
            Log.e(TAG, "Geocoder error", e)
            null
        }

Java

// Request a static location from the location manager.
LocationManager locationManager = (LocationManager) this.getSystemService(
        Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation("static");

// Attempt to get postal code from the static location object.
Geocoder geocoder = new Geocoder(this);
Address address = null;
try {
  address = geocoder.getFromLocation(location.getLatitude(),
          location.getLongitude(), 1).get(0);
  Log.d("Postal code", address.getPostalCode());

} catch (IOException e) {
  Log.e(TAG, "Geocoder error", e);
}

Düşük güç modunda oynatmayı duraklat

Bazı TV cihazları, kullanıcı cihazı kapattığında düşük güç modunu destekler. Cihaz, kapatmak yerine ekranı devre dışı bırakır ve Android TV'yi arka planda çalıştırmaya devam eder. Ses çıkışı bu modda da hâlâ etkindir. Yani cihaz düşük güç modundayken o anda oynatılan içeriği durdurun.

Düşük güç modunda oynatmadan kaçınmak için şu anda oynatılan tüm içerikleri onStop() geçersiz kılın ve durdurun:

Kotlin

override fun onStop() {
    // App-specific method to stop playback.
    stopPlayback()
    super.onStop()
}

Java

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

Kullanıcı gücü tekrar açtığında, uygulamanız etkin ön plan uygulamasıysa onStart() çağrılır. Bir etkinliği başlatma ve durdurma hakkında daha fazla bilgi için Etkinlik yaşam döngüsü bölümüne bakın.