1. Giới thiệu
Lần cập nhật gần đây nhất: 09/09/2020
Việc thêm MediaSession xung quanh tính năng phát video mang lại 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 để có thể chuyển tiếp các thao tác với nội dung nghe nhìn vào phiên phát chính xác, 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ị MediaSession thông qua ứng dụng của bạn sẽ mang lại nhiều lợi ích cho người dùng. Sau đây là một vài ví dụ tuyệt vời.
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 từ 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
Trên màn hình lớn, ứng dụng Android TV của bạn 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 chế độ điều khiển nội dung nghe nhìn trên màn hình
Kể từ Android 4.0 (API cấp 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 phát 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 đa phương tiện và hình minh hoạ. Hành vi này thay đổi tuỳ thuộc vào phiên bản Android.
Nội dung nghe nhìn ở chế độ 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 đa phương tiện cùng với dữ liệu về nội dung đang phát và cách điều khiển nội dung đó có thể tạo cầu nối giữa các thiết bị để người dùng có thể tương tác với nội dung 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 phát nội dung đa phương tiện. Ứng dụng này sẽ:
- Phản ánh chính xác trạng thái đang hoạt động của phiên phát 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 đa phương tiệ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 lại trải nghiệm phong phú hơn cho người dùng
- Cách tạo 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 phiên phát nội dung nghe nhìn với ExoPlayer
- Cách đưa siêu dữ liệu của các mục vào hàng đợi phát trong phiên phát nội dung đa phương tiện
- Cách thêm các thao tác (tuỳ chỉnh) khác
Lớp học lập trình này tập trung vào SDK MediaSession. 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ề cách triển khai ExoPlayer, sẽ không được thảo luận nhưng được cung cấp cho bạn để bạn chỉ cần sao chép và dán.
Bạn cần có
- 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 của ExoPlayer. Bản minh hoạ này chứa các video có cá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 phát nội dung đa phương tiện ngay từ đầu. Đây là một nơi tuyệt vời để chúng ta tìm hiểu và thêm các thành phần đó!
Tải mẫu ExoPlayer
Để bắt đầu, hãy bắt đầu với mẫu ExoPlayer. Sao chép kho lưu trữ GitHub bằng cách chạy mã dưới đây.
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 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 cơ bản về cách thiết kế ứng dụng. Lưu ý rằng có hai hoạt động: SampleChooserActivity và PlayerActivity. Chúng ta sẽ dành phần còn lại của lớp học lập trình này cho 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 lớp này, chẳng hạn như kết xuất video lê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 đa phương tiện.
Khai báo hai trường sau ở đầu lớp. Chúng ta sẽ sử dụng các trường này trong phần này.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
Bạn cần thêm phần phụ thuộc dự án "extension-mediasession" vào build.gradle
cấp mô-đun cho "Mô-đun: bản minh hoạ":
implementation project(path: ':extension-mediasession')
Xin lưu ý rằng Android Studio có thể tự động giúp bạn thêm phần phụ thuộc này nếu bạn di chuột qua lỗi khi phân giải MediaSessionConnector:
Cuối cùng, hãy phân giải các lệnh 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 tạo hoạt động, 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.
Vị trí lý tưởng để chèn đoạn mã này cũng là nơi tạo ExoPlayer. 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 tạo thực thể cho người chơi!
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 phát nội dung nghe nhìn khi không 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 phiên phát nội dung nghe nhìn
Giờ đây, khi đã tạo bản sao phiên phát nội dung đ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 phát nội dung nghe nhìn sẽ chuyển sang trạng thái đang hoạt động:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
Vì ứng dụng của chúng ta không phát nội dung nghe nhìn ở chế độ nền, nên điều quan trọng là phải đảm bảo rằng phiên phát 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ạ
- Đính kèm 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
trên thanh công cụ 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 quá trình phát bắt đầu, hãy khám phá cách sử dụng các lệnh
adb
sau đâ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 phát nội dung nghe nhìn của bạn. Cụ thể, bạn có thể kiểm tra xem hành động nào được hỗ trợ bằng cách xem trường hành động. Số mà bạn thấy ở đây là tổ hợp của các mã hành động, như đã khai báo trong đối tượng PlaybackState. Để xem phiên phát nội dung nghe nhìn 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 các 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 phát nội dung đa phương tiện mà trước đó chúng ta đã tạo MediaSessionConnector trong initializePlayer()
.
Thêm TimelineQueueNavigator
ExoPlayer thể hiện cấu trúc nội dung nghe nhìn dưới dạng dòng thời gian. Để biết thông tin chi tiết về cách hoạt động của tính năng này, hãy dành chút thời gian để đọc về đối tượng Tiến trình của ExoPlayer. Bằng cách khai thác cấu trúc này, chúng ta có thể được thông báo khi 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 TimelineQueueNavigator. Tìm bản sao của MediaSessionConnector trong initializePlayer()
và thêm 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ệnh nhập lớp bằng cách thêm:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
Hãy quan sát rằng tham số windowIndex
tương ứng với mục của 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 tra để đảm bảo Trợ lý hiểu được nội dung đang phát. Trong khi phát video trên Android TV, hãy gọi Trợ lý và hỏi "Đang phát gì?"
5. Tuỳ chỉnh hành động
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 hỗ trợ thêm? Bây giờ, hãy tìm hiểu sâu hơn một chút về phiên phát nội dung nghe nhìn mà trước đó chúng ta đã tạo MediaSessionConnector trong initializePlayer()
.
Khai báo các hành động được hỗ trợ
Hãy thử sử 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ợ.
Lưu ý rằng bộ hoàn chỉnh 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 nền tảng hiển thị dữ liệu này:
- Giống như trước, hãy bắt đầu một video.
- Khám phá cách Android xem siêu dữ liệu từ phiên phát nội dung nghe nhì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à quan sát để 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 đa phương tiệ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 tính năng hỗ trợ phụ đề vào các phiên phát 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 phát nội dung đa phương tiệ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 thông báo về cách gọi này vào 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 phát nội dung đa phương tiệ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 hành động 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!
Chú thích 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 từ mã nguồn ExoPlayer. Bạn không cần sử dụng ExoPlayer từ nguồn và bạn nên lấy 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 như vậy, bạn chỉ cần thay thế các phần phụ thuộc của dự án như:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
để lấy từ 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.+'