Android N ve önceki sürümlerde öneriler

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.

Ş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);