1. Giới thiệu
Lần cập nhật gần đây nhất: Ngày 9 tháng 9 năm 2020
Việc thêm MediaSession vào quá trình phát video mang lại những lợi ích gì?
Phiên phát nội dung đa phương tiện là mối liên kết ràng buộc giữa nền tảng Android và các ứng dụng đa phương tiện. Không chỉ thông báo cho Android rằng nội dung nghe nhìn đang phát (để Android có thể chuyển tiếp các thao tác với nội dung nghe nhìn vào đúng phiên), mà còn thông báo cho nền tảng biết nội dung đang phát và cách kiểm soát nội dung đó.
Việc hiển thị một MediaSession thông qua ứng dụng của bạn mang lại nhiều lợi ích cho người dùng. Sau đây là một vài ví dụ hay.
Trợ lý Google
Người dùng có thể dễ dàng tương tác với nội dung nghe nhìn trong ứng dụng của bạn thông qua các lệnh thoại như "Tạm dừng", "Tiếp tục" và "Tiếp theo". Siêu dữ liệu của nội dung nghe nhìn cũng có thể được dùng để nhận câu trả lời về nội dung đang phát.
Android TV
Trong trải nghiệm trên màn hình lớn, ứng dụng cho Android TV có thể sử dụng các điều khiển từ xa thông thường cho người dùng có TV hỗ trợ HDMI-CEC. Các lệnh do nút phát/tạm dừng, dừng, tiếp theo và trước đó phát ra sẽ được chuyển tiếp đến ứng dụng của bạn.
Các nút điều khiển nội dung nghe nhìn trên màn hình
Kể từ Android 4.0 (cấp độ API 14), hệ thống có thể truy cập vào trạng thái phát và siêu dữ liệu của một phiên nội dung nghe nhìn. Chức năng này cho phép màn hình khoá hiển thị các nút điều khiển nội dung nghe nhìn và ảnh bìa. Hành vi này sẽ khác nhau tuỳ thuộc vào phiên bản Android.
Nội dung nghe nhìn trong nền
Bạn có thể điều khiển nội dung nghe nhìn trong bất kỳ trường hợp nào trong số này, ngay cả khi ứng dụng phát nội dung nghe nhìn đang chạy ở chế độ nền.
Điện toán môi trường xung quanh
Việc hiển thị nội dung nghe nhìn của bạn cùng với dữ liệu về nội dung đang phát và cách kiểm soát nội dung đó có thể kết nối các thiết bị để người dùng có thể tương tác theo nhiều cách mà họ muốn.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ mở rộng mẫu Exoplayer hiện có để thêm tính năng hỗ trợ phiên nội dung nghe nhìn. Ứng dụng này sẽ:
- Phản ánh chính xác trạng thái hoạt động của phiên nội dung nghe nhìn
- Chuyển tiếp các nút điều khiển nội dung nghe nhìn đến ExoPlayer
- Truyền siêu dữ liệu của các mục trong hàng đợi vào phiên phát nội dung nghe nhìn
Kiến thức bạn sẽ học được
- Lý do các phiên phát nội dung nghe nhìn mang đến trải nghiệm phong phú hơn cho người dùng
- Cách tạo một phiên phát nội dung đa phương tiện và quản lý trạng thái của phiên đó
- Cách kết nối một phiên nội dung nghe nhìn với ExoPlayer
- Cách thêm siêu dữ liệu của các mục trong hàng đợi phát vào phiên đa phương tiện
- Cách thêm các thao tác bổ sung (tuỳ chỉnh)
Lớp học lập trình này tập trung vào MediaSession SDK. Các khái niệm và khối mã không liên quan (bao gồm cả thông tin chi tiết về việc triển khai ExoPlayer) sẽ không được thảo luận nhưng chỉ được cung cấp cho bạn để sao chép và dán.
Bạn cần có
- Một phiên bản Android Studio gần đây (3.5 trở lên)
- Kiến thức cơ bản về cách phát triển ứng dụng Android
2. Thiết lập
Điểm xuất phát của chúng ta là gì?
Điểm xuất phát của chúng ta là bản minh hoạ chính từ ExoPlayer. Bản minh hoạ này chứa các video có chế độ điều khiển phát trên màn hình nhưng không sử dụng các phiên nội dung nghe nhìn có sẵn. Đây là nơi lý tưởng để chúng ta tìm hiểu và thêm các tính năng này!
Lấy mẫu ExoPlayer
Để bắt đầu, hãy dùng mẫu ExoPlayer. Sao chép kho lưu trữ GitHub bằng cách chạy mã bên dưới.
git clone https://github.com/google/ExoPlayer.git
Mở bản minh hoạ
Trong Android Studio, hãy mở dự án minh hoạ chính nằm trong demos/main.
Android Studio sẽ nhắc bạn đặt đường dẫn SDK. Bạn nên làm theo đề xuất về việc cập nhật các công cụ IDE và SDK nếu gặp phải vấn đề nào đó.

Nếu bạn được yêu cầu phải sử dụng phiên bản Gradle mới nhất, hãy tiếp tục và cập nhật phiên bản đó.
Hãy dành chút thời gian để tìm hiểu những kiến thức cơ bản về cách thiết kế ứng dụng. Xin lưu ý rằng có 2 hoạt động: SampleChooserActivity và PlayerActivity. Chúng ta sẽ dành thời gian còn lại của lớp học lập trình này trong PlayerActivity, nơi nội dung nghe nhìn thực sự phát. Vì vậy, hãy mở lớp này và chuyển sang phần tiếp theo.
3. Tạo một phiên phát nội dung nghe nhìn và quản lý trạng thái của phiên đó
Tạo phiên phát nội dung nghe nhìn
Mở PlayerActivity.java. Lớp này tạo ExoPlayer và quản lý các chức năng của ExoPlayer, chẳng hạn như hiển thị video trên màn hình. Trong hoạt động này, chúng ta sẽ kết nối ExoPlayer với một phiên phát nội dung nghe nhìn.
Khai báo 2 trường sau ở đầu lớp. Chúng ta sẽ sử dụng các trường này trong suốt phần này.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
Bạn cần thêm phần phụ thuộc của dự án "extension-mediasession" vào build.gradle ở cấp mô-đun cho "Module: demo":
implementation project(path: ':extension-mediasession')
Xin lưu ý rằng Android Studio có thể giúp bạn tự động thêm phần phụ thuộc này nếu bạn di chuột qua lỗi khi giải quyết MediaSessionConnector:

Cuối cùng, hãy giải quyết các lần nhập lớp bằng cách thêm nội dung sau:
import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
Khi hoạt động được tạo, chúng ta sẽ muốn tạo một phiên phát nội dung nghe nhìn và một trình kết nối phiên phát nội dung nghe nhìn đóng vai trò là trung gian giữa phiên phát nội dung nghe nhìn và ExoPlayer.
Nơi lý tưởng để chèn thông tin này cũng là nơi ExoPlayer được tạo. Trong ứng dụng minh hoạ, chúng ta có thể thêm mã vào cuối initializePlayer(). Hãy nhớ thêm logic này sau khi người chơi được khởi tạo!
private void initializePlayer() {
if (player == null) {
...
player = ...
...
mediaSession = new MediaSessionCompat(this, "sample");
mediaSessionConnector = new MediaSessionConnector(mediaSession);
mediaSessionConnector.setPlayer(player);
}
...
}
Giải phóng phiên phát nội dung nghe nhìn
Giải phóng phiên đa phương tiện khi không còn cần thiết nữa. Khi phát hành ExoPlayer trong releasePlayer(), chúng ta cũng có thể thêm mã sau để thực hiện việc này:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
Quản lý trạng thái của phiên phát nội dung nghe nhìn
Giờ đây, sau khi tạo phiên đa phương tiện, chúng ta cần đảm bảo rằng trạng thái của phiên đó được phản ánh chính xác khi người dùng tương tác với hoạt động.
Khi người dùng bắt đầu hoạt động, phiên nội dung nghe nhìn sẽ trở nên hoạt động:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
Vì ứng dụng của chúng tôi không phát nội dung nghe nhìn ở chế độ nền, nên bạn cần đảm bảo rằng phiên nội dung nghe nhìn sẽ không hoạt động khi người dùng rời khỏi hoạt động:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
Hãy chạy bản minh hoạ
- Kết nối thiết bị Android hoặc khởi động trình mô phỏng.
- Đảm bảo bạn đã chọn "demo" để chạy từ thanh công cụ Android Studio.

- Nhấp vào biểu tượng
trên thanh công cụ của Android Studio. - Sau khi ứng dụng khởi chạy trên thiết bị, hãy chọn một luồng video để phát.
- Sau khi bắt đầu phát, hãy khám phá cách sử dụng các lệnh
adbsau đây để điều khiển phiên phát nội dung nghe nhìn:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
- Ngoài ra, hãy khám phá cách Android xem phiên nội dung nghe nhìn của bạn. Cụ thể, bạn có thể kiểm tra những thao tác được hỗ trợ bằng cách xem trường thao tác. Số bạn thấy ở đây là sự kết hợp của các mã nhận dạng thao tác, như được khai báo trong đối tượng PlaybackState. Cách xem phiên nội dung nghe nhìn đang chạy:
adb shell dumpsys media_session - Nếu bạn đang sử dụng một thiết bị thực có micrô, hãy thử gọi Trợ lý Google và đưa ra lệnh thoại, chẳng hạn như: "Tạm dừng". "Tiếp tục." "Tua đi 1 phút".
Mẫu ExoPlayer chạy trên Android TV.
4. Bao gồm siêu dữ liệu của các mục trong hàng đợi phát
Giờ đây, chúng ta có thể mở rộng các tính năng được hỗ trợ của phiên đa phương tiện mà trước đó chúng ta đã tạo MediaSessionConnector trong initializePlayer().
Thêm TimelineQueueNavigator
ExoPlayer biểu thị cấu trúc của nội dung nghe nhìn dưới dạng một dòng thời gian. Để biết thông tin chi tiết về cách hoạt động của đối tượng này, hãy dành chút thời gian đọc về đối tượng Dòng thời gian của ExoPlayer. Bằng cách khai thác cấu trúc này, chúng ta có thể biết khi nào nội dung thay đổi và hiển thị siêu dữ liệu của nội dung đang phát khi được yêu cầu.
Để thực hiện việc này, chúng ta sẽ xác định một TimelineQueueNavigator. Xác định vị trí của việc tạo thực thể MediaSessionConnector trong initializePlayer() và thêm một cách triển khai TimelineQueueNavigator sau khi mediaSession được khởi chạy.
mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
@Override
public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
return new MediaDescriptionCompat.Builder()
.setTitle(player.getCurrentMediaItem().mediaMetadata.title)
.setDescription("MediaDescription description for " + windowIndex)
.setSubtitle("MediaDescription subtitle")
.build();
}
});
Giải quyết các lần nhập lớp bằng cách thêm:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
Lưu ý rằng tham số windowIndex tương ứng với mục có chỉ mục đó trong hàng đợi phát.
Giờ đây, khi đã thêm một số siêu dữ liệu, bạn có thể kiểm thử để xem Trợ lý có hiểu nội dung đang phát hay không. Trong khi phát video trên Android TV, hãy gọi Trợ lý rồi hỏi "Đang phát gì vậy?"

5. Tuỳ chỉnh thao tác
Có thể trình phát của bạn không hỗ trợ một số thao tác hoặc bạn muốn thêm tính năng hỗ trợ cho nhiều thao tác hơn? Bây giờ, hãy tìm hiểu sâu hơn một chút về phiên nội dung nghe nhìn mà chúng ta đã tạo MediaSessionConnector trong initializePlayer().
Khai báo các thao tác được hỗ trợ
Hãy thử dùng mediaSessionConnector.setEnabledPlaybackActions() để tuỳ chỉnh những thao tác mà bạn muốn phiên phát nội dung nghe nhìn hỗ trợ.
Xin lưu ý rằng bộ đầy đủ là:
mediaSessionConnector.setEnabledPlaybackActions(
PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_PLAY
| PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_SEEK_TO
| PlaybackStateCompat.ACTION_FAST_FORWARD
| PlaybackStateCompat.ACTION_REWIND
| PlaybackStateCompat.ACTION_STOP
| PlaybackStateCompat.ACTION_SET_REPEAT_MODE
| PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);
Hãy xem lại cách dữ liệu này được hiển thị cho nền tảng:
- Như trước đây, hãy bắt đầu phát một video.
- Khám phá cách Android xem siêu dữ liệu từ phiên nội dung nghe nhìn của bạn bằng cách thực thi:
adb shell dumpsys media_session - Tìm dòng chứa siêu dữ liệu và nhận thấy rằng tiêu đề và nội dung mô tả được đưa vào và liên kết với
com.google.android.exoplayer2.demo/sample.
Thêm các hành động khác
Chúng ta có thể mở rộng phiên phát nội dung nghe nhìn bằng một số thao tác bổ sung. Trong phần này, chúng ta sẽ chỉ thêm tính năng hỗ trợ phụ đề.
Phụ đề hỗ trợ
Việc thêm chế độ hỗ trợ phụ đề vào các phiên nội dung nghe nhìn cho phép người dùng bật/tắt phụ đề bằng giọng nói. Tại nơi bạn đã khởi chạy trình kết nối phiên nội dung nghe nhìn, hãy thêm nội dung sau:
mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
@Override
public void onSetCaptioningEnabled(Player player, boolean enabled) {
Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
}
@Override
public boolean hasCaptions(Player player) {
return true;
}
@Override
public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
return false;
}
}
);
Cuối cùng, hãy giải quyết mọi tệp nhập bị thiếu.
Bạn có thể kiểm thử tính năng này bằng cách gọi Trợ lý Google trên Android TV và nói "Bật phụ đề". Kiểm tra Logcat để xem các thông báo về cách gọi này trong mã của bạn.
6. Xin chúc mừng
Xin chúc mừng, bạn đã thêm thành công các phiên nội dung nghe nhìn vào mẫu!
Bạn đã có được rất nhiều chức năng bằng cách:
- thêm một phiên phát nội dung nghe nhìn,
- kết nối các phiên phát nội dung đa phương tiện với một thực thể của ExoPlayer,
- thêm siêu dữ liệu và các thao tác khác.
Giờ đây, bạn đã biết các bước chính cần thiết để làm phong phú ứng dụng đa phương tiện và mang đến cho người dùng trải nghiệm linh hoạt hơn!
Lời nhận xét cuối cùng
Lớp học lập trình này được xây dựng dựa trên một mẫu trong mã nguồn ExoPlayer. Bạn không cần sử dụng ExoPlayer từ nguồn và nên kéo các phần phụ thuộc cho ExoPlayer và MediaSessionConnector để dễ dàng cập nhật các bản phát hành mới nhất.
Để làm vậy, bạn chỉ cần thay thế các phần phụ thuộc của dự án, chẳng hạn như:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
để kéo từ các kho lưu trữ Maven, chẳng hạn như:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'