【问题标题】:Launch a particular Program from Android TV Home Screen从 Android TV 主屏幕启动特定程序
【发布时间】:2018-10-01 06:19:31
【问题描述】:

我正在开发电视推荐/主屏幕频道应用程序。

我已经成功地在 Android TV 主屏幕上显示了我的应用程序中的程序列表,并且每当用户从主屏幕选择任何程序时都能够启动 VideoPlaybackActivity。

问题:无法启动用户在主屏幕上选择的特定视频

这是我编写的用于在VideoListingActivity中启动程序的代码

public void dynamicPrograms() {

        for (Movie movie : movieArrayListHomeScreen) {

            Uri posterArtUri = Uri.parse(movie.getImageUrl(Movie.IMAGE_ICON));
            Uri previewVideoUri = Uri.parse(movie.getPlaybackUrl());

            PreviewProgram program = new PreviewProgram.Builder()
                    .setChannelId(channelId)
                    .setType(TvContractCompat.PreviewPrograms.TYPE_MOVIE)
                    .setTitle(movie.getName())
                    .setDescription(movie.getName() + " description goes here")
                    .setPosterArtUri(posterArtUri)
                    //.setPreviewVideoUri(previewVideoUri)
                    .setInternalProviderId(String.valueOf(movie.getId()))
                    .setContentId(String.valueOf(movie.getId()))
                    .setIntentUri(Uri.parse(SCHEME + "://" + APPS_LAUNCH_HOST
                            + "/" + PLAY_VIDEO_ACTION_PATH + "/" + movie))
                    .build();

            Uri programUri = getApplicationContext().getContentResolver()
                    .insert(TvContractCompat.PreviewPrograms.CONTENT_URI, program.toContentValues());

            long programId = ContentUris.parseId(programUri);
            Log.d("programId:", String.valueOf(programId));
        }
    }

注意:我正在使用 Intent 传递数据,但在 VideoPlaybackActivity 中没有得到相同的结果,但是如果我在 Activity 中使用相同的 Intent(假设在 Detail Activity 中)来调用 VideoPlaybackActivity,那么我会得到所选/特定视频的数据,因为我在 Logcat 中打印相同

这就是我在 VideoDetailsActivity 中用来在 VideoPlaybackActivity 中播放选定视频的方法

Intent intent = new Intent (v.getContext (), VideoPlaybackActivity.class);
                                intent.putExtra (VideoPlaybackActivity.EXTRA_MOVIE, movie);
                                startActivity (intent);

但是当我直接从 Android TV 主屏幕调用 VideoPlaybackActivity(未在 Logcat 中获取特定视频的值)因此无法启动 VideoPlaybackActivity 来播放特定视频

Manifest.xml

    <activity android:name=".ui.activity.VideoPlaybackActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data
                android:scheme="androidtvhomescreenchannels"
                android:host="com.androidtv.hsc"
                android:pathPrefix="/playvideo" />
        </intent-filter>
    </activity>

注意:甚至,我想知道我从主屏幕中选择了哪个特定程序,我很想在 Logcat 中看到该程序/电影的名称

【问题讨论】:

  • 当你选择行并且点击方法是 onItemClicked 时它是否总是显示第一个视频??
  • 播放默认视频并且该视频不属于行
  • for (Movie movie1 : movieArrayListHomeScreen) 正在循环调用意图。似乎有问题。
  • 那么你的想法,应该如何@Jay
  • 能否分享一下onItemClicked的代码,方便分析。

标签: android android-8.0-oreo android-tv homescreen leanback


【解决方案1】:

由于某种原因,当点击 Channel 时,.setIntent(intent)new PreviewProgram.Builder() 上设置的原始意图被覆盖或丢失,无论出于何种原因。

我唯一能做的就是在意图的Uri 中包含(电影/频道)的ID。

所以不是用

传递一个对象
                .setIntentUri(Uri.parse(SCHEME + "://" + APPS_LAUNCH_HOST
                        + "/" + PLAY_VIDEO_ACTION_PATH + "/" + movie))

只需将 movieID 作为 valueType 发送

int movieID;

                .setIntentUri(Uri.parse(SCHEME + "://" + APPS_LAUNCH_HOST
                        + "/" + PLAY_VIDEO_ACTION_PATH + "/" + movieID))

在新打开的Activity中提取ID:

https://github.com/android/tv-samples/blob/e3eb39fbcbc217939c1b621917f850e95c75895e/LeanbackShowcase/app/src/main/java/androidx/leanback/leanbackshowcase/app/rows/VideoPlaybackActivity.java#L98

String videoId = getVideoID(getIntent().getData());


 /**
 * This is the helper function to extract the videoId (an unique id which will not be
 * changed along with the transaction)
 */
private String getVideoID(Uri uri) {
    List<String> paths = uri.getPathSegments();
    if (paths.size() == 2 && TextUtils.equals(paths.get(0), PLAY_VIDEO_ACTION_PATH)) {
        return paths.get(1);

    }
    return null;
}

显然,如果我可以像往常一样将对象直接发送到 Activity 会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2014-09-10
    • 2013-01-05
    相关资源
    最近更新 更多