前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实验三 音乐播放器

实验三 音乐播放器

作者头像
twelvecoder
发布2021-12-24 09:43:32
1.4K0
发布2021-12-24 09:43:32
举报
文章被收录于专栏:十二的树洞

实验三: 音乐播放器

实验目标和实验内容:

1、掌握服务的基本概念,能编写服务过程并进行调用; 2、掌握广播的基本概念,能实现广播通信。 3、需实现的具体功能为: 短信到来时自动产生的系统广播→激活音乐播放服务程序→活动组件程序使得停止按钮可用。 实现思路 • MainActivity启动服务,将播放、暂停、停止、切换信号发送广播给Service • MusicService 调用函数Prepareandplay()播放音乐,发送广播给MainActivity返回歌曲id • PrepareAndPlay() 定向操作 打开并播放音乐文件 注意的点 • 记得在配置文件中注册服务 • 注意findViewById在Fragment的使用方法 • 在Fragment中给ImageButton绑定事件监听器要重写onActivityCreated方法

第一步:在tab02中添加按钮组件以及文本框

在这里插入图片描述
在这里插入图片描述

第二步,在frdFragment中添加对按钮的监听并发送广播

代码语言:javascript
复制
public class frdFragment extends Fragment implements View.OnClickListener {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;


    TextView title, author;
    ImageButton play, stop,last,next;

    ActivityReceiver activityReceiver;

    public static final String CTL_ACTION=
            "org.jay.action.CTL_ACTION";
    public static final String UPDATE_ACTION=
            "org.jay.action.UPDATE_ACTION";
    int status = 0x11;
    String[] titleStrs = new String[] { "Legends Never Die", "约定", "美丽新世界","???"};
    String[] authorStrs = new String[] {"英雄联盟", "周蕙", "伍佰","???"};

创建fragment类并继承监听接口

代码语言:javascript
复制
public void onClick(View view) {
        Intent intent = new Intent(CTL_ACTION);
        //在主界面按下对应按钮,传递给service对应参数
        switch (view.getId())
        {
            case R.id.play:
                intent.putExtra("control",1);
                break;
            case R.id.stop:
                intent.putExtra("control",2);
                break;
            case R.id.last:
                intent.putExtra("control",3);
                break;
            case R.id.next:
                intent.putExtra("control",4);
                break;
        }
        getActivity().sendBroadcast(intent);

    }

配置监听到点击时的触发事件

代码语言:javascript
复制
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }


        activityReceiver = new ActivityReceiver();
        IntentFilter filter = new IntentFilter(UPDATE_ACTION);
        getActivity().getApplicationContext().registerReceiver(activityReceiver,filter);


        Intent intent = new Intent(getActivity(),MusicService.class);

        getActivity().startService(intent);


    }

创建intent

代码语言:javascript
复制
class ActivityReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //获取来自receive中intent的update消息,代表播放状态
            int update = intent.getIntExtra("update",-1);
            //获取来自receive中intent的curruent消息,代表正在播放的歌曲
            int current = intent.getIntExtra("current",-1);
            //如果状态为正在播放歌曲或暂停
            if(current>=0 && (update == 0x12 || update == 0x13))
            {
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }
            //如果状态为未播放歌曲
            else if (update == 0x11)
            {
                title.setText("未播放歌曲");
                author.setText("未播放歌曲");
            }
            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;
            }

        }
    }
接收广播并控制播放器的状态
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.tab02,container,false);


        // 监听需要添加在onCreateView()中,而非onCreate()。

        //找到对应控件
        play = view.findViewById(R.id.play);
        stop = view.findViewById(R.id.stop);
        next = view.findViewById(R.id.next);
        last = view.findViewById(R.id.last);
        title = view.findViewById(R.id.name);
        author = view.findViewById(R.id.singer);




        //添加监听
        play.setOnClickListener(this);
        stop.setOnClickListener(this);
        next.setOnClickListener(this);
        last.setOnClickListener(this);



        return view;
    }
}

获取组件 第三步,配置音乐播放器

代码语言:javascript
复制
public class MyReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(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)
                    {
                        //暂停
                        mPlayer.pause();
                        //改变为暂停状态
                        status=0x13;
                    }
                    //原来处于暂停状态
                    else if (status==0x13)
                    {
                        //播放
                        mPlayer.start();
                        //改变状态
                        status=0x12;
                    }
                    break;
                //停止声音
                case 2:
                    //如果原来正在播放或暂停
                    if (status==0x12||status==0x13) {
                        //停止播放
                        mPlayer.stop();
                        status = 0x11;
                    }
                    break;
                case 3:
                    //原来处于没有播放或暂停状态
                    if (status==0x11||status==0x13)
                    {
                        if(current==0) {
                            current=3;
                        }
                        //准备并播放音乐
                        else {
                            current=current-1;
                        }
                        prepareAndPlay(musics[current]);
                        status=0x12;
                    }



                    //原来处于播放状态
                    else if (status==0x12)
                    {
                        //上一首//准备并播放音乐
                        if(current==0) {
                            current=3;
                        }
                        else {
                            current=current-1;
                        }
                        prepareAndPlay(musics[current]);
                    }
                    break;


                case 4:
                    //原来处于没有播放或暂停状态
                    if (status==0x11||status==0x13)
                    {
                        if(current==3) {
                            current=0;
                        }   //准备并播放音乐
                        else {
                            current=current+1;
                        }
                        prepareAndPlay(musics[current]);
                        status=0x12;
                    }
                    else if (status==0x12)
                    {
                        if(current==3) {
                            current=0;
                        }
                        else {
                            current=current+1;
                        }
                        prepareAndPlay(musics[current]);
                    }
                    break;
            }
            //广播通知Activity更改图标、文本框
            Intent sendIntent=new Intent(frdFragment.UPDATE_ACTION);
            sendIntent.putExtra("update",status);
            sendIntent.putExtra("current",current);
            //发送广播,将被Activity组件中的BroadcastReceiver接收
            sendBroadcast(sendIntent);
        }
    }

接收frdFragment的控制信息并对于不同状态下的播放器执行对于不同控制信息的事件,并发送播放器的状态和歌曲编号给fragment

代码语言:javascript
复制
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();
        }
    }
}
实验结果:(实验小结与结果截图)
在这里插入图片描述
在这里插入图片描述

实验小结 1.对于sendBroadCas的intent对象,需要设置其actionname; 2.推荐使用显式指明receiver,在配置文件指明; 3.一个receiver可以接收多个action; 4.每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive; 5. 在Broadcast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验三: 音乐播放器
    • 实验目标和实验内容:
      • 实验结果:(实验小结与结果截图)
      相关产品与服务
      短信
      腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档