从Android TV主屏幕启动特定程序

时间:2018-10-01 06:19:31

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

我正在研究电视推荐/主屏幕频道应用。

我已经在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中查看该程序/电影的名称

1 个答案:

答案 0 :(得分:0)

由于某些原因,当单击频道时,由.setIntent(intent)new PreviewProgram.Builder()上设置的原始意图由于任何原因都会被覆盖或丢失。

我唯一要做的是将(电影/频道)的ID与意图的Uri包括在内。

因此,不要通过

传递对象
                .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))

要在新打开的活动中提取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;
}

很明显,如果我能像往常一样直接将对象发送到活动,那就更好了。