Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Tạo một Ứng dụng Phát nhạc trên Android: Điều khiển Phát nhạc

by
Difficulty:BeginnerLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Chúng ta đang xây dựng một ứng dụng nghe nhạc đơn giản cho Android trong loạt bài này. Đến lúc này, chúng ta đã trình bày một danh sách các bài hát trên thiết bị và cho phép người dùng lựa chọn từ đó, bắt đầu phát bằng cách sử dụng lớp MediaPlayer bên trong một lớp Service. Trong phần cuối cùng của loạt bài này, chúng ta sẽ cho phép người dùng điều khiển việc phát nhạc, bao gồm chuyển đến bài hát tiếp theo và bài trước đó, tua nhanh, quay lại, phát, tạm dừng và chuyển đến một đoạn cụ thể trong bài hát. Chúng ta cũng sẽ hiển thị một thông báo trong quá trình phát để người dùng có thể quay trở lại trình phát nhạc sau khi sử dụng các ứng dụng khác.

Giới thiệu

Chức năng điều khiển phát nhạc sẽ được cài đặt bằng cách sử dụng lớp MediaController, trong đó một đối tượng SeekBar hiển thị tiến trình phát cũng như cho phép người dùng chuyển đến các đoạn cụ thể trong một bài hát. Chúng ta sẽ sử dụng các lớp NotificationPendingIntent để hiển thị tiêu đề bài hát hiện đang phát và cho phép người dùng quay trở lại ứng dụng.

Đây là hình ảnh minh hoạ ứng dụng hoàn chỉnh:

Android Music Player

Sau loạt bài này, chúng ta cũng sẽ khám phá các chức năng liên quan mà bạn có thể muốn sử dụng để nâng cao ứng dụng nghe nhạc. Điều này sẽ bao gồm phát video, stream nhạc trực tuyến, quản lý âm thanh và trình bày bài nhạc theo nhiều cách khác nhau.

1. Tạo một Controller

Bước 1

Mở lớp Activity chính của bạn và thêm câu lệnh import sau đây:

Mở rộng dòng code khai báo lớp như sau, để chúng ta có thể sử dụng lớp Activity để điều khiển phát nhạc:

Di chuyển chuột lên trên tên lớp và chọn Add unimplemented methods. Eclipse sẽ thêm các phương pháp thức nhau để điều khiển phát nhạc, chúng ta sẽ từ từ điều chỉnh khi chúng ta tiếp tục bài hướng dẫn.

Bước 2

Lớp MediaController trình bày một widget tiêu chuẩn với các nút play/pause, rewind, fast-forward, và skip (previous/next) bên trong nó. Widget cũng đồng thời chứa một seekbar, được cập nhật khi bài hát được phát và chứa văn bản cho biết thời lượng của bài hát và đoạn bài hát hiện tại. Từ đó chúng ta có thể cấu hình các chi tiết của các điều khiển, chúng ta sẽ cài đặt một lớp thừa kế nó. Thêm một lớp mới vào dự án của bạn, đặt tên nó là MusicController. Trong Eclipse, chọn android.widget.MediaController làm lớp cha của nó.

Thêm nội dung sau đây vào lớp:

Bạn có thể điều chỉnh lớp MediaController theo nhiều cách khác nhau. Tất cả những gì chúng ta muốn làm là ngăn nó tự ẩn sau ba giây bằng cách override phương thức hide.

Mẹo: Bạn có thể cần phải tinh chỉnh theme mà ứng dụng của bạn sử dụng để đảm bảo rằng văn bản trên controller có thể được nhìn thấy rõ ràng.

Bước 3

Quay lại lớp Activity chính của bạn, thêm một biến đối tượng mới:

Chúng ta sẽ thiết lập controller nhiều lần trong vòng đời của ứng dụng, vì vậy, hãy làm điều đó bằng phương thức trợ giúp. Thêm đoạn code sau vào lớp Activity của bạn:

Bên trong phương thức, khởi tạo controller:

Bạn có thể cấu hình các khía cạnh khác nhau của đối tượng MediaController. Ví dụ, chúng ta sẽ cần phải xác định điều gì sẽ xảy ra khi người dùng nhấn các nút previous/next. Sau khi khởi tạo controller hãy thiết lập các click listener này:

Chúng ta sẽ cài đặt playNextplayPrev sau ít giây nữa, do đó, chỉ cần bỏ qua lỗi lúc này. Vẫn bên trong phương thức setController, thiết lập controller để làm việc trên trình phát nhạc trong ứng dụng, với anchor view chỉ đến danh sách mà chúng ta đã thêm vào layout:

Trở lại onCreate, hãy gọi phương thức:

Chúng ta cũng sẽ gọi nó sau này ở nơi khác trong lớp.

2. Cài đặt Điều khiển Phát nhạc

Bước 1

Hãy nhớ rằng việc phát nhạc xảy ra trong lớp Service, nhưng giao diện người dùng đến từ lớp Activity. Trong hướng dẫn trước, chúng ta đã ràng buộc đối tượng Activity với đối tượng Service, để chúng ta có thể điều khiển phát nhạc từ giao diện người dùng. Các phương thức trong lớp Activity mà chúng ta thêm vào để cài đặt giao diện MediaPlayerControl sẽ được gọi khi người dùng cố gắng điều khiển phát nhạc. Chúng ta sẽ cần lớp Service để tác động đến control này, vì vậy hãy mở lớp Service của bạn ngay bây giờ để bổ sung thêm một vài phương thức cho nó:

Các phương thức này áp dụng cho các chức năng điều khiển phát nhạc tiêu chuẩn mà người dùng mong muốn.

Bước 2

Bây giờ hãy thêm các phương thức vào lớp Service để chuyển đến bài hát tiếp theo và trước đó. Bắt đầu với hàm chuyển đến bài trước:

Chúng ta sẽ giảm giá trị biến chỉ mục của bài hát, kiểm tra xem chúng ta có vượt phạm vi của danh sách không và gọi phương thức playSong mà chúng ta đã thêm vào. Bây giờ thêm phương thức để chuyển đến bài tiếp theo:

Phương thức này tương tự như phương thức để phát bài hát trước đó tại thời điểm này, nhưng chúng ta sẽ sửa đổi phương thức này sau để cài đặt chức năng trộn bài hát.

Bước 3

Bây giờ chuyển trở lại lớp Activity để chúng ta có thể sử dụng các phương thức này. Đầu tiên, thêm các phương thức mà chúng ta gọi khi chúng ta thiết lập controller:

Chúng ta gọi phương thức mà chúng ta đã thêm vào lớp Service. Chúng ta sẽ thêm code vào các phương thức này sau để xử lý các tình huống cụ thể. Bây giờ hãy chuyển sang các phương thức của giao diện MediaPlayerControl, sẽ được hệ thống gọi trong quá trình phát và khi người dùng tương tác với các điều khiển. Những phương thức này sẽ có trong lớp Activity của bạn, vì vậy chúng ta sẽ chỉ thay đổi cài đặt của chúng.

Bắt đầu bằng phương thức canPause, thiết lập nó thành true:

Bây giờ thực hiện tương tự đối với phương thức canSeekBackwardcanSeekForward:

Bạn có thể để nguyên phương thức getAudioSessionIdgetBufferPercentage. Sửa phương thức getCurrentPosition như sau:

Các điều kiện kiểm tra là để tránh những ngoại lệ khác nhau có thể xảy ra khi sử dụng lớp MediaPlayerMediaController. Nếu bạn cố gắng nâng cấp ứng dụng bằng bất cứ cách nào, có thể bạn sẽ thấy rằng bạn cần thực hiện các bước như vậy vì các lớp để phát nhạc sinh ra rất nhiều ngoại lệ. Lưu ý rằng chúng ta gọi phương thức getPosn của lớp Service.

Sửa đổi phương thức getDuration tương tự như:

Thay đổi phương thức isPlaying bằng cách gọi phương thức isPng của lớp Service:

Thực hiện tương tự đối với các phương thức pause, seekTostart:

3. Xử lý khi Người dùng Điều hướng Trở lại Ứng dụng

Bước 1

Hãy nhớ rằng chúng ta sẽ tiếp tục phát nhạc ngay cả khi người dùng điều hướng ra khỏi ứng dụng. Để tạo điều kiện thuận lợi cho việc này, chúng ta sẽ hiển thị thông báo cho biết tiêu đề của bài hát đang được phát. Khi nhấp vào thông báo sẽ đưa người dùng quay trở lại ứng dụng. Quay trở lại lớp Service của bạn và thêm các import sau đây:

Bây giờ di chuyển đến phương thức onPrepared, trong đó chúng ta hiện chỉ cần bắt đầu phát nhạc. Sau khi gọi player.start(), Thêm code sau đây:

Tiếp theo chúng ta sẽ thêm các biến còn bị thiếu. Lớp PendingIntent sẽ đưa người dùng trở lại lớp Activity chính khi người dùng chọn thông báo. Thêm các biến cho tên bài hát và ID của thông báo ở phía trên cùng của lớp:

Bây giờ chúng ta cần thiết lập tiêu đề bài hát, trong phương thức playSong, sau dòng mà chúng ta truy vấn bài hát từ danh sách (Song playSong = songss.get(songPosn);):

Vì chúng ta đã gọi setForeground trên thông báo, nên chúng ta phải chắc chắn rằng chúng ta sẽ dừng nó khi đối tượng Service bị hủy. Override phương thức sau:

4. Phát Ngẫu nhiên

Bước 1

Hãy nhớ rằng chúng ta đã thêm một nút ngẫu nhiên, do đó hãy cài đặt nó ngay bây giờ. Đầu tiên thêm biến đối tượng mới vào lớp Service:

Khởi tạo trình tạo số ngẫu nhiên trong onCreate:

Bây giờ thêm một phương thức để thiết lập cờ hiệu xáo trộn:

Chúng ta chỉ đơn giản là bật/tắt thiết lập xáo trộn. Chúng ta sẽ kiểm tra cờ hiệu này khi người dùng chuyển qua bài hát tiếp theo hoặc khi một bản nhạc kết thúc và bài hát tiếp theo bắt đầu. Sửa đổi phương thức playNext như sau:

Nếu cờ hiệu xáo trộn được bật, chúng ta chọn một bài hát mới từ danh sách một cách ngẫu nhiên, đảm bảo chúng ta không lặp lại bài hát được phát trước đó. Bạn có thể nâng cao chức năng này bằng cách sử dụng hàng đợi các bài hát và không cho bất kỳ bài hát nào được lặp lại cho đến khi tất cả các bài hát được phát.

Bước 2

Bây giờ chúng ta có thể cho phép người dùng chọn chức năng phát ngẫu nhiên. Quay trở lại lớp Activity chính của bạn trong phương thức onOptionsItemSelected, sửa phần thao tác trộn để gọi phương thức mới mà chúng ta đã thêm vào lớp Service:

Bây giờ người dùng sẽ có thể sử dụng phần tử menu để bật/tắt chức năng trộn bài hát.

5. Dọn dẹp

Bước 1

Chúng ta gần như đã hoàn tất, nhưng vẫn cần thêm một vài thao tác xử lý những thay đổi nhất định, chẳng hạn như người dùng rời khỏi ứng dụng hoặc dừng phát nhạc. Trong lớp Activity của bạn, hãy thêm một vài biến đối tượng:

Chúng ta sẽ sử dụng các thông số này để đáp ứng đối với việc người dùng quay trở lại ứng dụng sau khi rời khỏi nó và tương tác với các nút điều khiển khi việc phát nhạc bị dừng. Override onPause để thiết lập một trong những cờ hiệu sau:

Bây giờ override onResume:

Việc này sẽ đảm bảo các nút điều khiển hiển thị khi người dùng quay trở lại ứng dụng. Override onStop để ẩn nó:

Bước 2

Nếu người dùng tương tác với các nút điều khiển trong việc phát nhạc bị tạm dừng, thì đối tượng MediaPlayer có thể có những hành vi bất định. Để khắc phục với vấn đề này, chúng ta sẽ thiết lập và sử dụng cờ hiệu playbackPaused. Trước tiên hãy sửa đổi các phương thức playNextplayPrev:

Chúng ta reset các nút điều khiển và cập nhật cờ hiệu playbackPaused khi tạm dừng. Bây giờ hãy thực hiện các thay đổi tương tự với phương thức playSong:

Bây giờ thiết lập playbackPaused thành true trong phương thức pause:

Khi bạn làm việc với các lớp MediaPlayerMediaController, bạn sẽ thấy rằng kiểu xử lý này là một yêu cầu cần thiết để tránh phát sinh lỗi. Ví dụ, đôi khi bạn sẽ thấy thanh seekbar không cập nhật cho đến khi người dùng tương tác với nó. Các nguồn tài nguyên này hành xử khác nhau ở các API level khác nhau, vì vậy hãy kiểm tra kỹ lưỡng và tinh chỉnh là điều cần thiết nếu bạn có kế hoạch phát hành ứng dụng của mình ra công chúng. Ứng dụng mà chúng ta đang tạo ra trong loạt bài này thật sự chỉ là ứng dụng cơ bản.

Bước 3

Hãy thực hiện một số bước cuối cùng để làm cho ứng dụng hoạt động một cách trơn tru. Quay trở lại lớp Service, sửa phương thức onError:

Chúng ta chỉ cần reset lại trình phát nhạc, nhưng bạn có thể nâng cao cách tiếp cận này.

Phương thức onCompletion sẽ kích hoạt khi một bản nhạc kết thúc, bao gồm cả trường hợp người dùng đã chọn bài hát mới hoặc chuyển qua bài tiếp theo/trước đó cũng như khi khi phát xong bài hát. Trong trường hợp thứ hai, chúng ta cần tiếp tục phát hát kế tiếp. Để làm điều này, chúng ta cần phải kiểm tra trạng thái phát nhạc. Sửa phương thức onCompletion của bạn:

Chúng ta gọi phương thức playNext nếu bài hát hiện tại đã kết thúc.

Mẹo: Để đảm bảo rằng ứng dụng của bạn không đụng độ với các service âm thanh khác trên thiết bị của người dùng, bạn nên cải tiến nó để xử lý Audio Focus một cách trơn tru. Làm cho lớp Service cài đặt giao diện AudioManager.OnAudioFocusChangeListener. Trong phương thức onCreate, tạo một đối tượng của lớp AudioManager và gọi requestAudioFocus trên nó. Cuối cùng, cài đặt phương thức onAudioFocusChange trong lớp của bạn để kiểm soát điều gì sẽ xảy ra khi ứng dụng dành được hoặc mất Audio Focus. Xem phần Audio Focus trong Hướng dẫn dành cho nhà phát triển để biết thêm chi tiết.

Ứng dụng cơ bản của chúng ta đã hoàn chỉnh! Tuy nhiên, bạn cũng cần phải thực hiện các cải tiến bổ sung để làm cho nó hoạt động đáng tin cậy trên các thiết bị người dùng và các cấp độ API khác nhau. Các điều khiển nên xuất hiện bất cứ khi nào bạn tương tác với ứng dụng.

Android Music Player

Thông báo sẽ cho phép bạn quay lại ứng dụng khi tiếp tục phát.

Android Music Player

Phần tóm tắt

Bây giờ chúng ta đã hoàn tất trình phát nhạc cơ bản dành cho Android. Có nhiều cách để bạn có thể nâng cao ứng dụng, chẳng hạn như hỗ trợ thêm tream nhạc, video, audio focus và cung cấp các phương pháp khác nhau để tương tác với các bài hát trên thiết bị. Chúng ta sẽ xem xét một số cải tiến trong các hướng dẫn sau này, khái quát rõ cách bạn có thể thêm chúng vào ứng dụng hoặc vào các dự án khác. Trong lúc chờ đợi, hãy xem liệu bạn có thể mở rộng ứng dụng để xây dựng các tính năng bổ sung hay cải thiện độ tin cậy trên các thiết bị khác nhau hay không. Xem phần Media Playback trong Hướng dẫn dành cho Nhà phát triển Android để tìm hiểu thêm.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.