Jetpack Media3 xác định giao diện Player
trình bày chức năng cơ bản
để phát các tệp video và âm thanh. ExoPlayer
là phương thức triển khai mặc định
của giao diện này trong Media3. Bạn nên dùng ExoPlayer vì nó cung cấp
bộ tính năng toàn diện bao gồm hầu hết các trường hợp sử dụng phát lại và
có thể tuỳ chỉnh để xử lý mọi trường hợp sử dụng khác mà bạn có thể có. Ngoài ra, ExoPlayer
loại bỏ sự phân mảnh thiết bị và hệ điều hành để mã của bạn hoạt động nhất quán
trên toàn bộ hệ sinh thái Android. ExoPlayer bao gồm:
- Hỗ trợ danh sách phát
- Hỗ trợ nhiều phương thức phát trực tuyến thích ứng và tăng dần định dạng
- Hỗ trợ việc chèn quảng cáo ở cả phía máy khách và phía máy chủ
- Hỗ trợ tính năng phát được bảo vệ bằng DRM
Trang này hướng dẫn bạn một số bước quan trọng để phát Bạn có thể xem hướng dẫn đầy đủ của chúng tôi về Media3 ExoPlayer.
Bắt đầu
Để bắt đầu, hãy thêm phần phụ thuộc vào ExoPlayer, UI và các mô-đun phổ biến của Jetpack Media3:
implementation "androidx.media3:media3-exoplayer:1.4.0" implementation "androidx.media3:media3-ui:1.4.0" implementation "androidx.media3:media3-common:1.4.0"
Tuỳ thuộc vào trường hợp sử dụng, bạn cũng có thể cần các mô-đun bổ sung của Media3,
chẳng hạn như exoplayer-dash
để phát luồng ở định dạng DASH.
Hãy nhớ thay thế 1.4.0
bằng phiên bản mong muốn của bạn
thư viện của bạn. Bạn có thể tham khảo ghi chú phát hành
để xem phiên bản mới nhất.
Tạo trình phát nội dung đa phương tiện
Với Media3, bạn có thể sử dụng phương thức triển khai Player
đi kèm
giao diện ExoPlayer
hoặc bạn có thể tạo phương thức triển khai tuỳ chỉnh của riêng mình.
Tạo ExoPlayer
Cách đơn giản nhất để tạo một thực thể ExoPlayer
như sau:
Kotlin
val player = ExoPlayer.Builder(context).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
Bạn có thể tạo trình phát nội dung đa phương tiện trong phương thức vòng đời onCreate()
của
Activity
, Fragment
hoặc Service
nơi ứng dụng hoạt động.
Builder
bao gồm
nhiều lựa chọn tuỳ chỉnh mà bạn có thể quan tâm, chẳng hạn như:
setAudioAttributes()
để định cấu hình tính năng xử lý quyền phát âm thanhsetHandleAudioBecomingNoisy()
để định cấu hình hành vi phát khi thiết bị đầu ra âm thanh bị ngắt kết nốisetTrackSelector()
để định cấu hình tính năng chọn kênh
Media3 cung cấp thành phần giao diện người dùng PlayerView
mà bạn có thể đưa vào
tệp bố cục. Thành phần này đóng gói một PlayerControlView
để phát
nút điều khiển, SubtitleView
để hiện phụ đề và Surface
để kết xuất
video.
Chuẩn bị trình phát
Thêm mục nội dung đa phương tiện vào danh sách phát cho
phát bằng các phương thức như
setMediaItem()
và addMediaItem()
.
Sau đó, hãy gọi prepare()
để
bắt đầu tải nội dung nghe nhìn và thu thập các tài nguyên cần thiết.
Bạn không nên thực hiện các bước này trước khi ứng dụng chạy trên nền trước. Nếu
người chơi đang ở trong Activity
hoặc Fragment
, điều này có nghĩa là hãy chuẩn bị người chơi trong
Phương thức vòng đời onStart()
trên API cấp 24 trở lên hoặc onResume()
phương thức vòng đời trên API cấp 23 trở xuống. Đối với người chơi ở trong Service
,
bạn có thể chuẩn bị trong onCreate()
.
Điều khiển trình phát
Sau khi chuẩn bị trình phát, bạn có thể điều khiển quá trình phát bằng các phương thức gọi trên trình phát, chẳng hạn như:
play()
vàpause()
để bắt đầu và tạm dừng phátseekTo()
để tìm cách một vị trí trong mục nội dung đa phương tiện hiện tạiseekToNextMediaItem()
vàseekToPreviousMediaItem()
để di chuyển trong danh sách phát
Các thành phần giao diện người dùng như PlayerView
hoặc PlayerControlView
sẽ cập nhật
phù hợp khi liên kết với người chơi.
Thả trình phát
Tính năng phát có thể cần đến các tài nguyên hạn chế, chẳng hạn như video
bộ giải mã, nên bạn cần phải gọi release()
trên trình phát của bạn để giải phóng tài nguyên khi không cần trình phát nữa.
Nếu trình phát của bạn đang ở trạng thái Activity
hoặc Fragment
, hãy thả trình phát ra trong
Phương thức vòng đời onStop()
trên API cấp 24 trở lên hoặc onPause()
trên API cấp 23 trở xuống. Đối với người chơi ở trong Service
, bạn có thể
hãy phát hành trong onDestroy()
.
Quản lý chế độ phát bằng một phiên phát nội dung nghe nhìn
Trên Android, phiên phát nội dung đa phương tiện cung cấp cách chuẩn hoá để tương tác với nội dung nghe nhìn người chơi xuyên giới hạn của quy trình. Kết nối một phiên nội dung nghe nhìn với trình phát của bạn cho phép bạn quảng cáo việc phát nội dung nghe nhìn bên ngoài và nhận phát lại các lệnh từ nguồn bên ngoài, chẳng hạn như để tích hợp với các nút điều khiển nội dung nghe nhìn của hệ thống trên thiết bị di động và các thiết bị lớn màn hình thiết bị.
Để sử dụng phiên phát nội dung nghe nhìn, hãy thêm phần phụ thuộc vào mô-đun Phiên Media3:
implementation "androidx.media3:media3-session:1.4.0"
Tạo một phiên nội dung nghe nhìn
Bạn có thể tạo MediaSession
sau khi khởi tạo trình phát như sau:
Kotlin
val player = ExoPlayer.Builder(context).build() val mediaSession = MediaSession.Builder(context, player).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build(); MediaSession mediaSession = new MediaSession.Builder(context, player).build();
Media3 tự động đồng bộ hoá trạng thái của Player
với trạng thái của
MediaSession
Cách này hoạt động với mọi cách triển khai Player
, bao gồm
ExoPlayer
, CastPlayer
hoặc
triển khai tuỳ chỉnh.
Cấp quyền kiểm soát cho các ứng dụng khách khác
Ứng dụng khách có thể triển khai trình điều khiển nội dung nghe nhìn
để điều khiển chế độ phát phiên phát nội dung đa phương tiện. Để nhận những yêu cầu này, hãy đặt
callback khi
tạo MediaSession
của bạn.
Khi bộ điều khiển sắp kết nối với phiên phát nội dung nghe nhìn của bạn,
onConnect()
được gọi. Bạn có thể sử dụng ControllerInfo
được cung cấp
để quyết định có chấp nhận hay không
hoặc từ chối
yêu cầu. Hãy xem ví dụ về việc này trong ứng dụng minh hoạ Phiên Media3.
Sau khi kết nối, bộ điều khiển có thể gửi lệnh phát đến phiên này. Chiến lược phát hành đĩa đơn
sau đó uỷ quyền các lệnh đó cho người chơi. Phát và danh sách phát
các lệnh được xác định trong giao diện Player
sẽ được tự động xử lý bởi
phiên hoạt động.
Các phương thức gọi lại khác cho phép bạn xử lý, chẳng hạn như yêu cầu
các lệnh phát tuỳ chỉnh
và sửa đổi danh sách phát. Các lệnh gọi lại này cũng tương tự như đối tượng ControllerInfo
. Vì vậy, bạn
có thể xác định kiểm soát quyền truy cập trên cơ sở từng yêu cầu.
Phát nội dung nghe nhìn trong nền
Ví dụ: để tiếp tục phát nội dung nghe nhìn khi ứng dụng của bạn không chạy ở nền trước
để phát nhạc, sách nói hoặc podcast ngay cả khi người dùng không có ứng dụng của bạn
mở, thì Player
và MediaSession
của bạn phải được gói gọn trong một
dịch vụ trên nền trước. Media3 cung cấp
Giao diện MediaSessionService
cho mục đích này.
Triển khai MediaSessionService
Tạo một lớp mở rộng MediaSessionService
và tạo thực thể của
MediaSession
trong phương thức vòng đời onCreate()
.
Kotlin
class PlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null // Create your Player and MediaSession in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, player).build() } // Remember to release the player and media session in onDestroy override fun onDestroy() { mediaSession?.run { player.release() release() mediaSession = null } super.onDestroy() } }
Java
public class PlaybackService extends MediaSessionService { private MediaSession mediaSession = null; @Override public void onCreate() { super.onCreate(); ExoPlayer player = new ExoPlayer.Builder(this).build(); mediaSession = new MediaSession.Builder(this, player).build(); } @Override public void onDestroy() { mediaSession.getPlayer().release(); mediaSession.release(); mediaSession = null; super.onDestroy(); } }
Trong tệp kê khai, lớp Service
có ý định MediaSessionService
lọc và yêu cầu quyền FOREGROUND_SERVICE
để chạy nền trước
dịch vụ:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Cuối cùng, trong lớp bạn đã tạo, hãy ghi đè phương thức onGetSession()
để kiểm soát
quyền truy cập của máy khách vào phiên phát nội dung đa phương tiện của bạn. Trả về một MediaSession
để chấp nhận
yêu cầu kết nối hoặc trả về null
để từ chối yêu cầu.
Kotlin
// This example always accepts the connection request override fun onGetSession( controllerInfo: MediaSession.ControllerInfo ): MediaSession? = mediaSession
Java
@Override public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) { // This example always accepts the connection request return mediaSession; }
Kết nối với giao diện người dùng
Giờ đây, phiên phát nội dung đa phương tiện của bạn nằm trong Service
tách biệt với Activity
hoặc
Fragment
là nơi chứa giao diện người dùng trình phát của bạn, bạn có thể sử dụng MediaController
để liên kết
chúng với nhau. Trong phương thức onStart()
của Activity
hoặc Fragment
với
Giao diện người dùng, tạo SessionToken
cho MediaSession
, sau đó sử dụng SessionToken
để tạo MediaController
. Quá trình tạo MediaController
diễn ra
một cách không đồng bộ.
Kotlin
override fun onStart() { val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java)) val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync() controllerFuture.addListener( { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()) }, MoreExecutors.directExecutor() ) }
Java
@Override public void onStart() { SessionToken sessionToken = new SessionToken(this, new ComponentName(this, PlaybackService.class)); ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(this, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()); }, MoreExecutors.directExecutor()) }
MediaController
triển khai giao diện Player
, vì vậy, bạn có thể sử dụng cùng một giao diện
các phương thức như play()
và pause()
để điều khiển quá trình phát. Tương tự với từ khoá khác
thành phần, hãy nhớ phát hành MediaController
khi nó không được sử dụng nữa
cần thiết, chẳng hạn như phương thức vòng đời onStop()
của Activity
, bằng cách gọi
MediaController.releaseFuture()
.
Đăng thông báo
Bạn phải sử dụng dịch vụ trên nền trước để phát hành thông báo khi đang hoạt động. Đáp
MediaSessionService
sẽ tự động tạo một
MediaStyle
thông báo cho
bạn dưới dạng MediaNotification
.
Để cung cấp thông báo tuỳ chỉnh, hãy tạo một
MediaNotification.Provider
với DefaultMediaNotificationProvider.Builder
hoặc bằng cách tạo một hoạt động triển khai tuỳ chỉnh giao diện của nhà cung cấp. Thêm
cho MediaSession
của bạn bằng
setMediaNotificationProvider
.
Quảng cáo thư viện nội dung
MediaLibraryService
được xây dựng dựa trên MediaSessionService
bằng cách cho phép ứng dụng
để duyệt qua nội dung nghe nhìn do ứng dụng của bạn cung cấp. Ứng dụng khách triển khai một
MediaBrowser
để tương tác
bằng MediaLibraryService
của bạn.
Việc triển khai MediaLibraryService
cũng tương tự như triển khai
MediaSessionService
, ngoại trừ trong onGetSession()
, bạn nên trả về một giá trị
MediaLibrarySession
thay vì MediaSession
. So với
MediaSession.Callback
, MediaLibrarySession.Callback
bao gồm thêm
các phương thức cho phép ứng dụng trình duyệt điều hướng đến nội dung do
dịch vụ thư viện của Google.
Tương tự như MediaSessionService
, hãy khai báo MediaLibraryService
trong
tệp kê khai và yêu cầu quyền FOREGROUND_SERVICE
để chạy nền trước
dịch vụ:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Ví dụ ở trên bao gồm một bộ lọc ý định cho cả MediaLibraryService
và để tương thích ngược, MediaBrowserService
cũ. Chiến lược phát hành đĩa đơn
bộ lọc ý định bổ sung cho phép các ứng dụng khách sử dụng API MediaBrowserCompat
để nhận ra Service
của bạn.
MediaLibrarySession
cho phép bạn phân phát thư viện nội dung dưới dạng cây
cấu trúc với một căn bậc MediaItem
. Mỗi MediaItem
trong cây này có thể có
số lượng nút con MediaItem
bất kỳ. Bạn có thể phân phát một gốc khác hoặc
cây khác nhau, dựa trên yêu cầu của ứng dụng khách. Ví dụ: cái cây mà bạn
quay lại một khách hàng tìm kiếm danh sách các mục nội dung đa phương tiện được đề xuất có thể chỉ
chứa MediaItem
gốc và một cấp duy nhất của các nút con MediaItem
,
trong khi cây mà bạn quay lại một ứng dụng khách khác có thể biểu thị
thư viện nội dung hoàn chỉnh.
Đang tạo một MediaLibrarySession
MediaLibrarySession
mở rộng API MediaSession
để thêm API duyệt nội dung. So với
Lệnh gọi lại MediaSession
,
lệnh gọi lại MediaLibrarySession
sẽ thêm các phương thức như:
onGetLibraryRoot()
khi ứng dụng yêu cầuMediaItem
gốc của cây nội dungonGetChildren()
khi ứng dụng yêu cầu phần tử con củaMediaItem
trong cây nội dungonGetSearchResult()
khi khách hàng yêu cầu kết quả tìm kiếm từ cây nội dung cho một truy vấn
Các phương thức gọi lại phù hợp sẽ bao gồm LibraryParams
đối tượng có các tín hiệu bổ sung về loại cây nội dung mà ứng dụng khách
quan tâm.