Trong bài viết về cách sử dụng đa phương tiện trong ứng dụng Android này, chúng tôi sẽ xem xét hai loại chính trong khuôn khổ phương tiện truyền thông - MediaPlayer(API chính để chơi âm thanh và video) và AudioManager(Quản lý nguồn âm thanh và âm thanh đầu ra trên một thiết bị) và sử dụng chúng trong việc tạo ra một máy nghe nhạc đơn giản cho phép người sử dụng duyệt và chơi các nội dung từ SoundCloud.
Trong Android, đa phương tiện được hỗ trợ chơi tốt cho nhiều loại phương diện truyền thông phổ biến, cho phép bạn tích hợp âm thanh, video và hình ảnh phù hợp vào ứng dụng khi bạn học lập trình android. Bạn có thể chơi nhạc bằng âm thanh hoặc từ video từ các tập tin đa phương tiện truyền thông lưu trữ trong tài nguyên ứng dụng, từ các tập tin độc lập trong hệ thống tập tin hoặc từ một dòng dữ liệu qua sự kết nối mạng.
Bắt đầu
Như đã đề cập, các bạn sẽ được tạo ra một ứng dụng truy cập API SoundCloud, vì vậy đầu tiên bạn cần đăng ký một tài khoản trên cổng thông tin phát triển SoundCloud tại developers.soundcloud.com . Một khi bạn đã tạo một tài khoản hãy click vào Register và nó sẽ liên kết đến một trang mới.
![[Image: Music-Streaming-Android-1.png]](http://laptrinhandroid.net.vn/wp-content/uploads/2015/11/Music-Streaming-Android-1.png)
Trên màn hình sau, tên ứng dụng của bạn. Chúng tôi sẽ đặt tên SPPlayer ứng dụng của chúng tôi.
![[Image: Music-Streaming-Android-2.png]](http://laptrinhandroid.net.vn/wp-content/uploads/2015/11/Music-Streaming-Android-2.png)
Trên trang tiếp theo, bạn sẽ được hiển thị chi tiết của ứng dụng của bạn. Để lại các trang mở như bạn sẽ cần phải sao chép ID khách hàng hiển thị vào các ứng dụng Android.
Với thiết lập, bây giờ chúng ta sẽ tạo ra các ứng dụng Android. Tạo một dự án Android mới (tôi đang sử dụng Android Studio. Nếu bạn đang sử dụng Eclipse, một số bước thực hiện trong hướng dẫn sẽ khác nhau, ví dụ thêm thư viện. Bạn có thể tìm sự giúp đỡ trực tuyến về cách sử dụng Eclipse.).
Tạo một dự án mới và đặt tên cho SPPlayer ứng dụng. Đặt miền công ty của riêng bạn và nhấp vào Next. Trên màn hình tiếp theo, tôi rời SDK tối thiểu ở mặc định của API 15. Chọn mặc định Hoạt động Trống cài đặt trên màn hình tiếp theo và trên màn hình cuối cùng nhấn Finish.
Tiếp theo mở file build.gradle của ứng dụng của bạn và thêm gson, trang bị thêm và thư viện picasso.
![[Image: Music-Streaming-Android-3.png]](http://laptrinhandroid.net.vn/wp-content/uploads/2015/11/Music-Streaming-Android-3.png)
laptrinhandroid.net.vn
Thêm các phụ thuộc sau đây để các tập tin.
Code:
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.squareup.retrofit:retrofit:1.8.0'
compile 'com.squareup.picasso:picasso:2.4.0'
Tôi sẽ đi qua lý do tại sao chúng ta sử dụng ba thư viện như chúng ta tiến bộ thông qua các hướng dẫn.
Khi bạn thay đổi các tập tin build.gradle, một thông báo sẽ cho bạn biết rằng một Sync là cần thiết cho các IDE để làm việc một cách chính xác. Nhấp chuột vào Sync Now ở bên phải của thông báo đó. Gradle sẽ lấy phụ thuộc thêm vào. Bạn sẽ cần một kết nối internet cho Gradle để lấy chúng.
Để bắt đầu, đầu tiên tạo ra một class mà sẽ tổ chức một số dữ liệu cấu hình như ID của khách hàng và URL cơ sở cho các thiết bị đầu cuối SoundCloud. Tạo một lớp có tên Config và sửa đổi nó như hiển thị
Code:
package com.echessa.spplayer;
/**
* Created by echessa on 6/17/15.
*/
public class Config {
public static final String CLIENT_ID = "YOUR_CLIENT_ID";
public static final String API_URL = "https://api.soundcloud.com";
}
Thay SoundCloud ID ứng dụng khách hàng của riêng bạn. Hằng API_URL giữ URL cơ sở cho thiết bị đầu cuối API như đã nêu trong SoundCloud HTTP API Reference này.
Tiếp theo, tạo một đối tượng theo dõi mà sẽ giữ dữ liệu cho mỗi tập tin âm thanh lấy từ SoundCloud. Tạo một lớp được gọi là Track và thêm các lĩnh vực và phương thức getter sau.
Code:
package com.echessa.spplayer;
import com.google.gson.annotations.SerializedName;
/**
* Created by echessa on 6/17/15.
*/
public class Track {
@SerializedName("title")
private String mTitle;
@SerializedName("id")
private int mID;
@SerializedName("stream_url")
private String mStreamURL;
@SerializedName("artwork_url")
private String mArtworkURL;
public String getTitle() {
return mTitle;
}
public int getID() {
return mID;
}
public String getStreamURL() {
return mStreamURL;
}
public String getArtworkURL() {
return mArtworkURL;
}
}
>> Khóa học lập trình android cơ bản tại hà nội !
Trong đoạn mã trên, chúng tôi tạo ra bốn lĩnh vực mà sẽ giữ các dữ liệu theo dõi chúng ta quan tâm. Để biết liệu một cuộc gọi đến các API sẽ tiếp nhận, sử dụng các URL sau đó nạp dữ liệu một ca khúc duy nhất trong định dạng JSON.
Code:
http://api.soundcloud.com/tracks/13158665.json?client_id=YOUR_CLIENT_ID
Chú ý các chú thích SerializedName trên từng lĩnh vực và việc nhập khẩu gson. Các thư viện Gson là một thư viện mã nguồn mở từ Google mà tuần tự và deserializes đối tượng Java (và từ) JSON. Ở trên, nó sẽ lấy JSON lấy và bản đồ cho các lĩnh vực của đối tượng, nếu không bạn sẽ phải viết rất nhiều mã để lấy dữ liệu từ JSON và tạo ra một đối tượng theo dõi với nó. Đây là lý do tại sao chúng ta không sử dụng bất kỳ setters trong lớp, Gson sẽ thiết lập các lĩnh vực tự động khi một đối tượng Track được tạo ra.
Lưu ý: Tôi sẽ không được đề cập đến việc nhập khẩu cần thiết sau mỗi lần thêm mã. Nếu một nhập khẩu là cần thiết, các IDE sẽ nhắc bạn để thêm nó, và bạn cũng có thể thiết lập các IDE để nó giải quyết nhập khẩu tự động. Tôi sẽ chỉ đề cập đến nhập khẩu nếu có một cuộc xung đột nhập để cho bạn biết những lớp quyền sử dụng.
Mở tập tin AndroidManifest.xml và thêm các phép sau đây.
Code:
<uses-permission android:name="android.permission.INTERNET"/>
Tiếp theo, thêm một giao diện để các dự án được gọi là SCService. Sửa đổi nó như thể hiện.
Code:
package com.echessa.spplayer;
import java.util.List;
import retrofit.Callback;
import retrofit.http.GET;
import retrofit.http.Query;
/**
* Created by echessa on 6/18/15.
*/
public interface SCService {
@GET("/tracks?client_id=" + Config.CLIENT_ID)
public void getRecentTracks(@Query("created_at[from]") String date, Callback<List<Track>> cb);
}
Ở đây chúng ta sử dụng các thư viện Retrofit trong giao diện. Trang bị thêm một thư viện mã nguồn mở từ Square mà đơn giản hóa giao tiếp HTTP bằng cách chuyển các API từ xa vào khai báo, giao diện kiểu an. Phương pháp kê khai trên giao diện đại diện cho một điểm cuối API từ xa duy nhất. Chú thích mô tả cách thức các bản đồ vào một yêu cầu HTTP.
Các thư viện giúp tải các JSON hay XML dữ liệu từ một API web đơn giản. Một khi dữ liệu được tải về, nó được phân tách thành một Object Plain Old Java (POJO) mà phải được xác định cho mỗi tài nguyên trong các phản ứng.
Để kiểm tra điều này hoạt động diễn ra sau đây vào onCreate (Bundle) trong MainActivity.java sau khi cuộc gọi đến setContentView (R.layout.activity_main) ;.
Code:
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Config.API_URL).build();
SCService scService = restAdapter.create(SCService.class);
scService.getRecentTracks(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()), new Callback<List<Track>>() {
@Override
public void success(List<Track> tracks, Response response) {
Log.d(TAG, "First track title: " + tracks.get(0).getTitle());
}
@Override
public void failure(RetrofitError error) {
Log.d(TAG, "Error: " + error);
}
});
>> Khóa học lập trình php cơ bản tại hà nội !
Thêm thuộc tính vào class
Code:
private static final String TAG = "MainActivity";
Chạy ứng dụng và kiểm tra log. Bạn bên xem một dòng lệnh, nó sẽ hiện tiêu đề đầu tiên được lấy.
Trong đoạn mã trên lớp RestAdapter tạo ra một thực hiện các giao diện SCService. Mỗi cuộc gọi trên SCService tạo ra làm cho một yêu cầu HTTP tới máy chủ web từ xa.
Việc thực hiện ở trên không phải là cách tốt nhất để thực hiện các yêu cầu HTTP. Chúng tôi sẽ làm cho một số cuộc gọi đến máy chủ và sử dụng ở trên, chúng ta sẽ tạo ra một RestAdapter và SCService mỗi khi một yêu cầu được thực hiện và những người đang hoạt động đắt tiền, do đó hiệu suất tổng thể sẽ bị ảnh hưởng. Do đó chúng tôi sẽ sử dụng mẫu Singleton để các RestAdapter và SCService được tạo ra chỉ một lần và sử dụng bất cứ khi nào cần thiết. Thêm các lớp sau cho dự án.
Code:
package com.echessa.spplayer;
import retrofit.RestAdapter;
/**
* Created by echessa on 6/18/15.
*/
public class SoundCloud {
private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder().setEndpoint(Config.API_URL).build();
private static final SCService SERVICE = REST_ADAPTER.create(SCService.class);
public static SCService getService() {
return SERVICE;
}
}
Điều này tạo ra các bộ chuyển đổi phần còn lại và dịch vụ như chúng tôi đã làm trước đó, sau đó nó có chức năng đó sẽ trở lại các dịch vụ. Kể từ REST_ADAPTER và SERVICE là final và static, họ sẽ chỉ được tạo ra một lần và tái sử dụng mỗi lần một đối tượng SoundCloud được tạo ra.
Bây giờ bạn có thể sử dụng trong các đoạn mã chúng ta đặt trong onCreate(Bundle).
Code:
SCService scService = SoundCloud.getService();
scService.getRecentTracks(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()), new Callback<List<Track>>() {
@Override
public void success(List<Track> tracks, Response response) {
Log.d(TAG, "First track title: " + tracks.get(0).getTitle());
}
@Override
public void failure(RetrofitError error) {
Log.d(TAG, "Error: " + error);
}
});
Bây giờ chúng ta có thể nhận được dữ liệu từ máy chủ, chúng ta cần tạo một danh sách sẽ hiển thị dữ liệu.
Thêm một tập tin bố trí bằng cách kích chuột phải vào thư mục Layout và chọn tập tin New -> Layout. Đặt tên nó là track_list_row và thêm phần sau đây để các tập tin track_list_row.xml.
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"
android:layout_width="match_parent"
android:layout_height="@dimen/row_height">
<ImageView
android:id="@+id/track_image"
android:layout_centerVertical="true"
android:padding="@dimen/image_padding"
android:layout_width="@dimen/image_size"
android:layout_height="@dimen/image_size"/>
<TextView
android:layout_centerVertical="true"
android:id="@+id/track_title"
android:layout_marginLeft="@dimen/activity_vertical_inner_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>
</RelativeLayout>
Trên đây tạo ra cách bố trí chúng tôi sẽ sử dụng cho mỗi hàng trong danh sách theo dõi. Chúng tôi sẽ đưa ra một hình ảnh của album art của theo dõi và tiêu đề của ca khúc.
Sửa đổi activity_main.xml như hình vẽ.
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/track_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
Thêm các dòng sau vào file dimen.xml. Không thay đổi bất kỳ giá trị nào trong file, chúng ta sẽ chit sử dụng chúng
Code:
<dimen name="row_height">72dp</dimen>
<dimen name="image_padding">4dp</dimen>
<dimen name="image_size">48dp</dimen>
<dimen name="activity_vertical_inner_margin">56dp</dimen>
Tiếp theo, tạo các bộ chuyển đổi tùy chỉnh sau đó sẽ được sử dụng để xem danh sách.
Code:
package com.echessa.spplayer;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.List;
/**
* Created by echessa on 6/18/15.
*/
public class SCTrackAdapter extends BaseAdapter {
private Context mContext;
private List<Track> mTracks;
public SCTrackAdapter(Context context, List<Track> tracks) {
mContext = context;
mTracks = tracks;
}
@Override
public int getCount() {
return mTracks.size();
}
@Override
public Track getItem(int position) {
return mTracks.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Track track = getItem(position);
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.track_list_row, parent, false);
holder = new ViewHolder();
holder.trackImageView = (ImageView) convertView.findViewById(R.id.track_image);
holder.titleTextView = (TextView) convertView.findViewById(R.id.track_title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleTextView.setText(track.getTitle());
// Trigger the download of the URL asynchronously into the image view.
Picasso.with(mContext).load(track.getArtworkURL()).into(holder.trackImageView);
return convertView;
}
static class ViewHolder {
ImageView trackImageView;
TextView titleTextView;
}
}
Các bộ chuyển đổi trên sử dụng các mẫu thiết kế ViewHolder đó cải thiện hiệu suất của một danh sách xem.
Khi di chuyển qua một ListView, mã của bạn có thể gọi findViewById() thường xuyên có thể làm chậm hiệu suất. Ngay cả khi Adapter trả về một view tăng cao để tái chế, bạn vẫn cần phải tìm các yếu tố và cập nhật chúng. Một cách khoảng sử dụng lặp lại findViewById() là sử dụng các mẫu thiết kế ViewHolder.
Một đối tượng ViewHolder cửa hàng mỗi lần xem thành phần bên trong các lĩnh vực thẻ của Layout, vì vậy bạn có thể ngay lập tức truy cập chúng mà không cần phải tìm họ nhiều lần.
Trong đoạn mã trên, chúng tôi tạo ra một lớp học để giữ tập hợp các quan điểm: static class ViewHolder. Sau đó, trong getView (int, View, ViewGroup) Chúng ta sẽ chuyển ViewHolder và lưu trữ nó bên trong bố trí. Sau này, mỗi lần xem bây giờ có thể được truy cập mà không cần nhìn lên, tiết kiệm chu kỳ bộ xử lý có giá trị.
Chúng tôi thiết lập các văn bản của hàng danh sách theo dõi là tiêu đề của bài hát và lấy hình ảnh của ca khúc bằng cách sử dụng thư viện Picasso. Các thư viện Picasso, cũng từ Square, là một tải hình ảnh và thư viện bộ nhớ đệm cho Android. Khác hơn so với tải và bộ nhớ đệm hình ảnh, bạn có thể làm một số biến đổi trên một hình ảnh với nó, giống như thiết lập kích thước và cây trồng. Bạn cũng có thể sử dụng nó để thiết lập một hình ảnh giữ chỗ đó sẽ hiển thị trong khi hình ảnh tải và một 'lỗi' hình ảnh sẽ hiển thị nếu tải không thành công. Trong đoạn mã trên, chúng ta sử dụng nó để tải các hình ảnh từ các url và đặt nó vào xem hình ảnh các danh sách theo dõi của hàng.
Trong MainActivity.java thêm các biến lớp sau:
Code:
private List<Track> mListItems;
private SCTrackAdapter mAdapter;
Tạo các thay đổi sau đây để onCreate(Bundle) và thêm các phương pháp loadTracks(List) hiển thị dưới đây.
Code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListItems = new ArrayList<Track>();
ListView listView = (ListView)findViewById(R.id.track_list_view);
mAdapter = new SCTrackAdapter(this, mListItems);
listView.setAdapter(mAdapter);
SCService scService = SoundCloud.getService();
scService.getRecentTracks(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()), new Callback<List<Track>>() {
@Override
public void success(List<Track> tracks, Response response) {
loadTracks(tracks);
}
@Override
public void failure(RetrofitError error) {
Log.d(TAG, "Error: " + error);
}
});
}
...
private void loadTracks(List<Track> tracks) {
mListItems.clear();
mListItems.addAll(tracks);
mAdapter.notifyDataSetChanged();
}
Trong đoạn mã trên, chúng tôi tạo ra một danh sách xem và một thể hiện của SCTrackAdapter và thiết lập nó như là bộ chuyển đổi giao diện của danh sách. Sau đó chúng tôi nhận được bài hát gần đây từ các API và gọi loadTracks(List) mà chúng ta thêm các bài hát vào danh sách mảng được sử dụng bởi các bộ chuyển đổi và thông báo cho các bộ chuyển đổi của sự thay đổi.
Chạy các ứng dụng và danh sách sẽ được tải với các bài hát gần đây từ SoundCloud và các album ảnh nghệ thuật sẽ hiển thị bên trái của danh sách. Đối với bài nhạc với không có album ảnh nghệ thuật, bạn có thể chỉ định một hình ảnh sẽ được hiển thị bằng Picasso. Tham khảo tài liệu để xem những gì khác các thư viện cung cấp.
Music Streaming Android 4
Khi bạn chọn một mục trong danh sách, không có gì xảy ra. Chúng tôi muốn các ca khúc được lựa chọn để được chơi.
Đầu tiên chúng ta sẽ thêm một thanh công cụ phía dưới cùng của màn hình mà sẽ hiển thị các bài hát được lựa chọn và kiểm soát để vui chơi và tạm dừng. Sửa đổi activity_main.xml như hình vẽ.
Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@+id/track_list_view"
android:layout_weight="100"
android:layout_width="match_parent"
android:layout_height="0dp"/>
<android.support.v7.widget.Toolbar
android:background="#333333"
android:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent"
android:layout_height="100dp">
<ImageView
android:id="@+id/selected_track_image"
android:layout_width="92dp"
android:layout_height="92dp"/>
<TextView
android:id="@+id/selected_track_title"
android:paddingLeft="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/player_control"
android:layout_gravity="right"
android:layout_width="@dimen/image_size"
android:layout_height="@dimen/image_size"/>
</android.support.v7.widget.Toolbar>
</LinearLayout>
Ở đây chúng ta thêm một thanh công cụ để bố trí mà được đặt ở dưới cùng của màn hình. Các thanh công cụ có một ImageView đó sẽ hiển thị các album ảnh nghệ thuật theo dõi, một TextView sẽ hiển thị tiêu đề của các ca khúc và một ImageView đó sẽ hiển thị chơi và tạm dừng các biểu tượng.
Trong MainActivity.java thêm các biến lớp sau.
Code:
private TextView mSelectedTrackTitle;
private ImageView mSelectedTrackImage;
Add the following into onCreate(Bundle) below the listView.setAdapter(mAdapter); statement.
mSelectedTrackTitle = (TextView)findViewById(R.id.selected_track_title);
mSelectedTrackImage = (ImageView)findViewById(R.id.selected_track_image);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Track track = mListItems.get(position);
mSelectedTrackTitle.setText(track.getTitle());
Picasso.with(MainActivity.this).load(track.getArtworkURL()).into(mSelectedTrackImage);
}
});
Điều này đặt ra nhìn hình ảnh của thanh công cụ và xem văn bản với dữ liệu theo dõi được lựa chọn. Chạy các ứng dụng và chọn một bản nhạc từ danh sách, các thanh công cụ sẽ cập nhật với các thông tin của bài hát.
Music Streaming Android 5
Bây giờ cho bước cuối cùng của việc chơi các bản nhạc được chọn. Thêm dòng sau vào lớp.
Code:
private MediaPlayer mMediaPlayer;
private ImageView mPlayerControl;
Sau đó, thêm lệnh sau đây sau khi gán biến mSelectedTrackImage.
mCode:
PlayerControl = (ImageView)findViewById(R.id.player_control);
Thêm dòng sau vào onCreate (Bundle) sau khi setContentView (R.layout.activity_main); câu lệnh :
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
togglePlayPause();
}
});
Ở phía trên, chúng tôi nhanh chóng mMediaPlayer và thiết lập kiểu dòng âm thanh cho nó. Các lớp MediaPlayer có thể được sử dụng để kiểm soát phát lại audio/video. Sau đó chúng ta đăng ký một callback sẽ được gọi khi các nguồn phương tiện truyền thông đã sẵn sàng để phát lại. Việc gọi lại làm cho một cuộc gọi đến các chức năng dưới đây.
Thêm các chức năng sau vào trong lớp.
Code:
private void togglePlayPause() {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
mPlayerControl.setImageResource(R.drawable.ic_play);
} else {
mMediaPlayer.start();
mPlayerControl.setImageResource(R.drawable.ic_pause);
}
}
Trên đây làm một kiểm tra xem nếu người chơi phương tiện truyền thông đang phát. Nếu vậy, dừng nó và thay đổi các biểu tượng điều khiển máy nghe nhạc vào biểu tượng Play. Nếu người chơi phương tiện truyền thông đã không được chơi, nó bắt đầu chơi và thay đổi các biểu tượng vào biểu tượng Pause.
Để có được các biểu tượng được sử dụng, tải về các thư mục tài sản và dán các thư mục drawable vào thư mục res của dự án của bạn. Các biểu tượng từ vật liệu thiết kế biểu tượng lưu trữ của Google.
Tiếp thêm phương pháp onItemClick(AdapterView, View, int, long) sau đây để xem danh sách của onItemClick sau khi tuyên bố rằng bộ ảnh của thanh công cụ sử dụng Picasso.
Code:
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
try {
mMediaPlayer.setDataSource(track.getStreamURL() + "?client_id=" + Config.CLIENT_ID);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
Khi một mục được lựa chọn, kiểm tra được thực hiện để xem nếu các cầu thủ đang chơi. Nếu một ca khúc đã được chơi, nó dừng lại và các phương tiện truyền thông sẽ được reset trước các bản nhạc được chọn có thể được chơi. Tiếp theo chúng ta thiết lập nguồn dữ liệu các phương tiện truyền thông máy nghe nhạc, mà là URL đầy đủ của các tập tin âm thanh mà xem trực tiếp. Sau đó chúng tôi chuẩn bị các cầu thủ để phát lại không đồng bộ. Bạn có thể có thể gọi prepare() hoặc prepareAsync(), nhưng đối với dòng bạn nên gọi prepareAsync() trả về ngay lập tức, thay vì ngăn chặn cho đến khi đủ dữ liệu đệm. Đối với các tập tin, đó là OK để gọi prepare() mà khối cho đến khi MediaPlayer đã sẵn sàng để phát lại.
Sau đó, thêm những điều sau đây sau khi tuyên bố rằng khởi mPlayerControl.
Code:
mPlayerControl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
togglePlayPause();
}
});
Các trên đặt một nhấp chuột vào nghe để xem hình ảnh người chơi điều khiển mà Toggles chơi của người choi play/pause. Chạy các ứng dụng và bạn sẽ có thể chơi một tập tin âm thanh được lựa chọn, chuyển sang theo dõi khác bằng cách làm cho một sự lựa chọn mới và tạm dừng phát lại bằng cách khai thác Pause trong thanh công cụ.
![[Image: Music-Streaming-Android-6.png]](http://laptrinhandroid.net.vn/wp-content/uploads/2015/11/Music-Streaming-Android-6.png)
Khi các tập tin âm thanh hoàn chơi, biểu tượng của thanh công cụ sẽ tiếp tục hiển thị biểu tượng Pause. Chúng tôi muốn biểu tượng của thanh công cụ để thay đổi để chơi khi một ca khúc hoàn thành chơi. Để làm được điều này, chúng tôi sẽ đặt vào hoàn nghe trên máy nghe nhạc phương tiện truyền thông để phát hiện khi nó được thực hiện và thay đổi biểu tượng của thanh công cụ.
Thêm sau đây gọi để mMediaPlayer.setOnPreparedListener().
Code:
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mPlayerControl.setImageResource(R.drawable.ic_play);
}
});
Chạy ứng dụng và bây giờ các biểu tượng trên thanh công cụ nên thay đổi một lần một ca khúc hoàn thành chơi.
Cuối cùng, thêm phần sau đây để các tập tin. Giải thoát cho các phương tiện truyền thông khi hoạt động này bị phá hủy. Chúng tôi không muốn được nắm giữ bất kỳ tài nguyên khi họ không sử dụng.
Code:
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
}
Điều đó mang lại cho chúng tôi đến cuối của hướng dẫn. Chúng tôi đã tạo ra một máy nghe nhạc âm thanh đơn giản và thấy được cách sử dụng lớp MediaPlayer chơi audio stream. Hãy nhớ để dán SoundCloud Client ID vào lớp Config.java.
-------------------- || --------------------
Nguồn: Hướng dẫn phát triển một ứng dụng Music Streaming Android