Ana ekranda kanallar

Android TV ana ekranı veya kısaca ana ekran, Önerilen içeriği kanallar ve programlar tablosu olarak gösterir. Her satır bir kanaldır. Bir kanalda, o kanalda bulunan tüm programlara ait kartlar bulunur:

TV ana ekranı

Bu dokümanda, ana ekrana kanal ve programların nasıl ekleneceği, içeriğin nasıl güncelleneceği, kullanıcı işlemlerinin nasıl işleneceği ve kullanıcılarınıza en iyi deneyimin nasıl sağlanacağı gösterilmektedir. (API hakkında daha ayrıntılı bilgi edinmek isterseniz ana ekran codelab'i ve I/O 2017 Android TV oturumunu izleyin.)

Not: Öneri kanalları yalnızca Android 8.0 (API düzeyi 26) ve sonraki sürümler. Projeye katılanların sayısı Android 8.0 (API düzeyi 26) ve sonraki sürümlerde çalışan uygulamalar için öneriler. Alıcı: Android'in önceki sürümlerinde çalışan uygulamalar için öneriler, şunu kullanmalıdır: öneriler satırı .

Ana ekran kullanıcı arayüzü

Uygulamalar yeni kanallar oluşturabilir, bir kanaldaki programları ekleyebilir, kaldırabilir, güncelleyebilir ve bir kanaldaki programların sırasını kontrol edebilir. Örneğin, bir uygulama "Yenilikler" adlı bir kanal oluşturabilir ve yeni kullanıma sunulan programlara ait kartları gösterebilirsiniz.

Uygulamalar, kanalların ana ekranda görünme sırasını kontrol edemez. Uygulamanız yeni bir kanal oluşturduğunda bu kanal, ana ekranda kanal listesinin en altına eklenir. Kullanıcı kanalları yeniden sıralayabilir, gizleyebilir ve gösterebilir.

"Sıradakine Geç" kanalı

Sonra İzle kanalı, ana ekranda görünen ikinci satırdır. girin. Bu kanalı sistem oluşturur ve sürdürür. Uygulamanız şunları ekleyebilir: aktarmasına yardımcı olur. Daha fazla bilgi için bkz. Program ekleme "Sıradaki Video" kanalına göz atın.

Uygulama kanalları

Uygulamanızın oluşturduğu kanalların tümü şu yaşam döngüsünü izler:

  1. Kullanıcı, uygulamanızda bir kanal keşfeder ve bu kanalı ana ekrana eklemek ister.
  2. Uygulama, kanalı oluşturur ve TvProvider bölümüne ekler (bu noktada kanal görünür değildir).
  3. Uygulama, sistemden kanalı göstermesini istiyor.
  4. Sistem, kullanıcıdan yeni kanalı onaylamasını ister.
  5. Yeni kanal, ana ekranın son satırında görünür.

Varsayılan kanal

Uygulamanız, kullanıcının ana ekrana ekleyebilmesi için istediği sayıda kanal sunabilir. Kullanıcı genellikle her bir kanalı ana ekranda görünmeden önce seçip onaylayın. Her uygulamanın bir varsayılan kanal oluşturma seçeneği vardır. Varsayılan kanal, otomatik olarak ana ekranda göründüğünden özeldir. kullanıcı bir web sitesine açıkça talep etmesi gerekir.

Ön koşullar

Android TV ana ekranı, uygulamanızın oluşturduğu kanalları ve programları yönetmek için Android'in TvProvider API'lerini kullanır. Sağlayıcının verilerine erişmek için uygulamanızın manifest dosyasına aşağıdaki izni ekleyin:

<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />

TvProvider destek kitaplığı, sağlayıcının kullanımını kolaylaştırır. build.gradle dosyanızdaki bağımlılıklara ekleyin:

Eski

implementation 'androidx.tvprovider:tvprovider:1.0.0'

Kotlin

implementation("androidx.tvprovider:tvprovider:1.0.0")

Kanallarla ve programlarla çalışmak için programınıza şu destek kitaplığı içe aktarmalarını eklediğinizden emin olun:

Kotlin

import android.support.media.tv.Channel
import android.support.media.tv.TvContractCompat
import android.support.media.tv.ChannelLogoUtils
import android.support.media.tv.PreviewProgram
import android.support.media.tv.WatchNextProgram

Java

import android.support.media.tv.Channel;
import android.support.media.tv.TvContractCompat;
import android.support.media.tv.ChannelLogoUtils;
import android.support.media.tv.PreviewProgram;
import android.support.media.tv.WatchNextProgram;

Kanallar

Uygulamanızın oluşturduğu ilk kanal, onun varsayılan kanalı olur. Varsayılan kanal otomatik olarak ana ekranda görünür. Oluşturduğunuz diğer tüm kanalların ana ekranda görünebilmesi için kullanıcı tarafından seçilmesi ve kabul edilmesi gerekir.

Kanal oluşturma

Uygulamanız, yalnızca ön planda çalışırken sistemden yeni eklenen kanalları göstermesini istemelidir. Bu, kullanıcı farklı bir uygulama çalıştırırken uygulamanızın, kanalınızı eklemek için onay isteyen bir iletişim kutusu görüntülemesini önler. Arka planda çalışırken bir kanal eklemeye çalışırsanız etkinliğin onActivityResult() yöntemi RESULT_CANCELED durum kodunu döndürür.

Kanal oluşturmak için şu adımları izleyin:

  1. Kanal oluşturucu oluşturup özelliklerini belirleyin. Lütfen kanal türü TYPE_PREVIEW olmalıdır. Daha fazla ekle özelliklerini gerektiği şekilde ayarlayın.

    Kotlin

    val builder = Channel.Builder()
    // Every channel you create must have the type TYPE_PREVIEW
    builder.setType(TvContractCompat.Channels.TYPE_PREVIEW)
            .setDisplayName("Channel Name")
            .setAppLinkIntentUri(uri)
    

    Java

    Channel.Builder builder = new Channel.Builder();
    // Every channel you create must have the type TYPE_PREVIEW
    builder.setType(TvContractCompat.Channels.TYPE_PREVIEW)
            .setDisplayName("Channel Name")
            .setAppLinkIntentUri(uri);
    
  2. Kanalı sağlayıcıya ekleyin:

    Kotlin

    var channelUri = context.contentResolver.insert(
            TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues())
    

    Java

    Uri channelUri = context.getContentResolver().insert(
            TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues());
    
  3. Kanala program eklemek için kanal kimliğini kaydetmeniz gerekir daha sonra. Döndürülen URI'den kanal kimliğini çıkarın:

    Kotlin

    var channelId = ContentUris.parseId(channelUri)
    

    Java

    long channelId = ContentUris.parseId(channelUri);
    
  4. Kanalınıza bir logo eklemeniz gerekir. Uri veya Bitmap kullanın. Logo simge 80 dp x 80 dp olmalı ve opak olmalıdır. Gösterilen dairesel maske:

    TV ana ekranı simge maskesi

    Kotlin

    // Choose one or the other
    storeChannelLogo(context: Context, channelId: Long, logoUri: Uri) // also works if logoUri is a URL
    storeChannelLogo(context: Context, channelId: Long, logo: Bitmap)
    

    Java

    // Choose one or the other
    storeChannelLogo(Context context, long channelId, Uri logoUri); // also works if logoUri is a URL
    storeChannelLogo(Context context, long channelId, Bitmap logo);
    
  5. Varsayılan kanalı oluşturma (isteğe bağlı): Uygulamanız ilk kanalı oluşturduğunuzda Bu sayede, onu en iyi varsayılan kanal ile ana sayfada görünmesini sağlar ve ekrana sığmaz. Oluşturduğunuz diğer tüm kanallar kullanıcılar açıkça görünene kadar seçer.

    Kotlin

    TvContractCompat.requestChannelBrowsable(context, channelId)
    

    Java

    TvContractCompat.requestChannelBrowsable(context, channelId);
    

  6. Varsayılan kanalınızın, uygulamanız açılmadan önce görünmesini sağlayın. Şunları yapabilirsiniz: şunu dinleyen bir BroadcastReceiver ekleyerek bu davranışı gerçekleştirebilirsiniz: Ana ekranda, android.media.tv.action.INITIALIZE_PROGRAMS işlemi uygulama yüklendikten sonra gönderir:
    <receiver
      android:name=".RunOnInstallReceiver"
      android:exported="true">
        <intent-filter>
          <action android:name="android.media.tv.action.INITIALIZE_PROGRAMS" />
          <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    
    Geliştirme sırasında uygulamanızı başka cihazdan yüklerken bu adımı Adb aracılığıyla niyeti tetiklemek your.package.name/.YourReceiverName, uygulamanızın BroadcastReceiver:

    adb shell am broadcast -a android.media.tv.action.INITIALIZE_PROGRAMS -n \
        your.package.name/.YourReceiverName
    

    Nadiren de olsa uygulamanız, yayını kullanıcının bulunduğu saatte alabilir. uygulamanızı başlatır. Kodunuzun varsayılan kanalı eklemeye çalışmadığından emin olun birçok kez yer alıyor.

Bir kanalı güncelleme

Kanalları güncellemek, kanalları oluşturmaya çok benzer.

Değiştirilmesi gereken özellikleri ayarlamak için başka bir Channel.Builder kullanın.

Kanalı güncellemek için ContentResolver simgesini kullanın. Kanal ilk olarak eklendiğinde kaydettiğiniz kanal kimliğini kullanın:

Kotlin

context.contentResolver.update(
        TvContractCompat.buildChannelUri(channelId),
        builder.build().toContentValues(),
        null,
        null
)

Java

context.getContentResolver().update(TvContractCompat.buildChannelUri(channelId),
    builder.build().toContentValues(), null, null);

Bir kanalın logosunu güncellemek için storeChannelLogo() kullanın.

Kanal silme

Kotlin

context.contentResolver.delete(TvContractCompat.buildChannelUri(channelId), null, null)

Java

context.getContentResolver().delete(TvContractCompat.buildChannelUri(channelId), null, null);

Programlar

Uygulama kanalına program ekleme

Bir PreviewProgram.Builder oluşturun ve özelliklerini ayarlayın:

Kotlin

val builder = PreviewProgram.Builder()
builder.setChannelId(channelId)
        .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP)
        .setTitle("Title")
        .setDescription("Program description")
        .setPosterArtUri(uri)
        .setIntentUri(uri)
        .setInternalProviderId(appProgramId)

Java

PreviewProgram.Builder builder = new PreviewProgram.Builder();
builder.setChannelId(channelId)
        .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP)
        .setTitle("Title")
        .setDescription("Program description")
        .setPosterArtUri(uri)
        .setIntentUri(uri)
        .setInternalProviderId(appProgramId);

Programın türüne bağlı olarak daha fazla özellik ekleyin. (Özellikleri görmek için bilgi için aşağıdaki tablolara bakın.)

Programı sağlayıcıya ekleyin:

Kotlin

var programUri = context.contentResolver.insert(TvContractCompat.PreviewPrograms.CONTENT_URI,
        builder.build().toContentValues())

Java

Uri programUri = context.getContentResolver().insert(TvContractCompat.PreviewPrograms.CONTENT_URI,
      builder.build().toContentValues());

Daha sonra başvurmak üzere program kimliğini alın:

Kotlin

val programId = ContentUris.parseId(programUri)

Java

long programId = ContentUris.parseId(programUri);

Sonrakini İzle kanalına program ekleme

Sonra İzle kanalına program eklemek için bkz. İzle'ye program ekleme Sonraki kanal.

Programı güncelleme

Programların bilgilerini değiştirebilirsiniz. Örneğin, bir filmin kiralama fiyatını veya kullanıcının bir programın ne kadarını izlediğini gösteren ilerleme çubuğunu güncellemek isteyebilirsiniz.

Değiştirmeniz gereken özellikleri ayarlamak için bir PreviewProgram.Builder kullanın. ve ardından programı güncellemek için getContentResolver().update numaralı telefonu arayın. Program ilk eklendiğinde kaydettiğiniz program kimliğini belirtin:

Kotlin

context.contentResolver.update(
        TvContractCompat.buildPreviewProgramUri(programId),
                builder.build().toContentValues(), null, null
)

Java

context.getContentResolver().update(TvContractCompat.buildPreviewProgramUri(programId),
    builder.build().toContentValues(), null, null);

Program silme

Kotlin

context.contentResolver
        .delete(TvContractCompat.buildPreviewProgramUri(programId), null, null)

Java

context.getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(programId), null, null);

Kullanıcı işlemlerini işleme

Uygulamanız, kanalları görüntülemek ve eklemek için kullanıcı arayüzü sağlayarak kullanıcıların içerikleri keşfetmelerine yardımcı olabilir. Uygulamanız, ana ekranda görünen kanallarınızla etkileşimleri de işlemelidir.

Kanalları keşfetme ve ekleme

Uygulamanız, kullanıcının kanallarını seçmesine ve eklemesine olanak tanıyan bir kullanıcı arayüzü öğesi (örneğin, kanalı eklemenizi isteyen bir düğme) sağlayabilir.

Kullanıcı belirli bir kanal için istekte bulunduktan sonra, kullanıcının kanalı ana ekranın kullanıcı arayüzüne ekleme iznini almak için şu kodu yürütün:

Kotlin

val intent = Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE)
intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId)
try {
  activity.startActivityForResult(intent, 0)
} catch (e: ActivityNotFoundException) {
  // handle error
}

Java

Intent intent = new Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE);
intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId);
try {
   activity.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException e) {
  // handle error
}

Sistemde, kullanıcıdan kanalı onaylamasının istendiği bir iletişim kutusu görüntülenir. İsteğin sonucunu etkinliğinizin onActivityResult yönteminde (Activity.RESULT_CANCELED veya Activity.RESULT_OK) işleyin.

Android TV ana ekran etkinlikleri

Kullanıcı, uygulama tarafından yayınlanan programlarla/kanallarla etkileşimde bulunduğunda ana ekran, amaçları uygulamaya gönderir:

  • Kullanıcı kanalın logosunu seçtiğinde, ana ekran, kanalın APP_LINK_INTENT_URI özelliğinde depolanan Uri değerini uygulamaya gönderir. Uygulamanın ana kullanıcı arayüzünü veya seçili kanalla ilgili bir görünümü başlatması yeterlidir.
  • Kullanıcı bir program seçtiğinde ana ekran, bir programın INTENT_URI özelliğinde depolanan Uri bilgisini uygulamaya gönderir. Uygulama, seçili içeriği oynatmalıdır.
  • Kullanıcı, artık bir programla ilgilenmediğini belirtebilir ve programın ana ekranın kullanıcı arayüzünden kaldırılmasını isteyebilir. Sistem, programı kullanıcı arayüzünden kaldırır ve programın sahibi olan uygulamaya program kimliğini içeren bir niyet (android.media.tv.ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED veya android.media.tv.ACTION_Watch_NEXT_PROGRAM_BROWSABLE_DISABLED) gönderir. Uygulama, programı sağlayıcıdan kaldırmalı ve yeniden EKLEMEMELİDİR.

Ana ekranın kullanıcı etkileşimleri için gönderdiği tüm Uris için intent filtreleri oluşturduğunuzdan emin olun; örneğin:

<receiver
   android:name=".WatchNextProgramRemoved"
   android:enabled="true"
   android:exported="true">
   <intent-filter>
       <action android:name="android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
   </intent-filter>
</receiver>

En iyi uygulamalar

  • Birçok TV uygulaması, kullanıcıların giriş yapmasını gerektirir. Bu durumda BroadcastReceiver android.media.tv.action.INITIALIZE_PROGRAMS için dinleyen önerileri kimliği doğrulanmamış kullanıcılar için kanal içeriği.Örneğin, uygulamanız başlangıçta en iyi içeriği veya o anda popüler olan içeriği gösterir. Kullanıcı giriş yaptıktan sonra kişiselleştirilmiş içerikler gösterebilir. Bu, uygulamaların satışa daha fazla satış yapması için kullanıcıları kontrol eder.
  • Uygulamanız ön planda değilken bir kanalı veya bir çalışmayı planlamak için JobScheduler uygulamasını kullanın (bkz: İş Planlayıcı ve BusinessService).
  • Uygulamanızın işleyişinde sorun olursa sistem, sağlayıcı izinlerini iptal edebilir (örneğin: sağlayıcıya sürekli olarak veri spam'i göndermek). Şunları yaptığınızdan emin olun: sağlayıcıya erişen kodu, kullanımı için "dene yakalama" ifadeleriyle sarmalama güvenlik istisnaları.
  • Programları ve kanalları güncellemeden önce, daha önce öğrendiğiniz verileri ve mutabakat sağlamanız gerekiyor. Örneğin, dönüşüm izleme aracını kaldırılmasını istediğiniz bir program seçin. Şu özelliklere sahip bir arka plan işi kullanın: Mevcut sunucu için sorgu yaptıktan sonra verilerinizi sağlayıcıya ekler/günceller. ve kanallarınız için onay isteme seçeneğine sahip olursunuz. Bu işi şu durumlarda çalıştırabilirsiniz: Uygulama başlatılır ve uygulamanın verilerini güncellemesi gerektiğinde.

    Kotlin

    context.contentResolver
      .query(
          TvContractCompat.buildChannelUri(channelId),
              null, null, null, null).use({
                  cursor-> if (cursor != null and cursor.moveToNext()) {
                               val channel = Channel.fromCursor(cursor)
                               if (channel.isBrowsable()) {
                                   //update channel's programs
                               }
                           }
              })
    

    Java

    try (Cursor cursor = context.getContentResolver()
          .query(
              TvContractCompat.buildChannelUri(channelId),
              null,
              null,
              null,
              null)) {
                  if (cursor != null && cursor.moveToNext()) {
                      Channel channel = Channel.fromCursor(cursor);
                      if (channel.isBrowsable()) {
                          //update channel's programs
                      }
                  }
              }
    
  • Tüm resimlerde (logolar, simgeler, içerik resimleri) benzersiz Uris kullanın. Bir resmi güncellerken farklı bir Uri kullandığınızdan emin olun. Tüm görseller önbelleğe alınır. Resmi değiştirirken URI'yı değiştirmezseniz, eski resim görünmeye devam eder.

  • WHERE yan tümcelerine izin verilmediğini ve WHERE yan tümceleriyle sağlayıcılara yapılan çağrıların bir güvenlik istisnası oluşturacağını unutmayın.

Özellikler

Bu bölümde, kanal ve program özellikleri ayrı ayrı açıklanmaktadır.

Kanal özellikleri

Her kanal için şu özellikleri belirtmeniz gerekir:

Özellik Notlar
TÜR TYPE_PREVIEW olarak ayarlandı.
DISPLAY_NAME kanalın adına ayarlanır.
UYGULAMA_LINK_INTENT_URI Kullanıcı kanalın logosunu seçtiğinde, sistem kanalla alakalı içerik sunan bir etkinlik başlatma niyeti gönderir. Bu özelliği, söz konusu etkinliğin intent filtresinde kullanılan URI olarak ayarlayın.

Ayrıca, bir kanalın dahili uygulama kullanımı için ayrılmış altı alanı da vardır. Bu alanlar, uygulamanın kanalı dahili veri yapısıyla eşleştirmesine yardımcı olabilecek anahtarları veya diğer değerleri depolamak için kullanılabilir:

  • DAHİLİ_SAĞLAYICI_KİMLİĞİ
  • DAHİLİ_SAĞLAYICI_VERİLERİ
  • DAHİLİ_SAĞLAYICI_FLAG1
  • DAHİLİ_SAĞLAYICI_FLAG2
  • DAHİLİ_SAĞLAYICI_FLAG3
  • DAHİLİ_SAĞLAYICI_FLAG4

Program özellikleri

Her program türünün özellikleri için tek tek sayfalara bakın:

Örnek Kod

Ana ekranla etkileşim kuran uygulamalar oluşturma ve Android TV ana ekranına kanal ve program ekleme hakkında daha fazla bilgi edinmek için ana ekran codelab sayfamıza bakın.