设计一个音乐播放器,用List列表显示手机中所有音乐,支持播放、暂停、继续、上一首、下一首等功能。

package com.example.lenovo.musicplayer;


import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.support.v4.app.ActivityCompat;


import java.text.SimpleDateFormat;
import java.util.ArrayList;




public class MusicActivity extends Activity {

    ArrayList<Music> musicList = new ArrayList<Music>(); //音乐列表
    MediaPlayer mp=new MediaPlayer(); //音乐播放器
    SeekBar seekBar;
    TextView current_time, total_time; //显示当前音乐进度信息
    ImageButton btn_play; //播放按钮
    ImageButton btn_left;
    ImageButton btn_right;

    TextView playtitle;

    int position1=0;
    int count=0;

    int duration=0; //获取时长(ms)
    int current=0; //当前音乐播放位置
    boolean isOver=false; //是否播放完毕
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if ( msg.what == 0 ) {
                if( ! isOver ) {
                    current = mp.getCurrentPosition();
                    seekBar.setProgress(current);
                    SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
                    String time=sdf.format(current);
                    current_time.setText(""+time); //""不要掉了
                }
            }
        }
    };
    public ArrayList<Music> ScannerMusic() {
        ArrayList<Music> list=new ArrayList<>();
        //  查询媒体数据库
        Cursor cursor = getContentResolver().query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
                MediaStore.Audio.Media.TITLE); //按标题排序
        // 遍历媒体数据库
        if ( cursor.moveToFirst() ){ //遍历每一行
            while ( !cursor.isAfterLast() ) { //遍历每一列
                //歌曲IDMediaStore.Audio.Media._ID
                int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
                //歌曲的名称 :MediaStore.Audio.Media.TITLE
                String tilte =cursor.getString(
                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));

                //歌曲作者
                String artist=cursor.getString(
                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

                //歌曲路径 :MediaStore.Audio.Media.DATA
                String url = cursor.getString(
                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                //歌曲时长 :MediaStore.Audio.Media.DURATION
                int duration = cursor.getInt(
                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                Music m = new Music(id, tilte,artist, url, duration);
                list.add(m);
                cursor.moveToNext();
            } //end while
            cursor.close();
        } //end if
        return list;
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);
        //初始化
        if (ActivityCompat.checkSelfPermission( MusicActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED ) {
            ActivityCompat.requestPermissions(MusicActivity.this,
                    new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 123);
            return;
        }
        seekBar=(SeekBar)findViewById(R.id.musicSeekBar);
        current_time=(TextView)findViewById(R.id.current_time);
        total_time=(TextView)findViewById(R.id.total_time);
        btn_play=(ImageButton)findViewById(R.id.btn_play);
        btn_right=(ImageButton)findViewById(R.id.btn_right);
        btn_left=(ImageButton)findViewById(R.id.btn_left);
        playtitle=(TextView)findViewById(R.id.playtitle);
        // 获取音乐列表
        musicList=ScannerMusic();
        // 使用MusicAdpater
        MusicAdapter adapter = new MusicAdapter(
                MusicActivity.this, R.layout.music_item, musicList );
        ListView li=(ListView)findViewById(R.id.musicListView);
        li.setAdapter(adapter);
        count=li.getCount();
        li.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                position1=position;

                Music m=musicList.get(position);
                playtitle.setText("正在播放:"+m.getTitle());

                String music_url=m.getUrl(); //获得音乐路径
                isOver=false;
               btn_play.setImageResource(R.drawable.play);
                try{
                    mp.reset(); // 重置
                    mp.setDataSource(music_url);
                    mp.prepare(); // 准备
                }catch (Exception e){
                    e.printStackTrace();
                }
                duration=mp.getDuration(); //获取音乐时长(ms)
                SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
                String time=sdf.format(duration);
                total_time.setText(""+time);
                seekBar.setMax(duration); //SeekBar设置最大时长
                mp.start(); //播放
                btn_play.setImageResource(R.drawable.pause);
                new Thread() {
                    @Override
                    public void run() {
                        while ( ! isOver ) {
                            try {
                                Thread.sleep(50); //50ms执行一次mTimerTask任务
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            mHandler.sendEmptyMessage(0); //直接发送一个what=0的空消息
                        }
                    }
                }.start();
            } //end onItemClick
        }); //end setOnItemClick
        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isOver=false;
                if( mp.isPlaying() ){
                    mp.pause();
                    btn_play.setImageResource(R.drawable.play);
                }else{
                    mp.start();
                    btn_play.setImageResource(R.drawable.pause);
                    //后续,再次启动子线程
                    new Thread() {
                        @Override
                        public void run() {
                            while ( !isOver ) {
                                try {
                                    Thread.sleep(50); //50ms执行一次mTimerTask任务
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                mHandler.sendEmptyMessage(0); //直接发送一个what=0的空消息
                            }
                        }
                    }.start();
                } //end else
            } //end onClick
        }); //end setOnClick
        // 播放完毕
        btn_right.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                position1+=1;
                if(position1>=count)
                {
                    position1=0;
                }
                Music m=musicList.get(position1);

                playtitle.setText("正在播放:"+m.getTitle());
                String music_url=m.getUrl(); //获得音乐路径
                isOver=false;
                btn_play.setImageResource(R.drawable.pause);
                try{
                    mp.reset(); // 重置
                    mp.setDataSource(music_url);
                    mp.prepare(); // 准备
                }catch (Exception e){
                    e.printStackTrace();
                }
                duration=mp.getDuration(); //获取音乐时长(ms)
                SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
                String time=sdf.format(duration);
                total_time.setText(""+time);
                seekBar.setMax(duration); //SeekBar设置最大时长
                mp.start(); //播放
                new Thread() {
                    @Override
                    public void run() {
                        while ( !isOver ) {
                            try {
                                Thread.sleep(50); //50ms执行一次mTimerTask任务
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            mHandler.sendEmptyMessage(0); //直接发送一个what=0的空消息
                        }
                    }
                }.start();
            }
        });
        btn_left.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                position1-=1;
                if(position1<=0)
                {
                    position1=count-1;
                }
                Music m=musicList.get(position1);

                playtitle.setText("正在播放:"+m.getTitle());
                String music_url=m.getUrl(); //获得音乐路径
                isOver=false;
                btn_play.setImageResource(R.drawable.pause);
                try{
                    mp.reset(); // 重置
                    mp.setDataSource(music_url);
                    mp.prepare(); // 准备
                }catch (Exception e){
                    e.printStackTrace();
                }
                duration=mp.getDuration(); //获取音乐时长(ms)
                SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
                String time=sdf.format(duration);
                total_time.setText(""+time);
                seekBar.setMax(duration); //SeekBar设置最大时长
                mp.start(); //播放
                new Thread() {
                    @Override
                    public void run() {
                        while ( !isOver ) {
                            try {
                                Thread.sleep(50); //50ms执行一次mTimerTask任务
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            mHandler.sendEmptyMessage(0); //直接发送一个what=0的空消息
                        }
                    }
                }.start();

            }
        });



        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                position1+=1;
                if(position1>=count)
                {
                    position1=0;
                }
                Music m=musicList.get(position1);
                playtitle.setText("正在播放:"+m.getTitle());
                String music_url=m.getUrl(); //获得音乐路径
                isOver=false;
                btn_play.setImageResource(R.drawable.pause);
                try{
                    mp.reset(); // 重置
                    mp.setDataSource(music_url);
                    mp.prepare(); // 准备
                }catch (Exception e){
                    e.printStackTrace();
                }
                duration=mp.getDuration(); //获取音乐时长(ms)
                SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
                String time=sdf.format(duration);
                total_time.setText(""+time);
                seekBar.setMax(duration); //SeekBar设置最大时长
                mp.start(); //播放
                new Thread() {
                    @Override
                    public void run() {
                        while ( !isOver ) {
                            try {
                                Thread.sleep(50); //50ms执行一次mTimerTask任务
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            mHandler.sendEmptyMessage(0); //直接发送一个what=0的空消息
                        }
                    }
                }.start();
            }
        });
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //此处无代码
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                //此处无代码
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                current=seekBar.getProgress();
                current_time.setText(""+current);
                mp.seekTo(current);
            }
        }); //end setOnSeekBar
    } // end onCreate
   @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if( keyCode==event.KEYCODE_BACK ){
            new AlertDialog.Builder(MusicActivity.this)
                    .setIcon(R.drawable.login)
                    .setTitle("提示")
                    .setMessage("确定退出吗?")
                    .setPositiveButton("确定",new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setNegativeButton("取消", null)
                    .show();
        }
        return false;
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        isOver=true;
        if( mp!=null ){
            mp.stop();
            mp.release();
        }
        Toast.makeText(getApplicationContext(), "退出啦", Toast.LENGTH_SHORT).show();
    }
} // end activity(完)
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,我们需要创建一个音乐播放器的界面,包括播放/暂停按钮、上一首/下一首按钮、歌曲名称和歌手名称等组件。在界面,我们可以通过点击按钮来控制音乐播放暂停和切换。 接下来,我们需要创建一个Service来实现音乐播放和控制。在Service,我们需要定义一个MediaPlayer对象来播放音乐,同时监听播放完成事件,以便在歌曲播放完成后自动切换到下一首。Service还需要提供一些方法,如播放暂停、上一首、下一首等,供Activity调用。 最后,我们需要创建一个BroadcastReceiver来监听耳机插拔事件,并在插拔事件发生时暂停音乐播放。同时,我们还可以在BroadcastReceiver监听其他系统事件,如屏幕关闭事件等,以便在需要时暂停音乐播放。 下面是一个简单的示例代码,实现了上述功能: ```kotlin class MusicService : Service(), MediaPlayer.OnCompletionListener { private lateinit var mediaPlayer: MediaPlayer private var songs: List<Song> = emptyList() private var currentSongIndex: Int = -1 private var isPaused: Boolean = false override fun onCreate() { super.onCreate() mediaPlayer = MediaPlayer() mediaPlayer.setOnCompletionListener(this) songs = listOf(Song("song1", "artist1"), Song("song2", "artist2")) } override fun onBind(intent: Intent?): IBinder? { return null } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { "play" -> { val songIndex = intent.getIntExtra("songIndex", -1) if (songIndex >= 0 && songIndex < songs.size) { playSong(songIndex) } } "pause" -> { pauseSong() } "next" -> { playNextSong() } "prev" -> { playPrevSong() } } return super.onStartCommand(intent, flags, startId) } override fun onCompletion(mp: MediaPlayer?) { playNextSong() } private fun playSong(songIndex: Int) { if (songIndex == currentSongIndex && isPaused) { mediaPlayer.start() isPaused = false } else { currentSongIndex = songIndex mediaPlayer.reset() val song = songs[songIndex] val songUri = getSongUri(song) mediaPlayer.setDataSource(applicationContext, songUri) mediaPlayer.prepare() mediaPlayer.start() isPaused = false } } private fun pauseSong() { mediaPlayer.pause() isPaused = true } private fun playNextSong() { val nextSongIndex = (currentSongIndex + 1) % songs.size playSong(nextSongIndex) } private fun playPrevSong() { val prevSongIndex = (currentSongIndex - 1 + songs.size) % songs.size playSong(prevSongIndex) } private fun getSongUri(song: Song): Uri? { // TODO: 根据歌曲名和歌手名获取歌曲的Uri return null } data class Song(val name: String, val artist: String) } ``` 在Activity,我们可以通过调用startService方法来启动Service,并通过Intent传递控制指令: ```kotlin class MainActivity : AppCompatActivity() { private lateinit var musicServiceIntent: Intent override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) musicServiceIntent = Intent(this, MusicService::class.java) playButton.setOnClickListener { val songIndex = // 获取当前选择的歌曲索引 musicServiceIntent.action = "play" musicServiceIntent.putExtra("songIndex", songIndex) startService(musicServiceIntent) } pauseButton.setOnClickListener { musicServiceIntent.action = "pause" startService(musicServiceIntent) } nextButton.setOnClickListener { musicServiceIntent.action = "next" startService(musicServiceIntent) } prevButton.setOnClickListener { musicServiceIntent.action = "prev" startService(musicServiceIntent) } } } ``` 最后,我们需要创建一个BroadcastReceiver来监听耳机插拔事件,并在插拔事件发生时暂停音乐播放: ```kotlin class MusicBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action == Intent.ACTION_HEADSET_PLUG) { val state = intent.getIntExtra("state", -1) if (state == 0) { // 耳机拔出 val musicServiceIntent = Intent(context, MusicService::class.java) musicServiceIntent.action = "pause" context?.startService(musicServiceIntent) } } } } ``` 在AndroidManifest.xml注册BroadcastReceiver: ```xml <receiver android:name=".MusicBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.HEADSET_PLUG" /> </intent-filter> </receiver> ``` 以上就是一个简单的Android音乐播放器的实现。通过使用Service和BroadcastReceiver,我们可以实现后台音乐播放,并在需要时暂停音乐播放。同时,也加深了对于Service和BroadcastReceiver的理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值