TV donanımını işleme

TV donanımı diğer Android cihazlardan önemli ölçüde farklıdır. TV'ler; dokunmatik ekran, kamera ve GPS alıcıları gibi diğer Android cihazlarda bulunan donanım özelliklerinden bazılarına sahip değildir. TV'ler de tamamen ikincil donanım cihazlarına bağımlıdır: Kullanıcıların TV uygulamalarıyla etkileşimde bulunabilmesi için uzaktan kumanda veya oyun kumandası kullanması gerekir. TV için bir uygulama geliştirirken donanım sınırlamalarını ve TV donanımı üzerinde çalışmanın gereksinimlerini dikkatlice göz önünde bulundurmanız gerekir.

Bu kılavuzda, uygulamanızın TV'de çalışıp çalışmadığını nasıl kontrol edeceğiniz ve desteklenmeyen donanım özelliklerinin nasıl ele alınacağı gösterilmektedir. Çeşitli giriş yöntemleri hakkında bilgi edinmek için TV kumandalarını yönetme başlıklı makaleye bakın.

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 aracılığıyla başlatılabilen 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 kod, uygulamanızın bir TV cihazında çalışıp çalışmadığını nasıl kontrol edeceğinizi gösterir:

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 işleme

Uygulamanızın tasarımına ve işlevine bağlı olarak, kullanılamayan belirli donanım özelliklerini düzeltebilirsiniz. Bu bölümde TV'de genellikle hangi donanım özelliklerinin kullanılamadığı, eksik donanım özelliklerinin nasıl algılanacağı ve bu özellikler için hangi alternatiflerin önerildiği açıklanmaktadır.

Desteklenmeyen TV donanımı özellikleri

TV'ler diğer cihazlardan farklı bir amaca sahiptir ve bu nedenle diğer Android destekli cihazların genellikle sahip olduğu donanım özelliklerine sahip değildir. Bu nedenle, Android sistemi TV cihazlarında aşağıdaki özellikleri desteklemez:

Donanım Android özellik açıklayıcı
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 mikrofon, 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ı bölümüne bakın.

TV için donanım gereksinimlerini tanımlama

Android uygulamaları, bu özelliklerin sağlanmadığı cihazlarda yüklenmediğinden emin olmak için uygulama manifest dosyalarında donanım özelliği gereksinimlerini beyan edebilir. Mevcut bir uygulamanın TV'de kullanımını genişletiyorsanız uygulamanızın TV cihazına yüklenmesini engelleyebilecek donanım şartı beyanları için uygulamanızın manifest dosyasını dikkatlice inceleyin.

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

<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ında açıklandığı gibi bazı özelliklerin android.hardware.camera.front gibi alt özellikleri vardır. Uygulamanızda kullanılan diğer 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ğine gerek olmadığını beyan etmelidir. Uygulamanız normalde TV cihazları tarafından desteklenmeyen bir veya daha fazla özelliği 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 gerekli olduğunu belirtirseniz, uygulamanızın TV cihazlarına yüklenmesini veya Android TV ana ekran başlatıcıda görünmesini engellersiniz.

Donanım özelliklerini ima eden izinlere dikkat edin.

Bazı uses-permission manifest beyanları donanım özelliklerini belirtir. Bu davranış, uygulama manifestinizde bazı izinler istediğinizde uygulamanızın TV cihazlarında yüklenmesini ve kullanılmasını engelleyebileceği anlamına gelir. Aşağıdaki sıkça istenen izinler, dolaylı bir donanım özelliği gereksinimi oluşturur:

İzin Örtülü 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 hedef API düzeyi 20 veya önceki sürümler)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (yalnızca hedef API düzeyi 20 veya önceki sürümler)

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 gerektirdiğini belirten izin isteklerinin tam listesi için uses-feature rehberine bakın. Uygulamanız daha önce listelenen özelliklerden birini istiyorsa ima edilen donanım özelliği için manifest dosyanıza bunun gerekli olmadığını belirten bir uses-feature beyanı ekleyin. 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 TV cihazında ağ kartı veya GPS alıcısı olmasa bile kullanıcılar uygulamanızı bir TV cihazına yükleyebilirler.

Donanım özelliklerini uygulamanız için 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. Sonraki bölümde, donanım özelliklerinin nasıl kontrol edileceği açıklanmakta ve uygulamanızın davranışını değiştirmeyle ilgili bazı yaklaşımlar önerilmektedir.

Manifest'te filtreleme ve özellik bildirme hakkında daha fazla bilgi için uses-feature rehberine bakın.

Donanım özelliklerini kontrol edin

Android çerçevesi, uygulamanızın çalıştığı cihazda donanım özelliklerinin mevcut olup olmadığını size bildirebilir. Ç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şken alır.

Aşağıdaki kod örneği, çalışma zamanında donanım özelliklerinin kullanılabilirliğinin nasıl tespit edileceğini gösterir:

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

Android, çoğu TV'de dokunmatik ekran bulunmadığından TV cihazları için dokunmatik ekran etkileşimini desteklemez. Ayrıca dokunmatik ekran kullanımı, kullanıcının ekrandan 3 metre uzakta oturduğu bir izleme 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 ise uygulamanızı TV uzaktan kumandasındaki yön tuşları (D-pad) kullanarak navigasyonu destekleyecek şekilde tasarlayın. TV'ye uygun denetimler kullanarak gezinmeyi düzgün bir şekilde destekleme hakkında daha fazla bilgi için TV'de gezinme konusuna bakın.

Kamera

Televizyonlarda genellikle kamera olmasa da TV'de fotoğrafçılıkla ilgili bir uygulama sağlayabilirsiniz. Örneğin, fotoğraf çeken, görüntüleyen ve düzenleyen bir uygulamanız varsa TV'ler için fotoğraf alma işlevini devre dışı bırakabilir, kullanıcıların da fotoğrafları görüntülemesine ve hatta düzenlemesine izin verebilirsiniz. Kamerayla ilgili uygulamanızın TV'de çalışmasını etkinleştirirseniz uygulama manifestinize 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ılabilir olup olmadığını algılayan ve uygulamanızın işleyişinde ayarlamalar yapan bir kod ekleyin. Aşağıdaki kod örneğinde, kameranın olup olmadığı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ç mekanda kullanılan cihazlardır ve yerleşik küresel konumlandırma sistemi (GPS) alıcıları yoktur. Uygulamanız konum bilgilerini kullansa da kullanıcıların konum aramalarına izin verebilir veya TV cihazı kurulumu sırasında yapılandırılan posta kodu gibi statik bir konum sağlayıcı kullanabilirsiniz.

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ışır durumda tutar. Ses çıkışı bu modda hâlâ etkin olduğundan, cihaz düşük güç modundayken oynatılan tüm içerikleri durdurun.

Düşük güç modunda oynatmayı önlemek için onStop() değerini geçersiz kılın ve şu anda oynatılan içeriği 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();
}

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