Tài liệu này giới thiệu các khái niệm cơ bản mà bạn nên nắm rõ trước khi làm việc với Media Player.
Các lớp học về âm thanh và video
Các lớp sau đây phát âm thanh và video trong khung Android:
MediaPlayer: Lớp này là API chính để phát âm thanh và video.AudioManager: Lớp này quản lý các nguồn âm thanh và đầu ra âm thanh trên một thiết bị.
Nội dung khai báo trong tệp kê khai
Trước khi bắt đầu phát triển ứng dụng bằng MediaPlayer, hãy đảm bảo rằng tệp kê khai của bạn có các khai báo thích hợp để cho phép sử dụng các tính năng liên quan.
Quyền truy cập Internet: Nếu đang dùng MediaPlayer để phát trực tuyến nội dung dựa trên mạng, thì ứng dụng của bạn phải yêu cầu quyền truy cập mạng.
<uses-permission android:name="android.permission.INTERNET" />Quyền WakeLock: Nếu ứng dụng trình phát của bạn cần ngăn màn hình giảm độ sáng hoặc bộ xử lý chuyển sang chế độ ngủ, hoặc sử dụng phương thức
MediaPlayer.setScreenOnWhilePlaying(boolean)hoặcMediaPlayer.setWakeMode(android.content.Context, int), thì bạn phải yêu cầu quyền này.<uses-permission android:name="android.permission.WAKE_LOCK" />
Sử dụng lớp MediaPlayer
Lớp MediaPlayer là một thành phần thiết yếu của khung đa phương tiện.
Một đối tượng thuộc lớp này có thể tìm nạp, giải mã và phát cả âm thanh và video mà không cần thiết lập nhiều. MediaPlayer hỗ trợ một số nguồn nội dung nghe nhìn, bao gồm:
- Tài nguyên địa phương
- URI nội bộ, chẳng hạn như URI mà bạn có thể lấy từ một Trình phân giải nội dung
- URL bên ngoài (phát trực tuyến)
Để biết danh sách các định dạng nội dung nghe nhìn mà Android hỗ trợ, hãy xem trang Các định dạng nội dung nghe nhìn được hỗ trợ.
Ví dụ về cách sử dụng nguồn âm thanh
Sau đây là ví dụ về cách phát âm thanh có sẵn dưới dạng tài nguyên thô cục bộ (được lưu trong thư mục res/raw/ của ứng dụng):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
Trong trường hợp này, tài nguyên "thô" là một tệp mà hệ thống không cố gắng phân tích theo bất kỳ cách cụ thể nào. Tuy nhiên, nội dung của tài nguyên này không được là âm thanh thô. Đó phải là một tệp nội dung nghe nhìn được mã hoá và định dạng đúng cách ở một trong các định dạng được hỗ trợ.
Sau đây là cách bạn có thể phát từ một URI có sẵn cục bộ trong hệ thống (ví dụ: URI mà bạn nhận được thông qua Trình phân giải nội dung):
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Java
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
Việc phát từ một URL từ xa bằng tính năng truyền trực tuyến HTTP sẽ diễn ra như sau:
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Java
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
Sử dụng tính năng chuẩn bị không đồng bộ để cải thiện hiệu suất
Hãy lưu ý đến hiệu suất khi bạn sử dụng MediaPlayer. Ví dụ: lệnh gọi đến prepare() có thể mất nhiều thời gian để thực thi, vì lệnh gọi này có thể liên quan đến việc tìm nạp và giải mã dữ liệu đa phương tiện. Vì vậy, giống như mọi phương thức có thể mất nhiều thời gian để thực thi, đừng bao giờ gọi phương thức này từ luồng giao diện người dùng của ứng dụng. Việc này khiến giao diện người dùng ngừng phản hồi cho đến khi phương thức trả về, điều này gây ra trải nghiệm người dùng kém và có thể gây ra lỗi ANR (Ứng dụng không phản hồi).
Để tránh làm treo luồng giao diện người dùng, hãy tạo một luồng khác để chuẩn bị MediaPlayer và thông báo cho luồng chính khi hoàn tất. Khung này cung cấp một cách thuận tiện để hoàn thành phương thức prepareAsync() cho việc thực hiện tác vụ này. Phương thức này bắt đầu chuẩn bị nội dung nghe nhìn ở chế độ nền và trả về ngay lập tức. Khi nội dung nghe nhìn chuẩn bị xong, phương thức onPrepared() của MediaPlayer.OnPreparedListener (được định cấu hình thông qua setOnPreparedListener()) sẽ được gọi.
Tìm hiểu thêm
Jetpack Media3 là giải pháp được đề xuất để phát nội dung nghe nhìn trong ứng dụng của bạn. Đọc thêm về giải pháp này.
Những trang này đề cập đến các chủ đề liên quan đến việc ghi, lưu trữ và phát âm thanh cũng như video: