Activity中实现音乐播放器

布局

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

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

    </ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ImageView
            android:id="@+id/img_head"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:src="@mipmap/ic_launcher" />


        <LinearLayout
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="10dp">
            <SeekBar
                android:id="@+id/seek"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/music_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="歌名" />

            <TextView
                android:id="@+id/singer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="歌手名" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp">
            <ImageButton
                android:background="@null"
                android:id="@+id/ib_menu"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginRight="10dp"

                android:src="@drawable/menu" />

            <ImageButton
                android:background="@null"
                android:id="@+id/ib_left"
                android:layout_width="20dp"
                android:layout_height="30dp"
                android:src="@drawable/left" />

            <ImageButton
                android:layout_marginLeft="10dp"
                android:background="@null"
                android:layout_marginRight="10dp"
                android:id="@+id/ib_pause"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/play" />

            <ImageButton
                android:id="@+id/ib_right"
                android:layout_width="20dp"
                android:layout_height="30dp"
                android:background="@null"
                android:src="@drawable/right" />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

子布局

<?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:gravity="center"
    android:orientation="vertical">

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

        <ImageView
            android:id="@+id/img_show"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_marginTop="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="20dp">

            <TextView
                android:id="@+id/music_show"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="歌名" />

            <TextView
                android:id="@+id/singer_show"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="歌手名" />
        </LinearLayout>

        <TextView
            android:layout_marginTop="10dp"
            android:id="@+id/time_show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="150dp"
            android:text="123456" />

    </LinearLayout>
</LinearLayout>

音乐类

class Music {
    private String song;
    private String singer;
    private String time;
    private String data;//地址
    private String size;//大小
    private String pic;

    public Music() {
    }

    @Override
    public String toString() {
        return "Music{" +
                "song='" + song + '\'' +
                ", singer='" + singer + '\'' +
                ", time='" + time + '\'' +
                ", data='" + data + '\'' +
                ", size='" + size + '\'' +
                ", pic='" + pic + '\'' +
                '}';
    }

    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 getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public Music(String song, String singer, String time, String data, String size, String pic) {
        this.song = song;
        this.singer = singer;
        this.time = time;
        this.data = data;
        this.size = size;
        this.pic = pic;
    }
}

音乐工具类

public class MusicUtils {
    public static final int SINGLE = 0;
    public static final int ORDER = 1;
    public static final int RANDOM = 2;

    public static List<Music> getMusics(Context context){
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        List<Music> musics = new ArrayList<>();
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//音频名
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//作者
                String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//总时长
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//地址
                String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));//大小
                String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//封面id

                if (Integer.parseInt(duration) > 6000) {
                    Music music = new Music(title, artist, duration, data, size, id);
                    musics.add(music);
                }
            }
            cursor.close();
        }

        return musics;
    }
}

适配器

public class Myadpter extends BaseAdapter {
    private List<Music> musics;
    private Context context;
    private LayoutInflater layoutInflater;

    public Myadpter(List<Music> music, Context context) {
        this.musics = music;
        this.context = context;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return musics.size();
    }

    @Override
    public Object getItem(int position) {
        return musics.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.item_layout, null);
            viewHolder = new ViewHolder();
            viewHolder.imgShow = convertView.findViewById(R.id.img_show);
            viewHolder.musicShow = convertView.findViewById(R.id.music_show);
            viewHolder.singerShow = convertView.findViewById(R.id.singer_show);
            viewHolder.time = convertView.findViewById(R.id.time_show);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Music music = musics.get(position);
        viewHolder.musicShow.setText(music.getSong());
        viewHolder.singerShow.setText(music.getSinger());
        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
        long l = Long.parseLong(music.getTime());
        String format = sdf.format(l);

        viewHolder.time.setText(format);
        return convertView;
    }

    class ViewHolder {
        private ImageView imgShow;
        private TextView musicShow;
        private TextView singerShow;
        private TextView time;
    }
}

Activity代码

public class MusicActivity extends AppCompatActivity {
    private ListView listMusic;
    private ImageView imgHead;
    private TextView musicName;
    private TextView singer;
    private ImageButton ibLeft;
    private ImageButton ibPause;
    private ImageButton ibRight;
    private Myadpter myadpter;

    private List<Music> musics = new ArrayList<>();

    private static final String TAG = "MusicActivity";

    private MediaPlayer mediaPlayer;
    private SeekBar seek;

    private Timer timer;
	//播放模式
    private int playMode = 0;

    //记录当前播放下标
    private int nowPosition = 0;

	//用于记录播放/暂停状态
    private boolean flag = false;
    private ImageButton ibMenu;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_music);
        //动态获取读音频的权限
        //因为音频在SD卡中存储 所以需要获取SD卡的权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
        }

        initViews();
        initDates();
    }

    private void initDates() {
        List<Music> dates = MusicUtils.getMusics(MusicActivity.this);
        musics.addAll(dates);
        myadpter.notifyDataSetChanged();
    }

    private void initViews() {
        ibMenu = (ImageButton) findViewById(R.id.ib_menu);
        listMusic = (ListView) findViewById(R.id.list_music);
        imgHead = (ImageView) findViewById(R.id.img_head);
        musicName = (TextView) findViewById(R.id.music_name);
        singer = (TextView) findViewById(R.id.singer);
        ibLeft = (ImageButton) findViewById(R.id.ib_left);
        ibPause = (ImageButton) findViewById(R.id.ib_pause);
        ibRight = (ImageButton) findViewById(R.id.ib_right);
        mediaPlayer = new MediaPlayer();

        seek = (SeekBar) findViewById(R.id.seek);


        myadpter = new Myadpter(musics, MusicActivity.this);

        listMusic.setAdapter(myadpter);

        ibMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建popupwindow
                final PopupWindow popupWindow = new PopupWindow();
                popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setOutsideTouchable(true);
                View view = LayoutInflater.from(MusicActivity.this).inflate(R.layout.pop_layout, null);

                //随机
                TextView random = view.findViewById(R.id.pop_random);
                random.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        popupWindow.dismiss();
                        playMode = MusicUtils.RANDOM;
                    }
                });

                //单曲
                TextView single = view.findViewById(R.id.pop_single);
                single.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        popupWindow.dismiss();
                        playMode = MusicUtils.SINGLE;
                    }
                });

                //顺序
                TextView order = view.findViewById(R.id.pop_order);
                order.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        popupWindow.dismiss();
                        playMode = MusicUtils.ORDER;
                    }
                });
                popupWindow.setContentView(view);
                popupWindow.showAsDropDown(ibMenu, 0, -300);
            }
        });

	//  播放/暂停
        ibPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag) {
                    mediaPlayer.start();
                    flag = false;
                    ibPause.setImageResource(R.drawable.pause);
                } else {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        flag = true;
                        ibPause.setImageResource(R.drawable.play);
                    }
                }
            }
        });

        listMusic.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                nowPosition = position;
                playMusic(position);

                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {//当前音乐播放结束
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        switch (playMode) {
                            case MusicUtils.SINGLE:
                                playMusic(nowPosition);
                                break;
                            case MusicUtils.ORDER:
                                if (++nowPosition > musics.size() - 1) {
                                    nowPosition = 0;
                                }
                                playMusic(nowPosition);
                                break;
                            case MusicUtils.RANDOM:
                                int i = new Random().nextInt(musics.size());
                                playMusic(i);
                                break;
                        }
                    }
                });
            }
        });

        seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser) {
                    mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });


        //上一首逻辑
        ibLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (--nowPosition < 0) {
                    nowPosition = 0;
                }
                playMusic(nowPosition);
            }
        });

        //下一首逻辑
        ibRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (++nowPosition > musics.size() - 1) {
                    nowPosition = 0;
                }
                playMusic(nowPosition);
            }
        });

    }

    private void playMusic(int position) {
        if (timer != null) {
            timer.cancel();
        }
        try {
            Music music = musics.get(position);
            ibPause.setImageResource(R.drawable.pause);
            //恢复播放器初始化状态
            mediaPlayer.reset();
            seek.setMax(Integer.parseInt(music.getTime()));//设置最大进度
            mediaPlayer.setDataSource(music.getData());
            mediaPlayer.prepareAsync();
            musicName.setText(music.getSong());
            singer.setText(music.getSinger());
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });

            timer = new Timer();
            timer.schedule(new TimerTask() {//每秒设置进度条
                @Override
                public void run() {
                    seek.setProgress(mediaPlayer.getCurrentPosition());//当前音乐播放位置
                }
            }, 0, 1000);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {

        } else {
            finish();
        }
    }
}

获取数据需要遍历SD卡中的音乐

public static List<Music> getMusics(Context context){
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    List<Music> musics = new ArrayList<>();
    ContentResolver contentResolver = context.getContentResolver();
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor != null) {
        while (cursor.moveToNext()) {
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//音频名
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//作者
            String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//总时长
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//地址
            String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));//大小
            String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//封面id

            if (Integer.parseInt(duration) > 6000) {
                Music music = new Music(title, artist, duration, data, size, id);
                musics.add(music);
            }
        }
        cursor.close();
    }

    return musics;
}

播放和进度条

listMusic.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        nowPosition = position;
        playMusic(position);

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {//当前音乐播放结束
            @Override
            public void onCompletion(MediaPlayer mp) {
                switch (playMode) {
                    case MusicUtils.SINGLE:
                        playMusic(nowPosition);
                        break;
                    case MusicUtils.ORDER:
                        if (++nowPosition > musics.size() - 1) {
                            nowPosition = 0;
                        }
                        playMusic(nowPosition);
                        break;
                    case MusicUtils.RANDOM:
                        int i = new Random().nextInt(musics.size());
                        playMusic(i);
                        break;
                }
            }
        });
    }
});

seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            mediaPlayer.seekTo(progress);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

private void playMusic(int position) {
    if (timer != null) {
        timer.cancel();
    }
    try {
        Music music = musics.get(position);
        ibPause.setImageResource(R.drawable.pause);
        //恢复播放器初始化状态
        mediaPlayer.reset();
        seek.setMax(Integer.parseInt(music.getTime()));//设置最大进度
        mediaPlayer.setDataSource(music.getData());
        mediaPlayer.prepareAsync();
        musicName.setText(music.getSong());
        singer.setText(music.getSinger());
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.start();
            }
        });

        timer = new Timer();
        timer.schedule(new TimerTask() {//每秒设置进度条
            @Override
            public void run() {
                seek.setProgress(mediaPlayer.getCurrentPosition());//当前音乐播放位置
            }
        }, 0, 1000);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

音乐播放模式

ibMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //创建popupwindow
        final PopupWindow popupWindow = new PopupWindow();
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setOutsideTouchable(true);
        View view = LayoutInflater.from(MusicActivity.this).inflate(R.layout.pop_layout, null);


        TextView random = view.findViewById(R.id.pop_random);
        random.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
                playMode = MusicUtils.RANDOM;
            }
        });

       
        TextView single = view.findViewById(R.id.pop_single);
        single.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
                playMode = MusicUtils.SINGLE;
            }
        });

       
        TextView order = view.findViewById(R.id.pop_order);
        order.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
                playMode = MusicUtils.ORDER;
            }
        });
        popupWindow.setContentView(view);
        popupWindow.showAsDropDown(ibMenu, 0, -300);
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值