Kullanıcılar TV'lerle etkileşimde bulunurken genellikle izlemeden önce minimum düzeyde giriş yapmayı tercih ederler içerik. Birçok TV kullanıcısı için ideal senaryo şudur: Oturun, açın ve izleyin. En az adımda bulabilmeleri için kullanıcıları beğendikleri içeriğe getirmek genellikle tercih ettikleri yoldur.
Not: Öneride bulunmak için burada açıklanan API'leri kullanın. Yalnızca Android 7.1'e (API düzeyi 25) kadarki Android sürümlerinde çalışan uygulamalarda. Tedarik edilecek 8.0 (API düzeyi 26) ve sonraki sürümlerde çalışan uygulamalar için öneriler görüyorsanız, uygulamanız öneri kanallarına göz atın.
Android çerçevesi, bir öneri satırı sunarak minimum giriş etkileşimine yardımcı olur. ana ekranda. İçerik önerileri, TV ana ekranının ilk satırı olarak ilk kez kullanılmasını gerektirir. Uygulamanızın içerik kataloğundan önerilerle katkıda bulunmak faydalı olabilir veya uygulamanıza geri gelmelerini sağlar.
![](https://developer.android.google.cn/static/images/tv/home-recommendations.png?authuser=0000&hl=tr)
Şekil 1. Öneriler satırı örneği.
Bu rehberde, nasıl öneri oluşturacağınızı ve önerileri Android çerçevesine nasıl sağlayacağınızı öğrenebilirsiniz Böylece, kullanıcılar uygulamanızın içeriğini kolayca keşfedip keyifle kullanabilirler. Ayrıca bkz. "the" Leanback örnek uygulaması ,
Öneriler için en iyi uygulamalar
Öneriler, kullanıcıların beğendikleri içerikleri ve uygulamaları hızlı bir şekilde bulmalarına yardımcı olur. Oluşturuluyor alakalı öneriler sunulması, doğru kullanıcı kitlesi oluşturmada önemli bir faktördür, TV uygulamanızla mükemmel bir kullanıcı deneyimi sağlayabilirsiniz. Bu nedenle, kullanacağınız pazarlama aracının ne olduğunu ilgili önerilere göz atmanızı öneririm.
Öneri türleri
Öneri oluşturduğunuzda, kullanıcıları eksik görüntüleme etkinliklerine veya alakalı içeriğe ulaşmanızı sağlayacak etkinlikler önerebilir. Çevik yaklaşımın dikkate almanız gereken öneriler:
- Kullanıcıların devam ettirebilmesi için bir sonraki bölümle ilgili devam eden içerik önerileri dizi izliyorum. Dilerseniz duraklatılan filmler, TV programları veya podcast'ler için devam önerilerinden de yararlanabilirsiniz Böylece kullanıcılar duraklatılmış içeriği sadece birkaç tıklamayla izlemeye devam edebilir.
- Kullanıcı ilk kez çalıştırılan yeni bir bölüm gibi yeni içerik önerileri başka bir seriyi izlemeyi bitirdi. Ayrıca, uygulamanız kullanıcıların abone olmasına, takip etmesine veya takip etmesine olanak tanıyorsa içerik izlemek istediklerinde, izlenen içerik listesindeki izlenmemiş öğeler için yeni içerik önerilerini kullanmalıdır.
- Kullanıcıların özelliklerine göre ilgili içerik önerileri geçmiş izleme davranışı.
Öneri kartlarını en iyi kullanıcı deneyimini sağlayacak şekilde tasarlama hakkında daha fazla bilgi edinmek için Android TV Tasarım Spesifikasyonu'ndaki Öneri Satırı.
Önerileri yenile
Önerileri yenilerken yalnızca bunları kaldırıp yeniden yayınlamayın çünkü bunu yapmak görünür. Örneğin, bir içerik öğesinden sonra film, oynatıldı, bu videoyu önerilerden kaldırmanız gerekir.
Önerileri özelleştir
Kullanıcı arayüzünü ayarlayarak öneri kartlarını markalama bilgilerini aktarmak için özelleştirebilirsiniz. karttaki ön ve arka plan resmi, rengi, uygulama simgesi, başlığı ve alt başlığı gibi öğeler için Daha fazla bilgi edinmek için bkz. Android TV Tasarım Spesifikasyonu'ndaki Öneri Satırı.
Grup önerileri
Dilerseniz önerileri, öneri kaynağına göre gruplandırabilirsiniz. Örneğin, uygulamanız iki grup öneri sunabilir: Kullanıcının abone olduğu içerikle ilgili öneriler, ve kullanıcının farkında olmayabileceği trend yeni içeriklerle ilgili öneriler sunar.
Sistem, oluşturma veya güncelleme yaparken her grup için önerileri ayrı ayrı sıralar ve sıralar. girin. Önerileriniz için grup bilgileri sağlayarak sıralanmaz.
Tekliflerinizi otomatikleştirmek ve optimize etmek için
NotificationCompat.Builder.setGroup()
değerini girin. Örneğin,
Örneğin, bir öneriyi yeni trend içerik barındıran bir gruba ait olarak işaretlemek için
setGroup("trending")
adlı iş ortağını arayabilirsiniz.
Öneri hizmeti oluşturma
İçerik önerileri, arka planda işlenerek oluşturulur. Başvurunuzu önerilerinize katkıda bulunuyorsa, Google Play Store'dan düzenli olarak giriş ekleyen bir hizmet uygulamanın kataloğunu sistemin öneri listesine ekler.
Aşağıdaki kod örneğinde, IntentService
yönergesinin
Uygulamanız için bir öneri hizmeti oluşturun:
Kotlin
class UpdateRecommendationsService : IntentService("RecommendationService") { override protected fun onHandleIntent(intent: Intent) { Log.d(TAG, "Updating recommendation cards") val recommendations = VideoProvider.getMovieList() if (recommendations == null) return var count = 0 try { val builder = RecommendationBuilder() .setContext(applicationContext) .setSmallIcon(R.drawable.videos_by_google_icon) for (entry in recommendations.entrySet()) { for (movie in entry.getValue()) { Log.d(TAG, "Recommendation - " + movie.getTitle()) builder.setBackground(movie.getCardImageUrl()) .setId(count + 1) .setPriority(MAX_RECOMMENDATIONS - count) .setTitle(movie.getTitle()) .setDescription(getString(R.string.popular_header)) .setImage(movie.getCardImageUrl()) .setIntent(buildPendingIntent(movie)) .build() if (++count >= MAX_RECOMMENDATIONS) { break } } if (++count >= MAX_RECOMMENDATIONS) { break } } } catch (e: IOException) { Log.e(TAG, "Unable to update recommendation", e) } } private fun buildPendingIntent(movie: Movie): PendingIntent { val detailsIntent = Intent(this, DetailsActivity::class.java) detailsIntent.putExtra("Movie", movie) val stackBuilder = TaskStackBuilder.create(this) stackBuilder.addParentStack(DetailsActivity::class.java) stackBuilder.addNextIntent(detailsIntent) // Ensure a unique PendingIntents, otherwise all // recommendations end up with the same PendingIntent detailsIntent.setAction(movie.getId().toString()) val intent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT) return intent } companion object { private val TAG = "UpdateRecommendationsService" private val MAX_RECOMMENDATIONS = 3 } }
Java
public class UpdateRecommendationsService extends IntentService { private static final String TAG = "UpdateRecommendationsService"; private static final int MAX_RECOMMENDATIONS = 3; public UpdateRecommendationsService() { super("RecommendationService"); } @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "Updating recommendation cards"); HashMap<String, List<Movie>> recommendations = VideoProvider.getMovieList(); if (recommendations == null) return; int count = 0; try { RecommendationBuilder builder = new RecommendationBuilder() .setContext(getApplicationContext()) .setSmallIcon(R.drawable.videos_by_google_icon); for (Map.Entry<String, List<Movie>> entry : recommendations.entrySet()) { for (Movie movie : entry.getValue()) { Log.d(TAG, "Recommendation - " + movie.getTitle()); builder.setBackground(movie.getCardImageUrl()) .setId(count + 1) .setPriority(MAX_RECOMMENDATIONS - count) .setTitle(movie.getTitle()) .setDescription(getString(R.string.popular_header)) .setImage(movie.getCardImageUrl()) .setIntent(buildPendingIntent(movie)) .build(); if (++count >= MAX_RECOMMENDATIONS) { break; } } if (++count >= MAX_RECOMMENDATIONS) { break; } } } catch (IOException e) { Log.e(TAG, "Unable to update recommendation", e); } } private PendingIntent buildPendingIntent(Movie movie) { Intent detailsIntent = new Intent(this, DetailsActivity.class); detailsIntent.putExtra("Movie", movie); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(DetailsActivity.class); stackBuilder.addNextIntent(detailsIntent); // Ensure a unique PendingIntents, otherwise all // recommendations end up with the same PendingIntent detailsIntent.setAction(Long.toString(movie.getId())); PendingIntent intent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); return intent; } }
Bu hizmetin sistem tarafından tanınması ve çalışması için uygulama manifest'inde yer alır. Aşağıdaki kod snippet'inde bu sınıfın nasıl hizmet olarak bildirileceği gösterilmektedir:
<manifest ... > <application ... > ... <service android:name="com.example.android.tvleanback.UpdateRecommendationsService" android:enabled="true" /> </application> </manifest>
Öneriler oluşturma
Öneri hizmetiniz çalışmaya başladığında öneriler oluşturmalı ve bunları
ortaya koyduk. Çerçeve, önerileri belirli bir şablonu kullanan ve belirli bir şablonla işaretlenmiş Notification
nesneleri olarak alır
seçin.
Değerleri ayarlama
Öneri kartının kullanıcı arayüzü öğesi değerlerini ayarlamak için aşağıdaki adımları uygulayarak bir oluşturucu sınıfı oluşturursunuz: aşağıdaki gibi açıklanan oluşturucu kalıbı. Öncelikle, öneri kartının değerlerini ayarlarsınız öğeler.
Kotlin
class RecommendationBuilder { ... fun setTitle(title: String): RecommendationBuilder { this.title = title return this } fun setDescription(description: String): RecommendationBuilder { this.description = description return this } fun setImage(uri: String): RecommendationBuilder { imageUri = uri return this } fun setBackground(uri: String): RecommendationBuilder { backgroundUri = uri return this } ...
Java
public class RecommendationBuilder { ... public RecommendationBuilder setTitle(String title) { this.title = title; return this; } public RecommendationBuilder setDescription(String description) { this.description = description; return this; } public RecommendationBuilder setImage(String uri) { imageUri = uri; return this; } public RecommendationBuilder setBackground(String uri) { backgroundUri = uri; return this; } ...
Bildirimi oluşturma
Değerleri ayarladıktan sonra, oluşturucudaki değerleri atayarak bildirimi oluşturursunuz
sınıfı bildirime gönderiyorum ve NotificationCompat.Builder.build()
aranıyor.
Ayrıca, mutlaka
setLocalOnly()
.
bu nedenle NotificationCompat.BigPictureStyle
bildirimi görünmez
diğer cihazlarda kullanabilirsiniz.
Aşağıdaki kod örneğinde, öneri oluşturma gösterilmektedir.
Kotlin
class RecommendationBuilder { ... @Throws(IOException::class) fun build(): Notification { ... val notification = NotificationCompat.BigPictureStyle( NotificationCompat.Builder(context) .setContentTitle(title) .setContentText(description) .setPriority(priority) .setLocalOnly(true) .setOngoing(true) .setColor(context.resources.getColor(R.color.fastlane_background)) .setCategory(Notification.CATEGORY_RECOMMENDATION) .setLargeIcon(image) .setSmallIcon(smallIcon) .setContentIntent(intent) .setExtras(extras)) .build() return notification } }
Java
public class RecommendationBuilder { ... public Notification build() throws IOException { ... Notification notification = new NotificationCompat.BigPictureStyle( new NotificationCompat.Builder(context) .setContentTitle(title) .setContentText(description) .setPriority(priority) .setLocalOnly(true) .setOngoing(true) .setColor(context.getResources().getColor(R.color.fastlane_background)) .setCategory(Notification.CATEGORY_RECOMMENDATION) .setLargeIcon(image) .setSmallIcon(smallIcon) .setContentIntent(intent) .setExtras(extras)) .build(); return notification; } }
Öneri hizmetini çalıştır
Güncel hesap oluşturabilmeniz için uygulamanızın öneri hizmetinin düzenli olarak çalışması gerekir
öneriler. Hizmetinizi çalıştırmak için zamanlayıcı çalıştıran ve şunu çağıran bir sınıf oluşturun:
düzenli aralıklarla kontrol edin. Aşağıdaki kod örneği, bir öneri hizmetinin düzenli olarak yürütülmesini başlatmak için BroadcastReceiver
sınıfını genişletir
yarım saatte bir:
Kotlin
class BootupActivity : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Log.d(TAG, "BootupActivity initiated") if (intent.action.endsWith(Intent.ACTION_BOOT_COMPLETED)) { scheduleRecommendationUpdate(context) } } private fun scheduleRecommendationUpdate(context: Context) { Log.d(TAG, "Scheduling recommendations update") val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val recommendationIntent = Intent(context, UpdateRecommendationsService::class.java) val alarmIntent = PendingIntent.getService(context, 0, recommendationIntent, 0) alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, INITIAL_DELAY, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent ) } companion object { private val TAG = "BootupActivity" private val INITIAL_DELAY:Long = 5000 } }
Java
public class BootupActivity extends BroadcastReceiver { private static final String TAG = "BootupActivity"; private static final long INITIAL_DELAY = 5000; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "BootupActivity initiated"); if (intent.getAction().endsWith(Intent.ACTION_BOOT_COMPLETED)) { scheduleRecommendationUpdate(context); } } private void scheduleRecommendationUpdate(Context context) { Log.d(TAG, "Scheduling recommendations update"); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent recommendationIntent = new Intent(context, UpdateRecommendationsService.class); PendingIntent alarmIntent = PendingIntent.getService(context, 0, recommendationIntent, 0); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, INITIAL_DELAY, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent); } }
BroadcastReceiver
sınıfının bu uygulaması başlangıçtan sonra çalışmalıdır
yüklü olduğu TV cihazından kaldırın. Bunu başarmak için bu sınıfı uygulamanızda kaydedin
manifest'i, cihaz başlatma işleminin tamamlanmasını izleyen bir intent filtresiyle açın. İlgili içeriği oluşturmak için kullanılan
Aşağıdaki örnek kod, bu yapılandırmanın manifest dosyasına nasıl ekleneceğini gösterir:
<manifest ... > <application ... > <receiver android:name="com.example.android.tvleanback.BootupActivity" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> </manifest>
Önemli: Başlatma tamamlandı bildirimini almak için uygulamanızın
RECEIVE_BOOT_COMPLETED
iznini istiyor.
Daha fazla bilgiyi ACTION_BOOT_COMPLETED
sayfasında bulabilirsiniz.
Öneri hizmet sınıfınızda onHandleIntent()
.
yöntemini kullanıyorsanız, öneriyi aşağıdaki şekilde yöneticiye gönderin:
Kotlin
val notification = notificationBuilder.build() notificationManager.notify(id, notification)
Java
Notification notification = notificationBuilder.build(); notificationManager.notify(id, notification);