as音乐播放器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

目标:这次主要的实验目的就是在手机上实现一个简单的音乐播放,这其中我学到比较有感觉的知识就是关于广播一类方面的。在之后的代码中有体现到我学习到的东西。


一、MainActivity主界面

这部分是对于播放界面的代码分析。

LinearLayout
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="4">

        <ImageButton
            android:id="@+id/previous"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:layout_weight="1"
            android:background="#FFFFFF"
            android:src="@drawable/previous"
            android:contentDescription="TODO" />

        <ImageButton
            android:id="@+id/play"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:layout_weight="1"
            android:background="#FFFFFF"
            android:src="@drawable/play"
            android:contentDescription="TODO" />

        <ImageButton
            android:id="@+id/stop"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:layout_weight="1"
            android:background="#FFFFFF"
            android:src="@drawable/stop"
            android:contentDescription="TODO" />

        <ImageButton
            android:id="@+id/next"
            android:layout_width="0dp"
            android:layout_height="64dp"
            android:layout_weight="1"
            android:background="#FFFFFF"
            android:src="@drawable/next"
            android:contentDescription="TODO" />

    </LinearLayout>

这是关于按键的样式设计

static final String CTL_ACTION = "org.gssmhzf.action.CTL_ACTION";
static final String UPDATE_ACTION ="org.gssmhzf.action.UPDATE_ACTION";

定义两个广播监听的ACTION

public class ActivityReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {

            int update = intent.getIntExtra("update",-1);
            int current = intent.getIntExtra("current", -1);

            if (current >= 0){
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }

            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;

            }


        }
    }

这步是自定义广播,使其可以在serv和activity之间转换和传递

activityReceiver = new ActivityReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(UPDATE_ACTION);
        registerReceiver(activityReceiver,filter);
        Intent intent = new Intent(MainActivity.this,MusicService.class);
        startService(intent);



    }

    @Override
    public void onClick(View v) {

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


    }

这里是最关键的广播和监听两步骤,这使我们可以通过对按钮的操作可以发挥我们想要的作用,让播放器的功能初步实现。

二、MusicService部分代码

这部分是对于服务的代码分析。

private void prepareAndPlay(String music){
        try {
            AssetFileDescriptor afd = am.openFd(music);
            mediaPlayer.reset();
            mediaPlayer.setDataSource(afd.getFileDescriptor(),
                    afd.getStartOffset(), afd.getLength());
            mediaPlayer.prepare();
            mediaPlayer.start();
            Log.v("hxl","音乐开始");

        }catch (IOException e){
            e.printStackTrace();
        }
    }

这部分就是为我们的播放器准备音乐,有了音乐才能播放。

mPlayer = new MediaPlayer();
        // 为MediaPlayer播放完成事件绑定监听器
        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.d("MusicService", "歌曲播放完毕");
                current++;
                if (current >= 4)
                {
                    current = 0;
                }
                //发送广播通知Activity更改文本框
                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                sendIntent.putExtra("current", current);
                // 发送广播,将被Activity组件中的BroadcastReceiver接收到
                sendBroadcast(sendIntent);
                // 准备并播放音乐
                prepareAndPlay(musics[current]);
            }
        });

这部分是可以让我们没有对播放器进行操作时,播放器可以自己默认就是循环播放,不会说没有我们操控它就啥也不干。

   public class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(final Context context, Intent intent) {

            int control = intent.getIntExtra("control",-1);

            switch (control){
                case 1:
                    if (status == 0x11){
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    }
                    else if (status == 0x12){
                        mediaPlayer.pause();
                        status = 0x13;
                    }
                    else if (status == 0x13){
                        mediaPlayer.start();
                        status = 0x12;
                    }
                    break;
                case 2:
                    if (status == 0x12 || status == 0x13){
                        mediaPlayer.stop();
                        status = 0x11;
                    }
                case 3:
                    // 如果原来正在播放或暂停
                    if (status == 0x12 || status == 0x13) {
                        mediaPlayer.stop();
                        if (current - 1 < 0) {
                            current = musics.length - 1;
                        } else {
                            current--;
                        }
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    }
                    break;
                //下一首
                case 4:
                    if (status == 0x12 || status == 0x13) {
                        mediaPlayer.stop();
                        if (current + 1 >= musics.length) {
                            current = 0;
                        } else {
                            current++;
                        }
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    }
                    break;

这是对播放器现在的情况,进行一个逻辑控制,这样就可以对activity发送的信息进行处理


界面截图展示

在这里插入图片描述

总结

对这次实验进行总结:

这次实验是在as上进行代码,完成一个音乐播放器,这里运用了广播和监听的知识,使我们可以通过按钮让这个小程序进行我们需要的功能,还通过一些功能为播放器提供音乐,总体来说是比较基础但是非常经典的,让我们在实践的方面了解了Android上实现一个小播放器的步骤,在之后我也会进行进度条等方面的完善,这方面逐渐补充的过程我觉得还是能学到很多的。

全部代码请看:https://github.com/hxlzzz/MusicBoxHuang

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值