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 bazı donanım özellikleri (ör. dokunmatik ekran, kamera ve GPS alıcısı) yer almaz. 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 başlıklı makaleyi inceleyin.)

TV için uygulama geliştirirken TV donanımında çalışmayla ilgili donanım sınırlamalarını ve gereksinimlerini dikkatlice göz önünde bulundurun. 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 cihazda ç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'ye yönelik bir etkinlik mi yoksa telefon etkinliği mi başlatılacağını belirlemek için cihaz özelliklerini kontrol edin.

Uygulamanızın 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 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, belirli donanım özelliklerinin kullanılamaması sorununu çözebilirsiniz. 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 açıklanmaktadır.

Desteklenmeyen TV donanım özellikleri

TV'ler diğer cihazlardan farklı bir amaca hizmet ettiğinden diğer Android destekli cihazlarda bulunan donanım özelliklerine sahip değildir. Bu nedenle, Android sistemi TV cihazlarında 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
Ekran dikey yöndeyken 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ı, bu özellikleri sağlamayan cihazlara yüklenmemelerini sağlamak için uygulama manifestinde donanım özelliği gereksinimlerini belirtebilir. 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 bildirimleri açısından dikkatlice inceleyin.

Uygulamanızda TV'de bulunmayan dokunmatik ekran veya kamera gibi donanım özellikleri kullanılıyorsa ancak bu özellikler kullanılmadan da çalışabiliyorsa uygulamanızın manifestini değiştirerek bu özelliklerin gerekli olmadığını belirtin. Aşağıdaki manifest kodu snippet'i, uygulamanızın TV cihazlarda kullanılamayan donanım özelliklerini gerektirmediğini ancak TV dışı cihazlarda bu özellikleri 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, Özellik referansı bölümünde açıklandığı gibi android.hardware.camera.front gibi alt özellikleri vardı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ıyla 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 manifestinizde 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 zorunlu olduğunu belirtmek, 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 içeren izinler hakkında bilgi

Bazı uses-permission manifest bildirimleri donanım özelliklerini ifade eder. Bu davranış, uygulama manifestinizde bazı izinler istemenin uygulamanızın TV cihazlarına yüklenmesini ve bu cihazlarda kullanılmasını engelleyebileceği anlamına gelir. Aşağıdaki sık istenen izinler, donanım özelliğiyle ilgili örtülü bir koşul oluşturur:

İzin 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ı bulunur.

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

Not: Uygulamanız Android 5.0'ı (API düzeyi 21) veya sonraki bir sürümü 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ı TV cihazına yükleyebilir.

Uygulamanızda donanım özelliklerini isteğe bağlı hale getirdikten sonra, bu özelliklerin çalışma zamanında 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 ve uygulamanızın davranışını değiştirmek için bazı yaklaşımlar önerilmektedir.

Manifest'teki ö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 kullanılamadığı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, donanım özelliklerinin çalışma zamanında kullanılabilirliğinin nasıl tespit edileceği 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 özelliği yoktur ve gezinme için tamamen d-pad uzaktan kumandalara ihtiyaç duyulur. TV uygulamaları her zaman D-pad uzaktan kumandasını desteklemelidir.

TV'ye uygun kontrollerle gezinmeyi düzgün şekilde destekleme hakkında daha fazla bilgi için TV'de gezinme başlıklı makaleyi inceleyin.

Dokunma desteğini tanımlama

Bazı TV cihazları, işaretçi uzaktan kumandaları ve dokunmatik ekranları destekler. Uygulamanız, destekleyen cihazlarda daha iyi bir deneyim sunmak için mobil cihazlardaki gibi tıklama, fareyle üzerine gelme ve kaydırma etkileşimlerini destekleyebilir.

Uygulamanız dokunma moduna izin veriyorsa android.software.leanback.supports_touch öğesini AndroidManifest.xml içinde true olarak ayarlayarak dokunma desteğini bildirebilirsiniz:

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

Not: İşaretleme uzaktan kumandasını (ör. hava faresini veya dokunmatik yüzeyi) destekleyen cihazlarda bu ayarın etkinleştirilmesi, platform uyumluluğu emülasyonuna güvenmek yerine imleç ve dokunma modunu etkinleştirir. Bu meta verinin atlanması durumunda varsayılan olarak false değeri kullanılır.

Kamera

TV'lerde genellikle kamera bulunmasa da fotoğrafçılıkla ilgili bir uygulamayı TV'de sunabilirsiniz. Örneğin, fotoğraf çeken, görüntüleyen ve düzenleyen bir uygulamanız varsa TV'lerde fotoğraf çekme 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ını sağlamaya karar verirseniz uygulama manifestinize aşağıdaki özellik bildirimini 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, kapalı alan cihazlarıdır ve yerleşik küresel konumlandırma sistemi (GPS) alıcıları yoktur. Uygulamanız konum bilgisini 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 vermeye devam edebilirsiniz.

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ı 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ıştırmaya devam eder. Bu modda ses çıkışı etkin kalır. Bu nedenle, cihaz düşük güç modundayken şu anda oynatılan içerikleri durdurun.

Düşük güç modunda oynatmayı önlemek için onStop() öğesini geçersiz kılın ve şu anda 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ı gücü 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.