【Android 本地音乐播放器 一个简单的音乐播放器——附源码】

无聊做了一个本地音乐播放器,功能有:获取本地的音乐文件,对音乐进行播放,可以上一首,下一首,列表循环播放,单曲循环播放,随机播放。
页面很简单,只有两个页面页面如图所示:
在这里插入图片描述
在这里插入图片描述
视频预览:在这里插入图片描述

主要代码讲解:

权限申请

在清单文件中加入权限

	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

然后发起权限申请

//请求权限
        requestPermissions(new String[]{
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                android.Manifest.permission.READ_EXTERNAL_STORAGE,
        },0);
      

权限申请结果

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        boolean grant=true;
        if (requestCode==0){
            for (Integer integer:grantResults){
                if (integer != 0) {
                    grant = false;
                    break;
                }
            }
            //权限给了,就获取音乐
            if (grant){
                getMusic();
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

获取本地音乐

//使用ContentResolver获取音乐
    private void getMusic(){
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        if (cursor!=null){
            while (cursor.moveToNext()){
                String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                if (duration==null)continue;
                if (Integer.parseInt(duration)>5000){
                    int i = Integer.parseInt(duration);
                    String time = String.format(getString(R.string.s_s), format(i / 1000 / 60), format(i / 1000 % 60));
                    Music music = new Music(title, artist, data, time,i);
                    musicList.add(music);
                }
                musicAdapter.notifyDataSetChanged();
                App.getService().setMusicList(musicList);
            }
            cursor.close();
        }
    }

设置音乐信息

    private void setMusic(Music music){
        //设置音乐名
        title.setText(music.getTitle());
        cover.setImageResource(R.drawable.music);
        //显示音乐进度条时长
        end.setText(music.getTime());

        //设置进度条总时长
        seekBar.setMax(music.getDuration()/1000);
        //进度条拖动监听
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser&&App.getService().isPlaying()) {
                    App.getService().seekTo(progress*1000);
                    start.setText(String.format(getString(R.string.s_s), format(progress / 60), format(progress % 60)));
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // 不需要处理
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                if (!App.getService().isPlaying()){
                    start.setText(R.string._00_00);
                    seekBar.setProgress(0);
                }
            }
        });
    }

更新进度条

    //更新进度条
    private void updateSeekBar() {
        runnable = new Runnable() {
            @Override
            public void run() {
                if (App.getService() != null&&App.getService().isPlaying()) {
                    rotationAnimator.resume();
                    btn_play.setImageResource(R.drawable.ic_play_btn_pause);
                    int currentPosition = App.getService().getNow();
                    seekBar.setProgress(currentPosition/1000);
                    start.setText(String.format(getString(R.string.s_s), format(currentPosition / 1000 / 60), format(currentPosition / 1000 % 60)));
                }
                else {
                    rotationAnimator.pause();
                    btn_play.setImageResource(R.drawable.ic_play_btn_play);
                }
                handler.postDelayed(this, 1000); // 每秒更新一次进度条
            }
        };
        handler.postDelayed(runnable, 0);
    }

Music实体类

public class Music implements Serializable {
    private String title,artist,data, time;
    private int duration;
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getArtist() {
        return artist;
    }
 
    public void setArtist(String artist) {
        this.artist = artist;
    }
 
    public String getData() {
        return data;
    }
 
    public void setData(String data) {
        this.data = data;
    }
 
    public String getTime() {
        return time;
    }
 
    public void setTime(String time) {
        this.time = time;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }

    public Music(String title, String artist, String data, String time, int duration) {
        this.title = title;
        this.artist = artist;
        this.data = data;
        this.time = time;
        this.duration = duration;
    }
}

音乐播放服务

public class MusicService extends Service implements MediaPlayer.OnCompletionListener{
    private final IBinder binder = new MusicBinder();
    private MediaPlayer mediaPlayer;
    private List<Music> musicList=new ArrayList<>();
    private int position;
    private int status=0;
    private Music music;
    private Random random = new Random();
    private int lowerBound = 0; // 最小值
    private int upperBound = 0; // 最大值
    public MusicService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        if (mediaPlayer==null){
            mediaPlayer=new MediaPlayer();
            mediaPlayer.setOnCompletionListener(this);
        }
    }

    //判断是否正在播放
    public boolean isPlaying(){
        return mediaPlayer.isPlaying();
    }
    //设置音乐
    public void setMusic(Music music){
        if (music!=null){
            this.music=music;
            RxBus.getDefault().removeAllStickyEvents();
            RxBus.getDefault().postSticky(music);
            mediaPlayer.reset();
            try {
                mediaPlayer.setDataSource(music.getData());
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public Music getMusic(int position){
        if (position>=0&&position<musicList.size()){
            return musicList.get(position);
        }
        return null;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public void setData(int position){
        this.position = position;
        if (position>=0&&position<musicList.size()){
            setMusic(musicList.get(position));
        }
    }

    public void setMusicList(List<Music> musicList) {
        this.musicList = musicList;
        upperBound=musicList.size()-1;
    }
    //上一首
    public void pre(){
        if (status==1){
            randomPlay();
        }
        else {
            position=(position-1) % musicList.size();
            if (position<0){
                position=musicList.size()-1;
            }
            Music music = musicList.get(position);
            if (music!=null){
                setMusic(music);
                playOrPause();
            }
        }
    }
    //下一首
    public void next(){
        if (status==1){
            randomPlay();
        }
        else {
            position=(position+1) % (musicList.size());
            Music music = musicList.get(position);
            if (music!=null){
                setMusic(music);
                playOrPause();
            }
        }

    }

    //真·随机播放
    public void randomPlay(){
        position=random.nextInt(upperBound - lowerBound + 1) + lowerBound;
        setData(position);
        playOrPause();
    }
    //单曲循环
    public void loop(){
        setData(position);
        playOrPause();
    }
    public void setStatus(int status){
        this.status=status;
    }

    public int getStatus() {
        return status;
    }

    public Music getNowPlay(){
        return music;
    }
    //播放
    public void playOrPause(){
        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }
        else {
            mediaPlayer.start();
        }
    }
    //进度改变
    public void seekTo(int i){
        mediaPlayer.seekTo(i);
    }

    //获取当前的播放进度
    public int getNow(){
        if (mediaPlayer.isPlaying()){
            return mediaPlayer.getCurrentPosition();
        }
        return 0;
    }
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        if (status==0){
            next();
        }
        else if (status==1){
            randomPlay();
        }
        else if (status==2){
            loop();
        }
    }

    public class MusicBinder extends Binder{
        //返回Service对象
        MusicService getService(){
            return MusicService.this;
        }
    }

    public interface OnStatusChangeListener{
        void onChange(Music music);
    }
}

源码

下载地址:源码下载

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答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 来实现音乐的播放、暂停、停止等功能。还可以添加其他功能,如列表循环、单曲循环、随机播放等,以增强用户体验。 除了以上的基本步骤,还可以对音乐播放器应用进行个性化设置,比如主题样式、自定义播放界面等。需要注意的是,在处理本地音乐文件时,需要注意权限管理和文件访问控制,以确保应用的合法合规运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值