android 简易的播放器(实现了 播放、暂停、下一首和上一首)

最近项目中遇到一点小需求,就是有个本地音乐播放 ,功能简单,实现了 播放、暂停、下一首和上一首,有基本需要的小伙伴可以参考(其他篇章写过遍历文件)


1.首先是xml 布局 


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <ListView
        android:id="@+id/lv_local_music"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp">


    </ListView>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_alignParentBottom="true">




        <SeekBar
            android:id="@+id/lv_seek_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:progress="0" />


        <TextView
            android:id="@+id/tv_time_local"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/lv_seek_bar"
            android:text="00:00" />


        <TextView
            android:id="@+id/tv_time_current"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00:00/"
            android:layout_below="@+id/lv_seek_bar"
            android:layout_toLeftOf="@+id/tv_time_local"
            android:layout_toStartOf="@+id/tv_time_local" />


        <TextView
            android:id="@+id/tv_musicName"
            android:layout_width="280dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/lv_seek_bar"
            android:text="歌曲名称"
            android:singleLine="true"/>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="#669fff"
            android:orientation="horizontal">


            <ImageView
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:src="@drawable/music" />




            <ImageButton
                android:id="@+id/ibtn_previous"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_marginLeft="30dp"
                android:background="@drawable/previous" />


            <ImageButton
                android:id="@+id/ibtn_play"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_marginLeft="10dp"
                android:background="@drawable/play" />


            <ImageButton
                android:id="@+id/ibtn_next"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_marginLeft="10dp"
                android:background="@drawable/next" />
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>


2 .其次就是代码了(因为我们的不是全部使用手点击操作,所以只附上点击操作的代码)


public class MusicActivity extends Activity implements View.OnClickListener {
    private static final String TAG = "MusicActivity";
    public static MusicActivity instance;
    private MediaPlayer player;
    private String musicName;
    private ImageButton ibtn_play, ibtn_next, ibtn_previous;
    private TextView tv_time_local, tv_musicName, tv_time_current;
    private SeekBar seek_bar;
    private ListView lv_local_music;
    private List<UMusicBean> mMusicList;
    private MusicListAdapter musicListAdapter;
    private String speakText = "";
    private SimpleDateFormat format = new SimpleDateFormat("mm:ss");
    public static final int MUSIC_DURATION = 0X324;
    public static final int MUSIC_POSITON = 0X325;
    private int pPosition;


    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MUSIC_DURATION:
                    if (player != null) {
                        seek_bar.setMax(player.getDuration() / 1000);
                        String time = format.format(new Date(player.getDuration()));
                        tv_time_local.setText(time);
                    }
                    break;
                case MUSIC_POSITON:
                    if (player != null) {
                        try {
                            seek_bar.setProgress(player.getCurrentPosition() / 1000);
                            tv_time_current.setText(format.format(new Date(player.getCurrentPosition())) + "/");
                            handler.sendEmptyMessageDelayed(MUSIC_POSITON, 1000);
                        } catch (Exception e) {
                            e.getStackTrace();
                        }


                    }
                    break;
            }
        }
    };




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music_local);
        EventBus.getDefault().register(this);
        SpeechApp.addActivity(this);
        instance = this;
        SpeechApp.scene.add("91", "music", true, "1", true);
        initview();
        mMusicList = (List<UMusicBean>) getIntent().getSerializableExtra("mMusicList");
        musicListAdapter = new MusicListAdapter(this, mMusicList);
        lv_local_music.setAdapter(musicListAdapter);


        lv_local_music.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ibtn_play.setBackgroundResource(R.drawable.play);   //更改按键状态图标
                pPosition = position;
                String musicPath = mMusicList.get(pPosition).getPath();
                tv_musicName.setText(mMusicList.get(pPosition).getDisplayName());
                Log.i(TAG, "------musicPath------>" + musicPath);
                startMusic(musicPath);
            }
        });




        //进度条监听
        seek_bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser) {
                    player.seekTo(progress * 1000);
                }
            }


            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {


            }


            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {


            }
        });


    }


    /**
     * 初始化Ui
     */
    private void initview() {
        ibtn_play = (ImageButton) findViewById(R.id.ibtn_play);
        ibtn_next = (ImageButton) findViewById(R.id.ibtn_next);
        ibtn_previous = (ImageButton) findViewById(R.id.ibtn_previous);
        lv_local_music = (ListView) findViewById(R.id.lv_local_music);
        tv_time_local = (TextView) findViewById(R.id.tv_time_local);
        tv_musicName = (TextView) findViewById(R.id.tv_musicName);
        tv_time_current = (TextView) findViewById(R.id.tv_time_current);
        seek_bar = (SeekBar) findViewById(R.id.lv_seek_bar);
        ibtn_play.setOnClickListener(this);
        ibtn_next.setOnClickListener(this);
        ibtn_previous.setOnClickListener(this);
        //创建mediaplayer
        player = new MediaPlayer();


    }




    int totalNum;


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.ibtn_play:
                if (player.isPlaying()) {                     //如果正在播放则暂停
                    player.pause();
                    ibtn_play.setBackgroundResource(
                            R.drawable.pause);   //更改按键状态图标
                } else {                                  //如果没有播放则恢复播放
                    player.start();
                    ibtn_play.setBackgroundResource(
                            R.drawable.play);   //更改按键状态图标


                }


                break;
            case R.id.ibtn_next:

ibtn_play.setBackgroundResource(R.drawable.play);   //更改按键状态图标
                totalNum = mMusicList.size();                 //获得音乐的数目
                if (pPosition == totalNum - 1) {                  //如果已经是最后一首,则播放第一首
                    pPosition = 0;
                } else {
                    pPosition += 1;                  //否则播放下一首
                }
                String nextMusicPath = mMusicList.get(pPosition).getPath();//得到将要播放的音乐路径
                tv_musicName.setText(mMusicList.get(pPosition).getDisplayName());
                startMusic(nextMusicPath);                               //开始播放
                break;
            case R.id.ibtn_previous:

ibtn_play.setBackgroundResource(R.drawable.play);   //更改按键状态图标
                totalNum = mMusicList.size();                     //获得音乐的数目
                if (pPosition == 0) {                        //如果已经时第一首则播放最后一首
                    pPosition = totalNum - 1;
                } else {                                  //否则播放上一首
                    pPosition -= 1;
                }
                String previousMusicPath = mMusicList.get(pPosition).getPath();//得到将要播放的音乐路径
                tv_musicName.setText(mMusicList.get(pPosition).getDisplayName());
                startMusic(previousMusicPath);                               //开始播放
                break;


        }


    }




    /**
     * 播放音乐
     */
    private void startMusic(String musicPath) {
        //重置,第一次不需要重置
        player.reset();
        if (player.isPlaying()) {
            player.release();
        }
        //设置播放的文件的路径
        try {
            player.setDataSource(musicPath);
            Log.i("tag", "-------------" + musicName);
            //设置准备完成的监听器
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    //播放
                    mp.start();
                    handler.sendEmptyMessage(MUSIC_DURATION);
                    handler.sendEmptyMessage(MUSIC_POSITON);
                    SpeechApp.speechHelper.nowIsAwaken(false);
                }
            });
            //异步加载
            player.prepareAsync();
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    int num = mMusicList.size();                 //获得音乐的数目
                    if (pPosition == num - 1) {                  //如果已经是最后一首,则播放第一首
                        pPosition = 0;
                    } else {
                        pPosition += 1;                  //否则播放下一首
                    }
                    String musicPath = mMusicList.get(pPosition).getPath();//得到将要播放的音乐路径
                    tv_musicName.setText(mMusicList.get(pPosition).getDisplayName());
                    startMusic(musicPath);                               //开始播放
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        if (player.isPlaying()) {
            player.release();
        }


    }


}



希望对大家有所帮助~

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中的音乐播放器实现自动播放一首音乐通常涉及到创建一个音乐播放器类,使用MediaPlayer或ExoPlayer等库。以下是一个简化的步骤: 1. 引入依赖:在Android项目中,可能需要添加如`androidx.appcompat.app.AppCompatActivity`和`androidx.media3:media3`(如果你选择使用ExoPlayer)或`com.android.support.v4.media.MediaBrowserCompat`(用于MediaStore API)。 2. 创建播放列表或媒体文件列表:将所有你想播放的音乐文件路径存储在一个List或数组中。 3. 初始化播放器:对于MediaPlayer,你可以创建一个MediaPlayer实例并设置媒体来源;对于ExoPlayer,创建一个ExoPlayer.Builder实例,配置后初始化播放器。 ```java // 使用MediaPlayer示例 MediaPlayer mediaPlayer = new MediaPlayer(); Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.your_music_file); // 或者 ExoPlayer示例 ExoPlayer player = ExoPlayerFactory.newSimpleInstance(new ExoPlayer.Builder(context).build()); MediaItem mediaItem = MediaItem.fromUri(uri); Source source = DefaultMediaSourceFactory.defaultSourceFactory(context).createMediaSource(mediaItem); player.setMediaSource(source); ``` 4. 自动播放功能:为播放器设置循环播放模式,并在当前歌曲播放完毕后自动切换到下一首。例如,使用MediaPlayer的setNextMediaPlayer方法: ```java mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { int nextIndex = (index + 1) % musicList.size(); // 如果列表为空,则索引保持不变 mediaPlayer = musicList.get(nextIndex); // 获取下一首 mediaPlayer.start(); } }); ``` 5. 播放控制:提供暂停播放、上一曲和下一曲的按钮,监听这些按钮的点击事件并调用相应的播放器方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值