博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Service的简易音乐播放器
阅读量:2489 次
发布时间:2019-05-11

本文共 6334 字,大约阅读时间需要 21 分钟。

第一步在MainActivity中获取XML中的组件并初始化界面点击事件,在MainActivity建一个ActivityReceiver继承BroadcastReceiver用以监听歌曲状态的变化从而更新UI,代码如下:

public class MainActivity extends Activity implements View.OnClickListener{    TextView title,author,situation;    Button play,stop;    //  播放控制开始结束控制ACTION    public static final String CTL_ACTION = "com.example.service_musicplayer.ctl_action";    //  歌曲播放状态ACTION    public static final String UPDATE_ACTION = "com.example.service_musicplayer.update_action";    ActivityReceiver activityReceiver;    //定义播放状态  0x11代表没有播放  0x12 代表正在播放  0x13代表暂停    int status = 0x11;    //  存放歌曲名    String titleStr[] = {"Music-1","Music-2","Music-3"};    //  存放歌手名    String authorStr[] = {"author-1","author-2","author-3"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        play = (Button) findViewById(R.id.play);        stop = (Button) findViewById(R.id.stop);        title = (TextView) findViewById(R.id.title);        author = (TextView) findViewById(R.id.author);        situation = (TextView) findViewById(R.id.situation);        play.setOnClickListener(this);        stop.setOnClickListener(this);        //  使用代码方式为broadcastReceiver注册监听         activityReceiver = new ActivityReceiver();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction(UPDATE_ACTION);        //  注册broadcastReceiver        registerReceiver(activityReceiver,intentFilter);        Intent intent = new Intent(this,MusicService.class);        startService(intent);    }    @Override    public void onClick(View v) {        Intent intent = new Intent();        intent.setAction(CTL_ACTION);        switch (v.getId()){            case R.id.play:                intent.putExtra("control",1);                break;            case R.id.stop:                intent.putExtra("control",2);                break;        }      	sendBroadcast(intent);    }    //   自定义BroadcastReceiver 监听Servicec传来的广播    public class ActivityReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            String str = "";            int update  = intent.getIntExtra("update",-1);            int current = intent.getIntExtra("current",-1);            if(current >= 0){                title.setText(titleStr[current]);                author.setText(authorStr[current]);            }            switch (update){                case 0x11:               //     status = 0x11;                    str = "未播放";                    break;                case 0x12:              //      status = 0x12;                    str = "正在播放";                    break;                case 0x13:               //     status = 0x13;                    str = "暂停";                    break;            }            situation.setText(str);        }    }}

第二步:新建MusicService继承Service,MusicService中建了一个MyReceiver类继承BroadcastReceiver类用以监听歌曲播放状态的变化,以广播的方式将歌曲播放状态发出,在MainActivity中的ActivityReceiver能监听到此状态变化来更新UI,代码如下:

public class MusicService extends Service {    String musics[] = new String[]{"Leo Kayyu - Nokia Tune(Remix).mp3", "canon.mp3", "Cvked - iphone(Caked Up Mashup).mp3"};    int current = 0;    int status = 0x11; // 0x11不在播放状态  0x12正在播放  0x13暂停播放    MediaPlayer mediaPlayer;    AssetManager am;    MyReceiver serviceReceiver;    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        am = getAssets();        serviceReceiver = new MyReceiver();        //  代码方式为MyReceiver注册        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction(MainActivity.CTL_ACTION);        registerReceiver(serviceReceiver,intentFilter);        mediaPlayer = new MediaPlayer();        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {            @Override            public void onCompletion(MediaPlayer mp) {                current++;                if(current>=3) {                    current = 0;                }                    Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                    sendIntent.putExtra("current",current);                    sendBroadcast(sendIntent);                    prepareAndPlay(musics[current]);            }        });    }    //   监听歌曲的播放状态,在歌曲播放状态改变时触发    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){                        mediaPlayer.pause();                        status = 0x13;                        //  原来处于暂停状态                    }else if(status == 0x13){                        mediaPlayer.start();                        status = 0x12;                    }                    break;                case 2:                    //  原来在播放或暂停状态                    if(status == 0x12 || status == 0x13){                        mediaPlayer.stop();                        status = 0x11;                    }                    break;            }            Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);            sendIntent.putExtra("update",status);            sendIntent.putExtra("current",current);            sendBroadcast(sendIntent);        }    }    public void prepareAndPlay(String music){        try {
	    mediaPlayer.reset();            AssetFileDescriptor afd = am.openFd(URLEncoder.encode(music,"utf-8"));            mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());            // 准备声音            mediaPlayer.prepare();            // 播放            mediaPlayer.start();        } catch (IOException e) {            e.printStackTrace();        }    }}
:程序的布局文件

运行界面如下:

注意事项
:歌曲文件放在assets文件下,使用Android studio 时没有assets文件就要自己新建一个assets文件,歌曲名不能有中文,另在程序中为两个广播注册了再配置文件中无须再注册,但记得在AndroidManifest.xml中注册service,注册注册代码为:
(以上代码参照了安卓疯狂讲义,但是书上没讲音频文件应该放在哪里,自己新添了播放状态TextView)

转载地址:http://uhxrb.baihongyu.com/

你可能感兴趣的文章
数据结构和算法6-非线性-图
查看>>
数据结构和算法7-搜索
查看>>
数据结构和算法8-排序
查看>>
windows缺少dll解决办法
查看>>
JPA多条件动态查询
查看>>
JPA自定义sql
查看>>
BigDecimal正确使用了吗?
查看>>
joplin笔记
查看>>
JNDI+springmvc使用
查看>>
vue+springboot分页交互
查看>>
vue+springboot打包发布
查看>>
XSL 开发总结
查看>>
beta阶段第六次scrum meeting
查看>>
SpringBoot+MybatisPlus实现批量添加的两种方式
查看>>
vue 设计结构
查看>>
Sqlerver2005+按照ID分组取前几条
查看>>
Python的编码和解码
查看>>
docker
查看>>
停车场系统安全岛设计施工要求
查看>>
Docker实战
查看>>