文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在Android中实现一个音乐播放器

2023-06-15 01:57

关注

如何在Android中实现一个音乐播放器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

实现过程

导入项目所需的音乐文件、图标、背景等

创建一个raw文件夹,将音乐文件导入到这个文件夹中,方便我们在项目中使用

在drawable中导入所需的图片、图标

设计UI界面

设计5个button控件,分别对应上一曲,下一曲,暂停,播放,退出

设计3个TextView,分别对应歌曲的介绍信息、歌曲的进度(歌曲的总时间和歌曲当前播放的时间)、歌曲的名字

service服务的编写
创建一个MusicService对象继承Service

MusicService所需要的成员变量

MyReceiver serviceReceiver;Thread processThread;AssetManager am;//是附件管理器,用于根据文件名找到文件所在并打开文件String[] musics = new String[]{"legendsneverdie.mp3", "promise.mp3",        "beautiful.mp3"};//默认显示的歌曲信息MediaPlayer mPlayer;// 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;// 记录当前正在播放的音乐int current = 0;

实现循环播放

public void onCreate() {        super.onCreate();        am = getAssets();        // 创建BroadcastReceiver        serviceReceiver = new MyReceiver();        // 创建IntentFilter        IntentFilter filter = new IntentFilter();        filter.addAction(MainActivity.CTL_ACTION);        registerReceiver(serviceReceiver, filter);        // 创建MediaPlayer        mPlayer = new MediaPlayer();        // 为MediaPlayer播放完成事件绑定监听器        mPlayer.setOnCompletionListener(new OnCompletionListener()        {            @Override            public void onCompletion(MediaPlayer mp) {                Log.d("musicService", "播放完成");                current++;                if (current >= 3) {                    current = 0;                }                // 准备并播放音乐                prepareAndPlay(musics[current]);                //发送广播通知Activity更改文本框                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                sendIntent.putExtra("current", current);                sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition());                sendIntent.putExtra("totalTime", mPlayer.getDuration());                // 发送广播,将被Activity组件中的BroadcastReceiver接收到                sendBroadcast(sendIntent);            }        });    private void prepareAndPlay(String music) {        try {            // 打开指定音乐文件            AssetFileDescriptor afd = am.openFd(music);            mPlayer.reset();            // 使用MediaPlayer加载指定的声音文件。            mPlayer.setDataSource(afd.getFileDescriptor(),                    afd.getStartOffset(), afd.getLength());            // 准备声音            mPlayer.prepare();            // 播放            mPlayer.start();        } catch (IOException e) {            e.printStackTrace();        }    }

实现刷新进度条

processThread = new Thread(new Runnable() {        @Override        public void run() {            while (true) {                if (status == 0x12) {                    try {                        Thread.sleep(1000);                        Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                        sendIntent.putExtra("current", current);                        sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition());                        sendIntent.putExtra("totalTime", mPlayer.getDuration());                        // 发送广播,将被Activity组件中的BroadcastReceiver接收到                        sendBroadcast(sendIntent);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }    });    processThread.start();}

广播通信接收器的实现(用于实现和activity的通信)

public class MyReceiver extends BroadcastReceiver {    @Override    public void onReceive(final Context context, Intent intent) {        int control = intent.getIntExtra("control", -1);        Log.d("musicReceiver", "收到广播, control=" + control);        switch (control) {            // 播放或暂停            case 1:                // 原来处于没有播放状态                if (status == 0x11) {                    // 准备并播放音乐                    prepareAndPlay(musics[current]);                    status = 0x12;                }                // 原来处于播放状态                else if (status == 0x12) {                    // 暂停                    mPlayer.pause();                    // 改变为暂停状态                    status = 0x13;                }                // 原来处于暂停状态                else if (status == 0x13) {                    // 播放                    mPlayer.start();                    // 改变状态                    status = 0x12;                }                break;                // 下一首            case 2:                if (status == 0x12 || status == 0x13) {                    mPlayer.stop();                    if (current + 1 >= musics.length) {                        current = 0;                    } else {                        current++;                    }                    prepareAndPlay(musics[current]);                    status = 0x12;                    break;                }                // 上一首            case 3:                if (status == 0x12 || status == 0x13) {                    mPlayer.stop();                    if (current - 1 < 0) {                        current = musics.length - 1;                    } else {                        current--;                    }                    prepareAndPlay(musics[current]);                    status = 0x12;                }        }        // 广播通知Activity更改图标、文本框        Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);        sendIntent.putExtra("update", status);        sendIntent.putExtra("current", current);        // 发送广播,将被Activity组件中的BroadcastReceiver接收到        sendBroadcast(sendIntent);    }}

activity的实现

初始化和动态绑定接收器

// 获取界面中显示歌曲、作者文本框TextView title, author, currentTime, totalTime;// 播放/暂停、停止按钮ImageButton play;ImageView lastMusic, nextMusic;// 进度条ProgressBar progressBar;ActivityReceiver activityReceiver;public static final String CTL_ACTION =        "org.xr.action.CTL_ACTION";public static final String UPDATE_ACTION =        "org.xr.action.UPDATE_ACTION";// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;String[] titleStrs = new String[]{"Legends Never Die", "约定", "美丽新世界"};String[] authorStrs = new String[]{"英雄联盟", "周蕙", "伍佰"};@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    // 获取程序界面界面中的两个按钮    play = (ImageButton) this.findViewById(R.id.play);    lastMusic = this.findViewById(R.id.lastMusic);    nextMusic = this.findViewById(R.id.nextMusic);    title = (TextView) findViewById(R.id.title);    author = (TextView) findViewById(R.id.author);    currentTime = findViewById(R.id.currentTime);    totalTime = findViewById(R.id.totalTime);    progressBar = findViewById(R.id.progressBar);    // 为两个按钮的单击事件添加监听器    play.setOnClickListener(this);    lastMusic.setOnClickListener(this);    nextMusic.setOnClickListener(this);    activityReceiver = new ActivityReceiver();    // 创建IntentFilter    IntentFilter filter = new IntentFilter();    // 指定BroadcastReceiver监听的Action    filter.addAction(UPDATE_ACTION);    // 注册BroadcastReceiver    registerReceiver(activityReceiver, filter);    Intent intent = new Intent(this, MusicService.class);    // 启动后台Service    startService(intent);}

设置activity的广播接收器(接收service发送过来的广播)

public void onReceive(Context context, Intent intent) {    // 获取Intent中的update消息,update代表播放状态    int update = intent.getIntExtra("update", -1);    // 获取Intent中的current消息,current代表当前正在播放的歌曲    int current = intent.getIntExtra("current", -1);    int totalPosition = intent.getIntExtra("totalTime", -1);    int currentPosition = intent.getIntExtra("currentTime", -1);    Log.d("activityReceiver", "收到广播");    Log.d("activityReceiver", "current:" + current + " totalPosition:" + totalPosition + " currentPosition:" + currentPosition + " update:" + update);    if (current >= 0) {        title.setText(titleStrs[current]);        author.setText(authorStrs[current]);    }    if (totalPosition >= 0) {        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);        Date date = new Date(totalPosition);        String formatTime = simpleDateFormat.format(date);        totalTime.setText(formatTime);    }    if (currentPosition >= 0) {        double process = ((double)currentPosition / totalPosition)*100;        Log.d("activityReceiver", "当前进度:" + (double)currentPosition/totalPosition);        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);        Date date = new Date(currentPosition);        String formatTime = simpleDateFormat.format(date);        progressBar.setProgress((int) process);        currentTime.setText(formatTime);    }    switch (update) {        case 0x11:            play.setImageResource(R.drawable.play);            status = 0x11;            break;        // 控制系统进入播放状态        case 0x12:            // 播放状态下设置使用暂停图标            play.setImageResource(R.drawable.pause);            // 设置当前状态            status = 0x12;            break;        // 控制系统进入暂停状态        case 0x13:            // 暂停状态下设置使用播放图标            play.setImageResource(R.drawable.play);            // 设置当前状态            status = 0x13;            break;    }}

实现图标的点击功能

// 创建Intent    Intent intent = new Intent("org.xr.action.CTL_ACTION");    switch (source.getId()) {        // 按下播放/暂停按钮        case R.id.play:            intent.putExtra("control", 1);            break;        case R.id.lastMusic:            intent.putExtra("control", 3);        case R.id.nextMusic:            intent.putExtra("control", 2);    }    // 发送广播,将被Service组件中的BroadcastReceiver接收到    sendBroadcast(intent);}

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯