TV donanımını işleme

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

android.hardware.location

android.hardware.location.network (yalnızca hedef API düzeyi 20 veya daha düşük olanlar)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (yalnızca hedef API düzeyi 20 veya daha düşük olanlar)

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 ş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.