0

[Android TV] Phần 7: Hiển thị một Card đang hoạt động và thêm các bước hướng dẫn người dùng.

Các Tv Applications phải hiển thị một Now Playing Card. Mục đích của thẻ này để người dùng có thể quay trở lại lập tức ứng dụng đang chạy ở launcher hoặc chạy ngầm. Android framework sẽ hiển thị một thẻ đang hoạt động trên màn hình chính khi mà kích hoạt lớp MediaSession. Thẻ này bao gồm các media metadata như là album nghệ thuật, tiêu đề, biểu tượng của ứng dụng. Khi người dùng chọn vào thẻ, hệ thống sẽ khởi động ứng dụng tương ứng với thẻ đó. Phần này chúng ta sẽ tìm hiểu làm thế nào để sử dụng lớp MediaSession cho việc thực thi một Now Playing Card.

alt

Figure 1.1: Hiển thị một Now Playing Card khi đang thực thi chạy ứng dụng trên background.

Khởi động lớp Media Session

Khởi tạo một lớp MediaSession khi ứng dụng đang chuẩn bị thực thi một tác vụ. Đoạn code dưới sẽ miêu tả cách làm thế nào để cài đặt một callback và flags riêng biệt cho lớp MediaSession:

mSession = new MediaSession(this, "MusicService");
mSession.setCallback(new MediaSessionCallback());
mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
        MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

Chú ý: Now Playing Card sẽ chỉ hiển thị cho một tiến trình với cờ FLAG_HANDLES_TRANSPORT_CONTROLS được cài đặt.

Hiển thị một Now Playing Card

Now Playing Card chỉ xuất hiện khi các tiến trình được kích hoạt. Chúng ta cần gọi phương thức setActive(true) khi bắt đầu playbacks. Ứng dụng của chúng ta cũng cần yêu cầu sử dụng âm thanh từ TV Device, việc này cũng giống như phần mô tả trong Managing Audio Focus.

private void handlePlayRequest() {

    tryToGetAudioFocus();

    if (!mSession.isActive()) {
        mSession.setActive(true);
    }
...

Thẻ này bị gỡ bỏ khỏi launcher khi chúng ta gọi phương thức setActive(false) hoặc khi bị một ứng dụng khác chiếm quyền ưu tiên sử dụng âm thanh của TV device. Nếu dừng lại hoàn toàn và không kích hoạt lại media. Ứng dụng của chúng ta nên bỏ kích hoạt các tiến trình media ngay lập tức. Nếu chỉ dừng lại tạm thời, ứng dụng của chúng ta nên bỏ kích hoạt tiến trình này sau một khoảng thời gian, thường là 5 đến 30 phút.

Cập nhật trạng thái Playback

Cập nhật trạng thái playback trên MediaSessions, như vậy thẻ có thể hiển thị tiến trình trên media hiện tại.

private void updatePlaybackState() {
    long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN;
    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
        position = mMediaPlayer.getCurrentPosition();
    }
    PlaybackState.Builder stateBuilder = new PlaybackState.Builder()
            .setActions(getAvailableActions());
    stateBuilder.setState(mState, position, 1.0f);
    mSession.setPlaybackState(stateBuilder.build());
}

private long getAvailableActions() {
    long actions = PlaybackState.ACTION_PLAY_PAUSE |
            PlaybackState.ACTION_PLAY_FROM_MEDIA_ID |
            PlaybackState.ACTION_PLAY_FROM_SEARCH;
    if (mPlayingQueue == null || mPlayingQueue.isEmpty()) {
        return actions;
    }
    if (mState == PlaybackState.STATE_PLAYING) {
        actions |= PlaybackState.ACTION_PAUSE;
    } else {
        actions |= PlaybackState.ACTION_PLAY;
    }
    if (mCurrentIndexOnQueue > 0) {
        actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
    }
    if (mCurrentIndexOnQueue < mPlayingQueue.size() - 1) {
        actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
    }
    return actions;
}

Hiển thị Media Metadata

Khi người dùng lựa chọn Now Playing Card, hệ thống mở ứng dụng. Nếu ứng dụng cung cấp một phương thức PedingIntenttớisetSessionsActivity(), hệ thống sẽ mở activity mà bạn định danh muốn mở ứng dụng tại đó. Nếu không, hế thống sử dụng intent mặc định để mở ứng dụng. Activity được định danh này chúng ta phải cung cấp cho người dùng quyền điều khiển tạm dừng hoặc ngừng playback.

Intent intent = new Intent(mContext, MyActivity.class);
    PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    mSession.setSessionActivity(pi);

Thêm phần hướng dẫn người dùng

Ứng dụng của chúng ta có thể yêu cầu người dùng thông qua rất nhiều bước điểu khiển. Ví dụ, ứng dụng của bạn có thể cần phải hướng dẫn người sử dụng thông qua việc mua nội dung bổ sung, hoặc thiết lập một thiết lập cấu hình phức tạp, hoặc đơn giản là xác nhận một quyết định. Tất cả những công việc đòi hỏi người dùng phải đi thông qua một hoặc nhiều bước hoặc phải quyết định.

v17 Leanback support library cung cấp những class phục vụ cho việc thực hiện nhiều bước công việc cho người dùng. Phần này cho chúng ta biết làm thế nào để sử dụng lớp GuidedStepFragment để hướng dẫn người sử dụng thông qua một chuỗi các quyết định để hoàn thành công việc.GuidedStepFragment sử dụng TV UI như một cách tốt nhất để làm cho việc thực hiện qua nhiều bước của người dùng một cách dễ hiểu và dễ điều hướng trên màn hình.

Cung cấp chi tiết cho một Bước

Một GuidedStepFragment đại diện cho một bước duy nhất trong một loạt các bước. Nhìn bê ngoài nó cung cấp một view hướng dẫn phía bên trái của phần hiển thị thông tin các bước. Bên phải, GuidedStepFragment cung cấp một cái nhìn có chứa một danh sách các hành động có thể hoặc quyết định cho bước này.

alt

Figure 1: Một ví dụ về các bước hướng dẫn.

Đối với mỗi bước trong nhiều bước thực thi của bạn, extends lớp GuidedStepFragment và cung cấp thông tin context về các bước và hành động của người sử dụng có thể mất. Ghi đè [Override onCreateGuidance()] và trả về một GuidanceStylist.Guidance mới có chứa các thông tin ngữ cảnh chẳng hạn như tiêu đề bước, mô tả, và biểu tượng.

@Override
public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
    String title = getString(R.string.guidedstep_first_title);
    String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
    String description = getString(R.string.guidedstep_first_description);
    Drawable icon = getActivity().getDrawable(R.drawable.guidedstep_main_icon_1);
    return new GuidanceStylist.Guidance(title, description, breadcrumb, icon);
}

Thêm lớp con GuidedStepFragment để activity chúng ta muốn bằng cách gọi phương thức GuidedStepFragment.add() trong phương thức [onCreate()] của activity. Nếu trong activity chỉ chứa đối tượng GuidedStepFragment thì sử dụng GuidedStepFragment.addAsRoot() thay vì sử dụng .add() để thêm các GuidedStepFragment. Sử dụng addAsRoot () đảm bảo rằng nếu người dùng nhấn nút Back trên điều khiển từ xa khi xem GuidedStepFragment đầu tiên, cả hai GuidedStepFragment và activity cha sẽ đóng.

Continue..


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.