安卓Android广播线程服务与多媒体开发实验报告Word格式.docx
《安卓Android广播线程服务与多媒体开发实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《安卓Android广播线程服务与多媒体开发实验报告Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
日期
2013-12-09
实验类型
实验
实验学时
4
2013-12-9
一、实验目的和要求
验证Broadcast的发送与接收
验证多线程间的数据传递
验证Service的使用方法
验证多媒体开发中音频、视频、或图像的采集与播放
编写一个Android小程序要求:
1、使用广播传递数据或信息
2、使用多线程
3、适当应用Service
4、实现至少一种多媒体功能
二、实验环境(实验设备)
PC(Window7)、Eclipse
3、实验原理及内容
在这个程序中涉及到了Receiver和BroadcastReceiver的结合使用,首先在AndroidManifest.xml中注册Receiver,实现能够在后台播放音乐的功能。
通过CommandReceiver类实现接受前台Activity发送的播放命令的Intent。
在CommandReceiver类中,有后台Service注册的接受前台控制命令Intent的Receiver,广播播放状态变化的Intent
代码
publicclassMusicServiceextendsServiceimplementsRunnable{
privateMediaPlayerplayer;
privateList<
Music>
lists;
publicstaticint_id=1;
//当前播放位置
publicstaticBooleanisRun=true;
publicLrcProcessmLrcProcess;
publicLrcViewmLrcView;
publicstaticintplaying_id=0;
publicstaticBooleanplaying=false;
@Override
publicIBinderonBind(Intentarg0){
//TODOAuto-generatedmethodstub
returnnull;
}
publicvoidonCreate(){
lists=MusicList.getMusicData(getApplicationContext());
SeekBarBroadcastReceiverreceiver=newSeekBarBroadcastReceiver();
IntentFilterfilter=newIntentFilter("
.karl.seekBar"
);
this.registerReceiver(receiver,filter);
newThread(this).start();
super.onCreate();
publicvoidonStart(Intentintent,intstartId){
Stringplay=intent.getStringExtra("
play"
_id=intent.getIntExtra("
id"
1);
if(play.equals("
)){
if(null!
=player){
player.release();
player=null;
}
playMusic(_id);
}elseif(play.equals("
pause"
player.pause();
playing"
if(player!
=null){
player.start();
}else{
playMusic(_id);
replaying"
first"
intid=intent.getIntExtra("
0);
playMusic(id);
rewind"
forward"
last"
}
privatevoidplayMusic(intid){
/////////////////////////初始化歌词配置/////////////////////////
mLrcProcess=newLrcProcess();
//读取歌词文件
mLrcProcess.readLRC(lists.get(_id).getUrl());
//传回处理后的歌词文件
lrcList=mLrcProcess.getLrcContent();
MusicActivity.lrc_view.setSentenceEntities(lrcList);
//切换带动画显示歌词
MusicActivity.lrc_view.setAnimation(AnimationUtils.loadAnimation(
MusicService.this,R.anim.alpha_z));
//启动线程
mHandler.post(mRunnable);
if(null!
player.release();
player=null;
if(id>
=lists.size()-1){
_id=lists.size()-1;
}elseif(id<
=0){
_id=0;
Musicm=lists.get(_id);
Stringurl=m.getUrl();
UrimyUri=Uri.parse(url);
player=newMediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
try{
player.setDataSource(getApplicationContext(),myUri);
player.prepare();
}catch(IllegalArgumentExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SecurityExceptione){
}catch(IllegalStateExceptione){
}catch(IOExceptione){
player.start();
player.setOnCompletionListener(newOnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermp){
//TODOAuto-generatedmethodstub
//下一首
if(MusicActivity.isLoop==true){
player.reset();
Intentintent=newIntent("
pletion"
sendBroadcast(intent);
_id=_id+1;
playMusic(_id);
}else{//单曲播放
}
});
player.setOnErrorListener(newOnErrorListener(){
publicbooleanonError(MediaPlayermp,intwhat,intextra){
if(null!
player.release();
player=null;
Musicm=lists.get(_id);
Stringurl=m.getUrl();
UrimyUri=Uri.parse(url);
player=newMediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
try{
player.setDataSource(getApplicationContext(),myUri);
player.prepare();
}catch(IllegalArgumentExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SecurityExceptione){
}catch(IllegalStateExceptione){
}catch(IOExceptione){
returnfalse;
privateclassSeekBarBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//TODOAuto-generatedmethodstub
intseekBarPosition=intent.getIntExtra("
seekBarPosition"
//System.out.println("
--------"
+seekBarPosition);
player.seekTo(seekBarPosition*player.getDuration()/100);
player.start();
publicvoidrun(){
while(isRun){
try{
Thread.sleep(200);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
intposition=player.getCurrentPosition();
inttotal=player.getDuration();
Intentintent=newIntent("
.karl.progress"
intent.putExtra("
position"
position);
total"
total);
sendBroadcast(intent);
if(player.isPlaying()){
playing=true;
}else{
playing=false;
HandlermHandler=newHandler();
//歌词滚动线程
RunnablemRunnable=newRunnable(){
publicvoidrun(){
MusicActivity.lrc_view.SetIndex(LrcIndex());
MusicActivity.lrc_view.invalidate();
mHandler.postDelayed(mRunnable,100);
};
//创建对象
LrcContent>
lrcList=newArrayList<
();
//初始化歌词检索值
privateintindex=0;
//初始化歌曲播放时间的变量
privateintCurrentTime=0;
//初始化歌曲总时间的变量
privateintCountTime=0;
/**
*歌词同步处理类
*/
publicintLrcIndex(){
if(player.isPlaying()){
//获得歌曲播放在哪的时间
CurrentTime=player.getCurrentPosition();
//获得歌曲总时间长度
CountTime=player.getDuration();
if(CurrentTime<
CountTime){
for(inti=0;
i<
lrcList.size();
i++){
if(i<
lrcList.size()-1){
if(CurrentTime<
lrcList.get(i).getLrc_time()&
&
i==0){
index=i;
}
if(CurrentTime>
lrcList.get(i).getLrc_time()
&
CurrentTime<
lrcList.get(i+1).getLrc_time()){
if(i==lrcList.size()-1
&
CurrentTime>
lrcList.get(i).getLrc_time()){
index=i;
returnindex;
}
4、实验小结(包括问题和解决方法、心得体会等)
1.对于sendBroadCast的intent对象,需要设置其actionname;
2.推荐使用显式指明receiver,在配置文件AndroidManifest.xml指明;
3.一个receiver可以接收多个action;
4.每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive;
5.在BroadCast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。
通过这次实验,让我对Broadcast、尤其是Service有了更深入的认识,还让我意识到编程方面和知识体系机构方面存在的不足。
总之,这次试验让我Android编程能力有了一定的提高。
利用这次试验,也将我们的大作业更加完善。