Android本地音乐播放器的制作

如何制作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);
        }
    }
}

然后简单的音乐播放器就完成了,但是只能够显示和播放,在下一篇博客中,添加播放,暂停,以及上一曲和下一曲的功能。

效果图如下:效果图
 
 



  • 17
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值