TV donanımı, diğer Android cihazlardan önemli ölçüde farklıdır. TV'lerde, diğer Android cihazlarda bulunan dokunmatik ekran, kamera ve GPS alıcısı gibi bazı donanım özellikleri bulunmaz. TV'ler tamamen ikincil donanım cihazlarına da bağlıdır: Kullanıcıların TV uygulamalarıyla etkileşim kurması 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 başlıklı makaleyi inceleyin.)
TV için uygulama geliştirirken TV donanımında çalışmanın donanım sınırlamalarını ve gereksinimlerini dikkatlice değerlendirin. Uygulamanızın TV'de çalışıp çalışmadığını kontrol edin ve desteklenmeyen donanım özelliklerini yönetin.
TV cihazı olup olmadığını kontrol etme
Hem TV cihazlarında hem de diğer cihazlarda çalışan bir uygulama geliştiriyorsanız uygulamanızın hangi cihaz türünde çalıştığını kontrol etmeniz ve uygulamanızın çalışmasını buna göre 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şlatılacağını 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 işleme
Uygulamanızın tasarımına ve işlevine bağlı olarak, kullanılamayan belirli donanım özelliklerini geçici olarak devre dışı bırakabilirsiniz. Bu bölümde, genellikle TV'de bulunmayan donanım özellikleri, eksik donanım özelliklerinin nasıl tespit edileceği ve bu özellikler için önerilen alternatifler ele alınmaktadır.
Desteklenmeyen TV donanım özellikleri
TV'lerin diğer cihazlardan farklı bir amacı vardır. Bu nedenle, Android destekli diğer cihazlarda bulunan donanım özelliklerine sahip değillerdir. Bu nedenle, Android sistemi TV cihazları için aşağıdaki özellikleri desteklemez:
| Donanım | Android özellik tanımlayıcısı |
|---|---|
| Dokunmatik ekran | android.hardware.touchscreen |
| Dokunmatik ekran emülatörü | android.hardware.faketouch |
| Telefon | 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 |
| Dikey yönlü ekran | 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 desteklenir.
Özelliklerin, alt özelliklerin ve bunların 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ı, donanım özellikleriyle ilgili gereksinimleri uygulama manifestinde belirterek bu özellikleri sunmayan cihazlara yüklenmemelerini sağlayabilir. Mevcut bir uygulamayı TV'de kullanılacak şekilde genişletiyorsanız uygulamanızın manifest dosyasını, TV cihazına yüklenmesini engelleyebilecek donanım gereksinimi beyanları açısından dikkatlice inceleyin.
Uygulamanızda, TV'de bulunmayan dokunmatik ekran veya kamera gibi donanım özellikleri kullanılıyorsa ancak uygulamanız bu özellikler kullanılmadan çalışabiliyorsa uygulamanızın manifestini değiştirerek bu özelliklerin gerekli olmadığını belirtin. Aşağıdaki manifest kod snippet'i, uygulamanızın TV cihazlarında bulunmayan donanım özelliklerini gerektirmediğini ancak bu özellikleri TV dışı 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: Bazı özelliklerin android.hardware.camera.front gibi alt özellikleri vardır. Bunlar
Özellik referansı bölümünde açıklanmıştır. Uygulamanızda kullanılan tüm alt özellikleri required="false" olarak işaretlediğinizden emin olun.
TV cihazlarında kullanılmak üzere tasarlanan 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 bir veya daha fazla özellik kullanıyorsa manifest dosyanızda 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 beyan etmek, uygulamanızın TV cihazlarına yüklenmesini veya Android TV ana ekran başlatıcısında görünmesini engeller.
Donanım özelliklerini ima eden izinlere dikkat edin
Bazı uses-permission manifest beyanları donanım özelliklerini ima eder. Bu davranış, uygulama manifestinizde bazı izinleri istemenin, uygulamanızın TV cihazlarına yüklenmesini ve bu cihazlarda kullanılmasını engelleyebileceği anlamına gelir. Sık istenen aşağıdaki izinler, dolaylı bir donanım özelliği şartı 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 |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
Bazı TV cihazlarında yalnızca Ethernet bağlantısı vardır. |
Donanım özelliği şartı gerektiren izin isteklerinin tam listesi için uses-feature kılavuzuna bakın. Uygulamanız daha önce listelenen özelliklerden birini istiyorsa manifest dosyanıza, ima edilen donanım özelliğinin 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 kullanıcılar, ağ kartı veya GPS alıcısı olmasa bile uygulamanızı TV cihazına yükleyebilir.
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 ele alınmakta ve uygulamanızın davranışını değiştirmek için bazı yaklaşımlar önerilmektedir.
Manifest dosyasında özellikleri filtreleme ve bildirme hakkında daha fazla bilgi için uses-feature kılavuzuna bakın.
Donanım özelliklerini kontrol etme
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 bir dize 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 cihazında dokunmatik ekran veya işaretçi girişi özellikleri yoktur ve gezinme için tamamen yön tuş takımı (D-pad) uzaktan kumandaları kullanılır. TV uygulamaları her zaman d-pad uzaktan kumandayı desteklemelidir.
TV'ye uygun kontrolleri kullanarak gezinmeyi doğru şekilde destekleme hakkında daha fazla bilgi için TV'de gezinme bölümüne bakın.
Dokunma desteğini bildirme
Bazı TV cihazları, işaretçi uzaktan kumandaları ve dokunmatik ekranları destekler. Uygulamanız, destekleyen cihazlarda daha iyi bir deneyim sunmak için mobil cihazlarda olduğu gibi tıklama, fareyle üzerine gelme ve kaydırma etkileşimlerini destekleyebilir.
Uygulamanız dokunma moduna izin veriyorsa AndroidManifest.xml dosyanızdaki <application> veya <activity> öğesinin içine true olarak ayarlanmış android.software.leanback.supports_touch
<property> öğesini ekleyerek uygulamanın tamamı veya tek tek etkinlikler için dokunma desteğini bildirebilirsiniz:
<application ...> <property android:name="android.software.leanback.supports_touch" android:value="true|false" /> ... </application>
Not: İşaretçi kumandayı (ör. hava faresi veya dokunmatik yüzey) destekleyen cihazlarda bu ayarın etkinleştirilmesi, platform uyumluluğu emülasyonuna güvenmek yerine imleç ve dokunma modunu etkinleştirir. Etkinlik düzeyindeki bir beyan, söz konusu etkinlik için uygulama düzeyindeki beyanı geçersiz kılar. Bu özellik
atlanırsa varsayılan olarak false değeri kullanılır.
Kamera
TV'lerde genellikle kamera olmasa da TV'de fotoğrafla ilgili bir uygulama sunabilirsiniz. Örneğin, fotoğraf çeken, görüntüleyen ve düzenleyen bir uygulamanız varsa TV'ler için fotoğraf çekme işlevini devre dışı bırakabilir ve kullanıcıların fotoğrafları görüntülemesine, hatta düzenlemesine izin verebilirsiniz. Kamerayla ilgili uygulamanızı TV'de çalışacak şekilde etkinleştirmeye 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ın kamera olmadan çalışmasını etkinleştirirseniz uygulamanıza kamera özelliğinin kullanılabilir olup olmadığını algılayan ve uygulamanızın çalışmasında ayarlamalar yapan bir kod ekleyin. Aşağıdaki kod örneğinde, kameranın 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 konum belirleme sistemi (GPS) alıcıları yoktur. 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ı kullanmasına izin verebilirsiniz.
Kotlin
// Request a static location from the location manager. val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val location = locationManager.getLastKnownLocation("static") if (location == null) { Log.e(TAG, "Location is null") return } // 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)?.firstOrNull() ?.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ı duraklatma
Bazı TV cihazları, kullanıcı cihazı kapattığında düşük güç modunu destekler. Cihaz kapanmak yerine ekranı devre dışı bırakır ve Android TV'yi arka planda çalışır durumda tutar. Bu modda ses çıkışı hâlâ etkindir. Bu nedenle, cihaz düşük güç modundayken oynatılan tüm içerikleri durdurun.
Düşük güç modunda oynatmayı önlemek için onStop yöntemini geçersiz kılın ve oynatılan tüm içerikleri 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ı cihazı tekrar açtığında, uygulamanız etkin ön planda çalışan uygulama ise 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ü başlıklı makaleyi inceleyin.