Android简单音乐播放器,上一曲下一曲,暂停

这是一个简单的Android音乐播放器示例,包括布局设计和代码实现。主要使用了RecyclerView展示音乐列表,Toolbar进行界面控制,以及MediaPlayer处理音频播放。代码中包含了数据Bean、适配器和MainActivity的关键部分,实现了搜索、播放、暂停和切换歌曲的功能。

非常简单的一个音乐播放器,话不多说,直接上代码。

首先,看看我们的实际效果图,我这里文字嫌懒是直接命名的(小伙伴们不要学哦,可以在res里的string里赋值调用),先来看看layout的效果图

 

随便编写的,有能力的小伙伴可以自行编写哦


<?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/linear1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/gray"
        android:orientation="horizontal">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/ce_bian"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginLeft="-5dp"
                android:layout_centerVertical="true"
                android:layout_gravity="center"
                android:background="@drawable/ic_launche_music_cebian_foreground"
                android:textColor="@color/black"
                android:textSize="25dp" />

            <EditText
                android:id="@+id/Editext"
                android:layout_width="275dp"
                android:layout_height="40dp"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@id/ce_bian"
                android:background="@drawable/search_border"
               android:gravity="center"
                android:hint="搜索"
                android:textColorHint="@color/black"
                android:textSize="12sp" />

            <Button
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_centerVertical="true"
                android:layout_marginLeft="15dp"
                android:layout_toRightOf="@id/Editext"
                android:background="@drawable/ic_launche_music_round" />


        </RelativeLayout>

    </androidx.appcompat.widget.Toolbar>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/local_music_rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/linear1" />

    <RelativeLayout
        android:id="@+id/bottom_music"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/backgroundground_bian">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="0.5dp" />

        <ImageView
            android:id="@+id/local_music_bottom_tv_icon"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/ic_launche_music_round"
            android:scaleType="center" />

        <TextView
            android:id="@+id/local_music_bottom_tv_singer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/local_music_bottom_tv_song"
            android:ellipsize="end"
            android:maxEms="6"
            android:singleLine="true"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/local_music_bottom_tv_song"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/local_music_bottom_tv_icon"
            android:ellipsize="end"
            android:maxEms="6"
            android:singleLine="true"
            android:textSize="16sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/local_music_bottom_iv_next"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_alignParentRight="true"
            android:src="@drawable/ic_launche_music_next_foreground" />

        <ImageView
            android:id="@+id/local_music_bottom_iv_play"
            android:layout_width="40dp"
            android:layout_height="55dp"
            android:layout_toLeftOf="@id/local_music_bottom_iv_next"
            android:src="@drawable/ic_launche_music_play_foreground" />

        <ImageView
            android:id="@+id/local_music_bottom_iv_last"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_toLeftOf="@id/local_music_bottom_iv_play"
            android:src="@drawable/ic_launche_music_last_foreground" />

    </RelativeLayout>
</RelativeLayout>

接下来到我们的代码部分

先创建一个bean 用于我们获取歌曲的参数


package com.example.myapplication.musci;

public class LocalMusicBean {
    private String id;
    private String song;
    private String singer;
    private String album;
    private String duration;
    private String path;

    public LocalMusicBean(String id, String song, String singer, String album, String duration, String path) {
        this.id = id;
        this.song = song;
        this.singer = singer;
        this.album = album;
        this.duration = duration;
        this.path = path;
    }

    public LocalMusicBean() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSong() {
        return song;
    }

    public void setSong(String song) {
        this.song = song;
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getDuration() {
        return duration;
    }

    public void setDuration(String duration) {
        this.duration = duration;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }


}

接着是music适配器


package com.example.myapplication.musci;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.R;

import java.util.List;

public class LocalMusciAdapter extends RecyclerView.Adapter<LocalMusciAdapter.LocalMusicViewHolder> {
     //声明一个上下文内容承接
    private Context context;

    
    private List<LocalMusicBean> mDates;

    //创建点击每一项列表的点击函数
    OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener {
        public void OnItemClick(View view, int position);
    }


    public LocalMusciAdapter(Context context, List<LocalMusicBean> mDates) {
        this.context = context;
        this.mDates = mDates;
    }

    @NonNull
    @Override
    public LocalMusicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_local_music, parent, false);
        LocalMusicViewHolder holder = new LocalMusicViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull LocalMusicViewHolder holder, int position) {
        LocalMusicBean musicBean = mDates.get(position);
        holder.idTv.setText(musicBean.getId());
        holder.songTv.setText(musicBean.getSong());
        holder.singTv.setText(musicBean.getSinger());
        holder.albumTv.setText(musicBean.getAlbum());
        holder.durationTv.setText(musicBean.getDuration());

        holder.itemView.setOnClickListener(view -> onItemClickListener.OnItemClick(view, position));


    }

    @Override
    public int getItemCount() {
        return mDates.size();
    }

    class LocalMusicViewHolder extends RecyclerView.ViewHolder {
        TextView idTv, songTv, singTv, albumTv, durationTv;

        public LocalMusicViewHolder(@NonNull View itemView) {
            super(itemView);
            idTv = itemView.findViewById(R.id.item_local_music_num);
            songTv = itemView.findViewById(R.id.item_local_music_song);
            singTv = itemView.findViewById(R.id.item_local_music_singer);
            albumTv = itemView.findViewById(R.id.item_local_music_album);
            durationTv = itemView.findViewById(R.id.item_local_music_duration);

        }
    }
}

接着就是我们的mainActivity


package com.example.myapplication;

import android.content.ContentResolver;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.musci.LocalMusciAdapter;
import com.example.myapplication.musci.LocalMusicBean;

import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {
    private TextView songTv, singerTv;
    private ImageView playIv, lastIv, nextIv;
    private RecyclerView musicRv;
    private List<LocalMusicBean> mDate;
    private LocalMusciAdapter adapter;
    MediaPlayer mediaPlayer;
    int currentPausePositionInSong = 0;
    private int currnetPlayPosition = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_main);

        initView();
        mDate = new ArrayList<>();

        mediaPlayer = new MediaPlayer();

        adapter = new LocalMusciAdapter(this, mDate);
        musicRv.setAdapter(adapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        musicRv.setLayoutManager(linearLayoutManager);
        loadLocalMusicData();
        setEvenClickListener();

    }

    private void setEvenClickListener() {
        adapter.setOnItemClickListener(new LocalMusciAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(View view, int position) {
                currnetPlayPosition = position;
                playMusicPosition(position);
            }
        });
    }

    private void playMusicPosition(int position) {
        singerTv.setText(mDate.get(position).getSinger());
        songTv.setText(mDate.get(position).getSong());
        stopMusic();
        mediaPlayer.reset();

        try {
            mediaPlayer.setDataSource(mDate.get(position).getPath());
            playMusic();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void playMusic() {
        if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
            try {
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        playIv.setImageResource(R.drawable.ic_launche_music_pause_foreground);
    }


    private void stopMusic() {
        if (mediaPlayer != null) {
            currentPausePositionInSong = 0;
            mediaPlayer.pause();
            mediaPlayer.seekTo(0);
            mediaPlayer.stop();
            playIv.setImageResource(R.drawable.ic_launche_music_play_foreground);

        }
    }

    private void pauseMusic() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            currentPausePositionInSong = mediaPlayer.getCurrentPosition();
            mediaPlayer.pause();
            playIv.setImageResource(R.drawable.ic_launche_music_play_foreground);

        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopMusic();
    }

    private void loadLocalMusicData() {
        ContentResolver resolver = getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = resolver.query(uri, null, null, null);

        int id = 0;
        while (cursor.moveToNext()) {
            String song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
            String singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
            String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
            id++;
            String sid = String.valueOf(id);
            String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
            long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
            SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
            String time = sdf.format(new Date(duration));
            if (time.equals("00:00")) {
                id--;
                continue;
            } else {
                LocalMusicBean bean = new LocalMusicBean(sid, album, song, singer, time, path);
                mDate.add(bean);
            }
        }


        adapter.notifyDataSetChanged();

    }

    private void initView() {
        nextIv = findViewById(R.id.local_music_bottom_iv_next);
        lastIv = findViewById(R.id.local_music_bottom_iv_last);
        playIv = findViewById(R.id.local_music_bottom_iv_play);
        songTv = findViewById(R.id.local_music_bottom_tv_song);
        singerTv = findViewById(R.id.local_music_bottom_tv_singer);
        musicRv = findViewById(R.id.local_music_rv);
        nextIv.setOnClickListener(this);
        lastIv.setOnClickListener(this);
        playIv.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.local_music_bottom_iv_next:
                if (currnetPlayPosition == mDate.size() - 1) {
                    currnetPlayPosition = 0;
                    playMusicPosition(currnetPlayPosition);
                    return;
                }
                currnetPlayPosition = currnetPlayPosition + 1;
                playMusicPosition(currnetPlayPosition);
                break;

            case R.id.local_music_bottom_iv_last:
                if (currnetPlayPosition == 0) {
                    currnetPlayPosition = mDate.size() - 1;
                    playMusicPosition(currnetPlayPosition);
                    return;
                }
                currnetPlayPosition = currnetPlayPosition - 1;
                playMusicPosition(currnetPlayPosition);
                break;

            case R.id.local_music_bottom_iv_play:
                if (currnetPlayPosition == -1) {
                    return;
                }
                if (mediaPlayer.isPlaying()) {
                    pauseMusic();
                } else {
                    playMusic();
                }
                break;
        }
    }


   

有问题的小伙伴可以私信交流哦

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值