Android本地音乐播放器

UI界面模仿QQ音乐
实现一个简单的本地播放器,功能包括:播放,暂停,上一曲,下一曲,进度条。

功能实现

读取本地音乐
1.创建一个Song类

public class Song {
    public String song;//歌曲名
    public String singer;//歌手
    public long size;//歌曲所占空间大小
    public int duration;//歌曲时间长度
    public String path;//歌曲地址
    public String album;//专辑名
}

2.用于获取本地音乐的Utils

public class Utils {
    //定义一个集合,存放从本地读取到的内容
    public static List<Song> list;
    public static Song song;
    public static List<Song> getmusic(Context context) {
        list = new ArrayList<>();
        Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                null, null, null, MediaStore.Audio.AudioColumns.IS_MUSIC);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                song = new Song();
                song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                song.album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
                //把歌曲名字和歌手切割开
                if (song.size > 1000 * 800) {
                    if (song.song.contains("-")) {
                        String[] str = song.song.split("-");
                        song.singer = str[0];
                        song.song = str[1];
                    }
                    list.add(song);
                }
            }
        }
        cursor.close();
        return list;
    }
    //    转换歌曲时间的格式
    public static String formatTime(int time) {
        if (time / 1000 % 60 < 10) {
            String tt = time / 1000 / 60 + ":0" + time / 1000 % 60;
            return tt;
        } else {
            String tt = time / 1000 / 60 + ":" + time / 1000 % 60;
            return tt;
        }
    }
}

3.在布局里面定义一个ListView,并写一个适配器

//适配器
    class MyAdapter extends BaseAdapter {
        Context context;
        List<Song> list;
        private int mSelect;   //选中项
        public MyAdapter(MainActivity mainActivity, List<Song> list) {
            this.context = mainActivity;
            this.list = list;
        }
        @Override
        public int getCount() {
            return list.size();
        }
        @Override
        public Object getItem(int i) {
            return list.get(i);
        }
        @Override
        public long getItemId(int i) {
            return i;
        }
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            Myholder myholder;
            if (view == null) {
                myholder = new Myholder();
                view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.text, null);
               // myholder.t_position = view.findViewById(R.id.t_postion);
                myholder.t_song = view.findViewById(R.id.t_song);
                myholder.t_singer = view.findViewById(R.id.t_singer);
                myholder.t_blank=view.findViewById(R.id.t_blank);
                myholder.t_albumn=view.findViewById(R.id.t_albumn);
                myholder.t_point=view.findViewById(R.id.t_point);
                myholder.t_duration = view.findViewById(R.id.t_duration);
                view.setTag(myholder);
            } else {
                myholder = (Myholder) view.getTag();
            }
            myholder.t_song.setText(list.get(i).song.toString());
            myholder.t_singer.setText(list.get(i).singer.toString());
            String time = Utils.formatTime(list.get(i).duration);
            myholder.t_albumn.setText(list.get(i).album.toString());
            myholder.t_duration.setText(time);
            //myholder.t_position.setText(i + 1 + "");
            //设置相关数据
            if (mSelect==-1){
                myholder.t_song.setEnabled(true);
                myholder.t_singer.setEnabled(true);
                myholder.t_blank.setVisibility(View.INVISIBLE);
                //选中项背景
                myholder.t_song.setTextColor(getResources().getColor(R.color.tilte_color));
                myholder.t_singer.setTextColor(getResources().getColor(R.color.tilte_color));
                myholder.t_albumn.setTextColor(getResources().getColor(R.color.tilte_color));
                myholder.t_point.setTextColor(getResources().getColor(R.color.tilte_color));
            }
            if (mSelect == i) {
                myholder.t_song.setEnabled(true);
                myholder.t_singer.setEnabled(true);
                myholder.t_blank.setVisibility(View.VISIBLE);
                //选中项背景
                myholder.t_song.setTextColor(getResources().getColor(R.color.theme));
                myholder.t_singer.setTextColor(getResources().getColor(R.color.theme));
                myholder.t_albumn.setTextColor(getResources().getColor(R.color.theme));
                myholder.t_point.setTextColor(getResources().getColor(R.color.theme));
                myholder.t_duration.setTextColor(getResources().getColor(R.color.theme));
            } else {
                myholder.t_song.setEnabled(false);
                myholder.t_singer.setEnabled(false);
                myholder.t_blank.setVisibility(View.INVISIBLE);
                //其他项背景
                myholder.t_song.setTextColor(getResources().getColor(R.color.tilte_color));
                myholder.t_singer.setTextColor(getResources().getColor(R.color.song));
                myholder.t_albumn.setTextColor(getResources().getColor(R.color.song));
                myholder.t_point.setTextColor(getResources().getColor(R.color.song));
                myholder.t_duration.setTextColor(getResources().getColor(R.color.song));
            }
            return view;
        }
        class Myholder {
            ImageView t_blank;
            TextView t_position, t_song, t_singer, t_duration,t_albumn,t_point;
        }
        //刷新方法
        public void changeSelected(int positon){
            if (positon != mSelect) {
                mSelect = positon;
                notifyDataSetChanged();
            }
        }
    }

在类里面定义一个刷新位置的方法changeSelectde与ListView的点击监听事件配合使用,用于ListView被点击后将position参数传入,相应的文字颜色的改变
4.给ListView设置适配器

mylist = (ListView) findViewById(R.id.mylist);
        list = new ArrayList<>();
        list = Utils.getmusic(this);//获取音乐
        myAdapter = new MyAdapter(this, list);
        mylist.setAdapter(myAdapter);

5.使用MediaPlayer播放音乐
把音乐读取到ListView之后,点击音乐列表的音乐,就能够进行音乐的播放,并在底栏显示相应的音乐名,歌手名,可以拖动进度条进行音乐的控制,点击相应的按钮能够暂停,上一曲,下一曲。
首先封装一个播放音乐的方法,传入的参数currentPosition为音乐的位置

private void musicPlay(int currentPosition) {
           seekBar.setMax(list.get(currentPosition).getDuration());
           try {
               // 重置音频文件,防止多次点击会报错
               mediaPlayer.reset();
               //调用方法传进播放地址
               mediaPlayer.setDataSource(list.get(currentPosition).getPath());
               //异步准备资源,防止卡顿
               mediaPlayer.prepareAsync();
               //调用音频的监听方法,音频准备完毕后响应该方法进行音乐播放
               mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                   @Override
                   public void onPrepared(MediaPlayer mediaPlayer) {
                       mediaPlayer.start();//开始播放
                       Thread thread = new Thread(new SeekBarThread());//更新SeekBar的线程
                       thread.start();
                   }
               });
           } catch (Exception e) {
           e.printStackTrace();
       }
   }

然后为ListView设置点击事件

mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                currentPosition=position;
                musicPlay(currentPosition);//播放音乐
                myAdapter.changeSelected(currentPosition);//设置字体变色
                play.setVisibility(View.INVISIBLE);//播放按钮消失
                pause.setVisibility(View.VISIBLE);//暂停按钮出现
                String song=list.get(currentPosition).song;//获取音乐名
                String singer=list.get(currentPosition).singer;//获取歌手名
                bottomSong.setText(song);//底栏显示音乐名
                bottomSinger.setText(singer);//底栏显示歌手名
                gang.setVisibility(View.VISIBLE);//横杠

            }
        });

播放,暂停,上一曲,下一曲按钮点击事件

//暂停按钮
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mediaPlayer.pause();//暂停音乐
                    pause.setVisibility(View.INVISIBLE);
                    play.setVisibility(View.VISIBLE);
            }
        });
        //播放按钮
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                play.setVisibility(View.INVISIBLE);
                pause.setVisibility(View.VISIBLE);
                mediaPlayer.start();//播放音乐
            }
        });
        /**
         * 下一曲
         */
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentPosition++;
                if (currentPosition > list.size() - 1) {
                    currentPosition = 0;
                }
                musicPlay(currentPosition);
                myAdapter.changeSelected(currentPosition);//ListView颜色变化
                //底栏设置正在播放的歌曲信息
                String song=list.get(currentPosition).song;
                String singer=list.get(currentPosition).singer;
                bottomSong.setText(song);
                bottomSinger.setText(singer);
                gang.setVisibility(View.VISIBLE);
            }
        });
        /**
         * 上一曲
         */
        pre.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentPosition--;
                if (currentPosition < 0) {
                    currentPosition = list.size() - 1;
                }
                musicPlay(currentPosition);
                myAdapter.changeSelected(currentPosition);//ListView颜色变化
                //底栏设置正在播放的歌曲信息
                String song=list.get(currentPosition).song;
                String singer=list.get(currentPosition).singer;
                bottomSong.setText(song);
                bottomSinger.setText(singer);
                gang.setVisibility(View.VISIBLE);
            }
        });

给mediaPlayer添加一个监听事件,实现当前音乐播放完成后自动播放下一首的功能

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                currentPosition++;
                if (currentPosition > list.size() - 1) {
                    currentPosition = 0;
                }
                musicPlay(currentPosition);
                myAdapter.changeSelected(currentPosition);
                //底栏设置正在播放的歌曲信息
                String song=list.get(currentPosition).song;
                String singer=list.get(currentPosition).singer;
                bottomSong.setText(song);
                bottomSinger.setText(singer);
                gang.setVisibility(View.VISIBLE);
            }
        });

5.进度条
使用Handler类,进行SeekBar的更新

private static final int UPDATE_SEEKBAR=0;
    private Handler  handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATE_SEEKBAR:
                    // 将SeekBar位置设置到当前播放位置
                    seekBar.setProgress(mediaPlayer.getCurrentPosition());
                    break;
                default:
                    break;
            }
        }
    };

定义一个类,实现Runnable接口进行SeekBar状态的刷新

class SeekBarThread implements Runnable {
        @Override
        public void run() {
            while (mediaPlayer.isPlaying()) {
                try {
                    // 每500毫秒更新一次位置
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Message message=new Message();
                message.what=UPDATE_SEEKBAR;
                handler.sendMessage(message);
            }
        }
    }

给SeekBar添加监听事件,实现拖动进度条改变音乐进度

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

源码下载链接:
下载链接

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 您可以使用MediaPlayer类在Android Studio中开发一个本地音乐播放器。MediaPlayer类提供了播放音频文件的功能,可以读取本地存储上的音频文件。您可以通过以下步骤构建您的音乐播放器: 1. 创建一个新的Android Studio项目。 2. 创建一个MediaPlayer对象。 3. 使用MediaPlayer的setDataSource()方法加载本地音乐文件。 4. 使用MediaPlayer的prepare()和start()方法播放音乐。 5. 在应用程序中添加控件(例如播放/暂停按钮)来控制音乐的播放。 希望这些信息对您有所帮助! ### 回答2: Android Studio是一款流行的开发工具,常用于编写Android应用程序。在这个工具中,可以开发许多种类的应用程序,其中一个较为常见的是本地音乐播放器。本地音乐播放器是一种播放设备里存储的音乐文件的播放器。在这里,我们将介绍如何使用Java语言和Android API来创建一个简单的本地音乐播放器。 首先,我们需要创建一个新的项目。在创建新项目时,我们需要使用一些基本的组件,包括Activity、Service 以及 Media Player组件。Activity是用户界面的类,Service是用于音乐播放的类,并且Media Player是用于播放音乐的类。 创建Activity时,我们应该设置一个布局文件,来为用户界面进行设计。这个布局文件通常使用XML语言来编写,并包含了用户可以看到和操作的UI元素,例如按钮和文本框等。我们可以在布局文件中添加按钮和文本框,并在Activity代码中实现这些元素的功能。 其次,我们需要编写Service类来实现音乐播放功能。在这个类中,我们将使用Media Player组件来实现音乐的播放、暂停、停止和跳过等基本功能。我们可以根据用户的需求添加一些额外的功能,如随机播放或循环播放等。 最后,在主Activity中,我们需要通过启动Service来实际播放音乐。我们可以在Activity代码中添加一个启动Service的方法,最终让应用程序能够在用户点击界面上的播放音乐按钮时开始播放音乐。 本地音乐播放器是一个较为简单的应用程序,但其使用到了Java语言和Android API中的许多基本组件和方法。这个应用程序可以为用户提供播放存储在设备中的音乐文件的基本功能,也可以为其他音乐相关的应用程序提供基本的框架。 ### 回答3: Android Studio 是一款官方出品的开发 Android 应用程序的集成开发工具。通过 Android Studio 可以方便地开发 Android 应用,其中就包括音乐播放器应用。本地音乐播放器可以实现本地音乐文件的播放,也可以提供搜索和在线下载功能。在 Android Studio 中,实现本地音乐播放器需要一些基本技能和步骤。 首先,在 Android Studio 中创建一个新的工程。可以选择空项目或者自带模板,根据需要进行设置,比如应用名、包名、所需权限等。 然后,在主界面中添加音乐列表显示控件、播放控制按钮等基本元素。可以使用 Recycler View 组件来显示音乐列表,使用 Media Player 来实现音乐的播放功能。 接着,需要实现音乐列表的加载和解析功能。可以使用 Content Resolver 对本地音乐文件进行扫描,并记录音乐文件的信息,如名称、时长、路径等,以便进行后续的访问和操作。 最后,实现音乐播放控制功能。可以使用 Media Player 来实现音乐的播放、暂停、停止等功能。还可以添加其他功能,如列表循环、单曲循环、随机播放等,以增强用户体验。 除了以上的基本步骤,还可以对音乐播放器应用进行个性化设置,比如主题样式、自定义播放界面等。需要注意的是,在处理本地音乐文件时,需要注意权限管理和文件访问控制,以确保应用的合法合规运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值