Вопрос или проблема
Я пытаюсь получить доступ к списку приложений “Смотреть дальше” на 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.
-
Разрешения: Убедитесь, что ваше приложение имеет необходимые разрешения. Для доступа к данным
WatchNextPrograms
необходимо добавить следующее разрешение в файл манифеста вашего приложения:<uses-permission android:name="android.permission.READ_WATCH_NEXT_PROGRAMS"/>
-
Проверка наличия разрешений: Начиная с 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) }
-
Использование правильного URI: Убедитесь, что вы используете правильный URI для обращения к
WatchNextPrograms
. В вашем коде это выглядит корректно, так как вы используетеTvContract.WatchNextPrograms.CONTENT_URI
. -
Обработка курсора: Также проверьте, что курсор возвращает данные. Ваша реализация кажется правильной, но если курсор пустой, это может указывать на то, что в данный момент нет доступных программ. Попробуйте протестировать вызов несколькими способами, например, добавив тестовые программы в
Watch Next
. -
Код с изменениями: Вот как должен выглядеть ваш окончательный код с учетом всех вышеуказанных моментов:
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) // Обработка полученных программ } }
Если после выполнения всех этих шагов проблема не решится, проверьте, есть ли в вашей тестовой среде (например, на эмуляторе или реальном устройстве) программы, добавленные в список "Смотрите Далее".