如何制作android本地的音乐播放器呢?步骤通常是如下:
1.在清单文件AndroidMainFest.xml文件当中添加权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2.需要找到当前module的build.gradle文件当中targetSdkVersion对应的版本号改为22.(此处与6.0的动态申请权限相关,可以在代码当中申请,此处就使用简单的一次申请方式)
3.绘制布局的内容:需要绘制的布局分为两个部分:1.activity对应的布局 2.listview的每一个item对应的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/bg">
<ListView
android:id="@+id/local_music_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#bbb"
android:dividerHeight="1dp"></ListView>
<RelativeLayout
android:background="#eee"
android:layout_width="match_parent"
android:layout_height="80dp"
android:focusableInTouchMode="true"
android:layout_alignParentBottom="true">
<ImageView
android:id="@+id/local_music_iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:src="@mipmap/music_icon"/>
<TextView
android:id="@+id/local_music_song"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名"
android:singleLine="true"
android:ellipsize="end"
android:textSize="16sp"
android:textStyle="bold"
android:layout_toRightOf="@+id/local_music_iv"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
/>
<TextView
android:id="@+id/local_music_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="周杰伦"
android:textSize="12sp"
android:layout_toRightOf="@+id/local_music_iv"
android:layout_alignLeft="@+id/local_music_song"
android:layout_below="@+id/local_music_song"
android:layout_marginTop="5dp"/>
<ImageView
android:id="@+id/local_music_last"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/local_music_singer"
android:layout_centerHorizontal="true"
android:onClick="onClick"
app:srcCompat="@mipmap/last" />
<ImageView
android:id="@+id/local_music_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/local_music_singer"
android:layout_marginEnd="30dp"
android:layout_marginRight="30dp"
android:onClick="onClick"
app:srcCompat="@mipmap/next" />
<ImageView
android:id="@+id/local_music_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/local_music_singer"
android:layout_marginEnd="40dp"
android:layout_marginRight="40dp"
android:onClick="onClick"
android:layout_toLeftOf="@+id/local_music_next"
android:layout_toStartOf="@+id/local_music_next"
app:srcCompat="@mipmap/play" />
</RelativeLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/item_music_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:textSize="24sp"
android:textStyle="bold"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/item_music_sing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="玫瑰花的葬礼"
android:textSize="18sp"
android:textStyle="bold"
android:singleLine="true"
android:ellipsize="end"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/item_music_id"/>
<TextView
android:id="@+id/item_music_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="许嵩"
android:textSize="14sp"
android:textColor="#888"
android:layout_marginTop="10dp"
android:layout_alignLeft="@+id/item_music_sing"
android:layout_below="@+id/item_music_sing"/>
<TextView
android:id="@+id/line"
android:layout_width="2dp"
android:layout_height="20dp"
android:background="#ccc"
android:layout_toRightOf="@+id/item_music_singer"
android:layout_alignTop="@+id/item_music_singer"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/>
<TextView
android:id="@+id/item_music_album"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="专辑名称"
android:layout_marginTop="10dp"
android:textSize="14sp"
android:textColor="#888"
android:ellipsize="end"
android:singleLine="true"
android:layout_toRightOf="@+id/line"
android:layout_below="@+id/item_music_sing"/>
<TextView
android:id="@+id/item_music_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_below="@+id/item_music_singer"
android:text="4:30"
android:layout_alignParentRight="true"/>
</RelativeLayout>
4.开始写java代码,首先需要写一个保存本地的音乐信息的类。
package com.animee.day09.demo01;
public class MusicInfo {
private String id;
private String singName;
private String singer;
private String alumb;
private String time;
private String path;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public MusicInfo(String id, String singName, String singer, String alumb, String time, String path) {
this.id = id;
this.singName = singName;
this.singer = singer;
this.alumb = alumb;
this.time = time;
this.path = path;
}
@Override
public String toString() {
return "MusicInfo{" +
"id='" + id + '\'' +
", singName='" + singName + '\'' +
", singer='" + singer + '\'' +
", alumb='" + alumb + '\'' +
", time='" + time + '\'' +
'}';
}
public MusicInfo() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSingName() {
return singName;
}
public void setSingName(String singName) {
this.singName = singName;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public String getAlumb() {
return alumb;
}
public void setAlumb(String alumb) {
this.alumb = alumb;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public MusicInfo(String id, String singName, String singer, String alumb, String time) {
this.id = id;
this.singName = singName;
this.singer = singer;
this.alumb = alumb;
this.time = time;
}
}
然后开始写activity当中的逻辑代码:
public class LocalMusicActivity extends AppCompatActivity {
private ListView lv;
private List<MusicInfo>mDatas = new ArrayList<>();
private LocalMusicAdapter adapter;
private TextView singNameTv;
private TextView singerTv;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_music);
//
lv = (ListView) findViewById(R.id.local_music_lv);
singNameTv = (TextView) findViewById(R.id.local_music_song);
singerTv = (TextView) findViewById(R.id.local_music_singer);
// 设置数据源
// 设置适配器
adapter = new LocalMusicAdapter(this,mDatas);
lv.setAdapter(adapter);
// 加载本地音乐
loadLocalData();
// 初始化媒体播放器
mediaPlayer = new MediaPlayer();
// 设置点击事件
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MusicInfo info = mDatas.get(position);
singerTv.setText(info.getSinger());
singNameTv.setText(info.getSingName());
// 因为有可能其他音乐正在被播放,所以要先停止在播放
stopMusic();
// 播放音乐
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(info.getPath());
playMusic();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void loadLocalData() {
// 1.获得ContentResolver对象
ContentResolver resolver = getContentResolver();
// 2.获得Uri地址
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
// 3.查找地址中的内容
Cursor cursor = resolver.query(musicUri, null, null, null, null);
// 4.遍历Cursor信息
int id= 0;
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); //不带后缀的歌曲名
String display_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); //带后缀
Log.i("xiaozhi", "loadLocalData: title==="+title+",display===="+display_name);
String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); //歌手
// 路劲
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
String time = sdf.format(new Date(duration));
id++;
String idStr = id+"";
MusicInfo info = new MusicInfo(idStr,title,singer,album,time,path);
mDatas.add(info);
}
adapter.notifyDataSetChanged();
}
/**
* 播放音乐
* */
public void playMusic(){
if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {
try {
mediaPlayer.prepare(); //准备播放,因为sd卡当中的音乐,所以不写异步准备
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 停止音乐
* */
public void stopMusic(){
if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
mediaPlayer.pause();
mediaPlayer.seekTo(0);
mediaPlayer.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
stopMusic();
}
}
使用列表当中显示的是音乐播放器的内容,所以通过适配器添加数据,以下为适配器的代码:
package com.animee.day09.demo01;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.animee.day09.R;
import java.util.List;
public class LocalMusicAdapter extends BaseAdapter{
private Context context;
private List<MusicInfo>mDatas;
public LocalMusicAdapter(Context context, List<MusicInfo> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView==null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_local_music,null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
MusicInfo musicInfo = mDatas.get(position);
holder.idTv.setText(musicInfo.getId());
holder.titleTv.setText(musicInfo.getSingName());
holder.alubmTv.setText(musicInfo.getAlumb());
holder.singerTv.setText(musicInfo.getSinger());
holder.timeTv.setText(musicInfo.getTime());
return convertView;
}
class ViewHolder{
TextView idTv,titleTv,singerTv,alubmTv,timeTv;
public ViewHolder(View itemView){
idTv = (TextView) itemView.findViewById(R.id.item_music_id);
titleTv = (TextView) itemView.findViewById(R.id.item_music_sing);
singerTv = (TextView) itemView.findViewById(R.id.item_music_singer);
alubmTv = (TextView) itemView.findViewById(R.id.item_music_album);
timeTv = (TextView) itemView.findViewById(R.id.item_music_time);
}
}
}
然后简单的音乐播放器就完成了,但是只能够显示和播放,在下一篇博客中,添加播放,暂停,以及上一曲和下一曲的功能。
效果图如下: