Получите доступ к списку программ WatchNext на Android TV

Вопрос или проблема

Я пытаюсь получить доступ к списку приложений “Смотреть дальше” на Android TV. Я не могу найти много информации об этом, кроме того, как добавить элемент в список. Похоже, что я должен получить доступ к этому через content:// URI, но функция, которую я использую, возвращает пустой массив:

package com.me.myapp

import android.content.Context
import android.media.tv.TvContract
import com.google.android.mediahome.video.WatchNextProgram

fun getWatchNextPrograms(context: Context): List<WatchNextProgram> {
    val programs = mutableListOf<WatchNextProgram>()
    val projection = arrayOf(
        TvContract.WatchNextPrograms._ID,
        TvContract.WatchNextPrograms.COLUMN_TITLE,
        TvContract.WatchNextPrograms.COLUMN_LOGO_URI,
    )

    val cursor = context.contentResolver.query(
        TvContract.WatchNextPrograms.CONTENT_URI,
        projection,
        null, 
        null,
        null
    )

    cursor?.use {
        while (it.moveToNext()) {
            val program = WatchNextProgram.fromCursor(it)
            programs.add(program)
        }
    }

    return programs
}

Есть ли какое-то разрешение, которое я пропустил, или что-то еще, что мне нужно, чтобы получить доступ к этому списку?

Ответ или решение

Чтобы получить доступ к списку программ "Смотрите Далее" на Android TV, необходимо учесть несколько важных аспектов, включая разрешения и корректное использование Content Provider.

  1. Разрешения: Убедитесь, что ваше приложение имеет необходимые разрешения. Для доступа к данным WatchNextPrograms необходимо добавить следующее разрешение в файл манифеста вашего приложения:

    <uses-permission android:name="android.permission.READ_WATCH_NEXT_PROGRAMS"/>
  2. Проверка наличия разрешений: Начиная с Android 6.0 (API уровень 23), необходимо запрашивать разрешения у пользователя во время выполнения. Убедитесь, что ваше приложение проверяет и запрашивает разрешение перед попыткой получить доступ к данным. Вы можете сделать это следующим образом:

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_WATCH_NEXT_PROGRAMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_WATCH_NEXT_PROGRAMS), REQUEST_CODE)
    } else {
        // Ваш метод для получения программ
        val programs = getWatchNextPrograms(context)
    }
  3. Использование правильного URI: Убедитесь, что вы используете правильный URI для обращения к WatchNextPrograms. В вашем коде это выглядит корректно, так как вы используете TvContract.WatchNextPrograms.CONTENT_URI.

  4. Обработка курсора: Также проверьте, что курсор возвращает данные. Ваша реализация кажется правильной, но если курсор пустой, это может указывать на то, что в данный момент нет доступных программ. Попробуйте протестировать вызов несколькими способами, например, добавив тестовые программы в Watch Next.

  5. Код с изменениями: Вот как должен выглядеть ваш окончательный код с учетом всех вышеуказанных моментов:

    package com.me.myapp
    
    import android.content.Context
    import android.media.tv.TvContract
    import android.Manifest
    import android.content.pm.PackageManager
    import androidx.core.app.ActivityCompat
    import androidx.core.content.ContextCompat
    import com.google.android.mediahome.video.WatchNextProgram
    
    fun getWatchNextPrograms(context: Context): List<WatchNextProgram> {
        val programs = mutableListOf<WatchNextProgram>()
        val projection = arrayOf(
            TvContract.WatchNextPrograms._ID,
            TvContract.WatchNextPrograms.COLUMN_TITLE,
            TvContract.WatchNextPrograms.COLUMN_LOGO_URI,
        )
    
        val cursor = context.contentResolver.query(
            TvContract.WatchNextPrograms.CONTENT_URI,
            projection,
            null,
            null,
            null
        )
    
        cursor?.use {
            while (it.moveToNext()) {
                val program = WatchNextProgram.fromCursor(it)
                programs.add(program)
            }
        }
    
        return programs
    }
    
    // Пример запроса разрешения
    fun checkPermissionsAndFetchPrograms(activity: Activity) {
        if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_WATCH_NEXT_PROGRAMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.READ_WATCH_NEXT_PROGRAMS), REQUEST_CODE)
        } else {
            val programs = getWatchNextPrograms(activity)
            // Обработка полученных программ
        }
    }

Если после выполнения всех этих шагов проблема не решится, проверьте, есть ли в вашей тестовой среде (например, на эмуляторе или реальном устройстве) программы, добавленные в список "Смотрите Далее".

Оцените материал
Добавить комментарий

Капча загружается...