获取本地手机音乐播放暂停、播放、下一曲、上一曲

package com.animee.day09.demo01;


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.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.animee.day09.R;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class LocalMusicActivity extends AppCompatActivity {
    private ListView lv;
    private ListmDatas = new ArrayList<>();
    private LocalMusicAdapter adapter;
    private TextView singNameTv;
    private TextView singerTv;
    private MediaPlayer mediaPlayer;
    private int currentPlayPosition = -1;   //当前正在播放的音乐的位置。
    private boolean isPlaying = false;  //未播放
    private int currentPausePosInSong = 0;
    private ImageView playIv;


    @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);
        playIv = (ImageView) findViewById(R.id.local_music_play);
//        设置数据源
//        设置适配器
        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);
                currentPlayPosition = position;
                playMusicInPosition(info);
            }
        });
    }
    /**
     * 播放指定内容的音乐信息
     * */
    public void playMusicInPosition(MusicInfo info) {
        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)); //带后缀


            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();
    }


    /**
     * 播放音乐
     * 总共分为两种情况:
     * 1.从停止到播放  重置播放器,然后重新准备 然后重新开始
     * 2.从暂停到播放  挪动进度条到相应的暂停的位置上,然后在播放
     * 怎么判断是从停止到播放还是从暂停到播放呢?
     * 因为在暂停当中对于成员变量CurrentPausePosInSong进行赋值了,不等于0了,而停止这个变量为0
     * 所以通过判断这个变量就能够了解是暂停到播放还是停止到播放。
     *
     * */
    public void playMusic(){
        if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {
            if (currentPausePosInSong==0) {
                try {
                    mediaPlayer.prepare();  //准备播放,因为sd卡当中的音乐,所以不写异步准备
                    mediaPlayer.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else{
                mediaPlayer.seekTo(currentPausePosInSong);
                mediaPlayer.start();
            }
            isPlaying = true;
            playIv.setImageResource(R.mipmap.pause);
        }
    }
    /**
     * 暂停音乐的方法
     * */
    public void pauseMusic(){
        if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
//            获取歌曲暂停的位置
            currentPausePosInSong = mediaPlayer.getCurrentPosition();
            mediaPlayer.pause();  //暂停音乐
            isPlaying = false;  //改变标志位为false,因为没有播放音乐
            playIv.setImageResource(R.mipmap.play);
        }
    }
    /**
     * 停止音乐
     * */
    public void stopMusic(){
        if (mediaPlayer!=null) {
            currentPausePosInSong = 0;
            mediaPlayer.pause();
            mediaPlayer.seekTo(0);
            mediaPlayer.stop();
            isPlaying  = false;
            playIv.setImageResource(R.mipmap.play);
        }
    }


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


    public void onClick(View view) {
        switch (view.getId()) {
//    分析逻辑,获取当前播放的歌曲的位置,如果是第一曲,也就是说位置为0,就说明没有上一曲了,所以就提示用户,已经是第一曲了。
//    如果当前播放的位置不为0,就说明不是第一曲,那么就可以让当前正在播放的音乐的位置减去1,就是上一曲,
//     获取上一曲对象的信息,然后就可以获得位置,然后就可以对于音乐播放器进行设置了。
            case R.id.local_music_last:   //点击播放上一曲的内容
                if (currentPlayPosition==0) {
                    Toast.makeText(this,"已经是第一曲了,没有上一曲!",Toast.LENGTH_SHORT).show();
                    return;
                }
                currentPlayPosition = currentPlayPosition-1;
                MusicInfo lastInfo = mDatas.get(currentPlayPosition);
//                要播放上一曲信息,需要改变的是改变两个TextView,并且重置Mediaplayer,然后设置新的播放路径
                playMusicInPosition(lastInfo);
                break;
            case R.id.local_music_next:   //点击播放下一曲的内容
                if (currentPlayPosition==mDatas.size()-1) {
                    Toast.makeText(this,"已经是最后一曲了,没有下一曲!",Toast.LENGTH_SHORT).show();
                    return;
                }
                currentPlayPosition = currentPlayPosition+1;
                MusicInfo nextInfo = mDatas.get(currentPlayPosition);
                playMusicInPosition(nextInfo);
                break;
            case R.id.local_music_play:   //点击播放可以切换是播放还是暂停。
                if (currentPlayPosition<0){
                    Toast.makeText(this,"请选择想要播放的歌曲在播放",Toast.LENGTH_SHORT).show();
                    return;
                }
                if (isPlaying) {  //正在播放当中,应该暂停
                    pauseMusic();
                }else{   //说明没有播放,点击之后应该播放
                    playMusic();
                }
                break;
        }
    }
}

你可能感兴趣的:(获取本地手机音乐播放暂停、播放、下一曲、上一曲)