1、安卓Android广播线程服务与多媒体开发实验报告实 验 报 告(2013/2014学年 第一学期)课程名称软件技术系列课程(Android基础)实验名称Android广播、线程、服务与多媒体开发实验时间2013年12月9日指导单位计算机学院、诚迈科技(南京)公司指导教师学生姓名班级学号学院(系)计算机学院专 业软件工程(计算机软件与服务外包)成 绩批阅人王彦日期2013-12-09实 验 报 告实验名称Android广播、线程、服务与多媒体开发指导教师实验类型实验实验学时4实验时间2013-12-9一、 实验目的和要求验证Broadcast的发送与接收验证多线程间的数据传递验证Service
2、的使用方法验证多媒体开发中音频、视频、或图像的采集与播放编写一个Android小程序要求:1、使用广播传递数据或信息2、使用多线程3、适当应用Service4、实现至少一种多媒体功能 二、 实验环境(实验设备) PC(Window7)、Eclipse3、实验原理及内容在这个程序中涉及到了Receiver和BroadcastReceiver的结合使用,首先在AndroidManifest.xml中注册Receiver,实现能够在后台播放音乐的功能。 通过CommandReceiver类实现接受前台Activity发送的播放命令的Intent。在CommandReceiver类中,有后台Servi
3、ce注册的接受前台控制命令Intent的Receiver,广播播放状态变化的Intent代码public class MusicService extends Service implements Runnable private MediaPlayer player; private List lists; public static int _id = 1; / 当前播放位置 public static Boolean isRun = true; public LrcProcess mLrcProcess; public LrcView mLrcView; public static in
4、t playing_id = 0; public static Boolean playing = false; Override public IBinder onBind(Intent arg0) / TODO Auto-generated method stub return null; Override public void onCreate() / TODO Auto-generated method stub lists = MusicList.getMusicData(getApplicationContext(); SeekBarBroadcastReceiver recei
5、ver = new SeekBarBroadcastReceiver(); IntentFilter filter = new IntentFilter(.karl.seekBar); this.registerReceiver(receiver, filter); new Thread(this).start(); super.onCreate(); Override public void onStart(Intent intent, int startId) / TODO Auto-generated method stub String play = intent.getStringE
6、xtra(play); _id = intent.getIntExtra(id, 1); if (play.equals(play) if (null != player) player.release(); player = null; playMusic(_id); else if (play.equals(pause) if (null != player) player.pause(); else if (play.equals(playing) if (player != null) player.start(); else playMusic(_id); else if (play
7、.equals(replaying) else if (play.equals(first) int id = intent.getIntExtra(id, 0); playMusic(id); else if (play.equals(rewind) int id = intent.getIntExtra(id, 0); playMusic(id); else if (play.equals(forward) int id = intent.getIntExtra(id, 0); playMusic(id); else if (play.equals(last) int id = inten
8、t.getIntExtra(id, 0); playMusic(id); private void playMusic(int id) / / 初始化歌词配置 / / mLrcProcess = new LrcProcess(); / 读取歌词文件 mLrcProcess.readLRC(lists.get(_id).getUrl(); / 传回处理后的歌词文件 lrcList = mLrcProcess.getLrcContent(); MusicActivity.lrc_view.setSentenceEntities(lrcList); / 切换带动画显示歌词 MusicActivity
9、.lrc_view.setAnimation(AnimationUtils.loadAnimation( MusicService.this, R.anim.alpha_z); / 启动线程 mHandler.post(mRunnable); / / 初始化歌词配置 / / if (null != player) player.release(); player = null; if (id = lists.size() - 1) _id = lists.size() - 1; else if (id = 0) _id = 0; Music m = lists.get(_id); String
10、 url = m.getUrl(); Uri myUri = Uri.parse(url); player = new MediaPlayer(); player.reset(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); try player.setDataSource(getApplicationContext(), myUri); player.prepare(); catch (IllegalArgumentException e) / TODO Auto-generated catch block e.printSta
11、ckTrace(); catch (SecurityException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalStateException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); player.start(); player.setOnCompletionList
12、ener(new OnCompletionListener() Override public void onCompletion(MediaPlayer mp) / TODO Auto-generated method stub / 下一首 if (MusicActivity.isLoop = true) player.reset(); Intent intent = new Intent(pletion); sendBroadcast(intent); _id = _id + 1; playMusic(_id); else / 单曲播放 player.reset(); Intent int
13、ent = new Intent(pletion); sendBroadcast(intent); playMusic(_id); ); player.setOnErrorListener(new OnErrorListener() Override public boolean onError(MediaPlayer mp, int what, int extra) / TODO Auto-generated method stub if (null != player) player.release(); player = null; Music m = lists.get(_id); S
14、tring url = m.getUrl(); Uri myUri = Uri.parse(url); player = new MediaPlayer(); player.reset(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); try player.setDataSource(getApplicationContext(), myUri); player.prepare(); catch (IllegalArgumentException e) / TODO Auto-generated catch block e.pri
15、ntStackTrace(); catch (SecurityException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalStateException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); player.start(); return false; ); priv
16、ate class SeekBarBroadcastReceiver extends BroadcastReceiver Override public void onReceive(Context context, Intent intent) / TODO Auto-generated method stub int seekBarPosition = intent.getIntExtra(seekBarPosition, 0); / System.out.println(-+seekBarPosition); player.seekTo(seekBarPosition * player.
17、getDuration() / 100); player.start(); Override public void run() / TODO Auto-generated method stub while (isRun) try Thread.sleep(200); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); if (null != player) int position = player.getCurrentPosition(); int total = pl
18、ayer.getDuration(); Intent intent = new Intent(.karl.progress); intent.putExtra(position, position); intent.putExtra(total, total); sendBroadcast(intent); if (null != player) if (player.isPlaying() playing = true; else playing = false; Handler mHandler = new Handler(); / 歌词滚动线程 Runnable mRunnable =
19、new Runnable() Override public void run() / TODO Auto-generated method stub MusicActivity.lrc_view.SetIndex(LrcIndex(); MusicActivity.lrc_view.invalidate(); mHandler.postDelayed(mRunnable, 100); ; / 创建对象 private List lrcList = new ArrayList(); / 初始化歌词检索值 private int index = 0; / 初始化歌曲播放时间的变量 private
20、 int CurrentTime = 0; / 初始化歌曲总时间的变量 private int CountTime = 0; /* * 歌词同步处理类 */ public int LrcIndex() if (player.isPlaying() / 获得歌曲播放在哪的时间 CurrentTime = player.getCurrentPosition(); / 获得歌曲总时间长度 CountTime = player.getDuration(); if (CurrentTime CountTime) for (int i = 0; i lrcList.size(); i+) if (i lr
21、cList.size() - 1) if (CurrentTime lrcList.get(i).getLrc_time() & CurrentTime lrcList.get(i).getLrc_time() index = i; return index; 4、实验小结(包括问题和解决方法、心得体会等) 1.对于sendBroadCast的intent对象,需要设置其actionname;2.推荐使用显式指明receiver,在配置文件AndroidManifest.xml指明;3.一个receiver可以接收多个action; 4.每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive; 5.在BroadCast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。通过这次实验,让我对Broadcast、尤其是Service有了更深入的认识,还让我意识到编程方面和知识体系机构方面存在的不足 。总之,这次试验让我Android编程能力有了一定的提高。利用这次试验,也将我们的大作业更加完善。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1