安卓Android广播线程服务与多媒体开发实验报告.docx
- 文档编号:12546635
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:17
- 大小:19.80KB
安卓Android广播线程服务与多媒体开发实验报告.docx
《安卓Android广播线程服务与多媒体开发实验报告.docx》由会员分享,可在线阅读,更多相关《安卓Android广播线程服务与多媒体开发实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
安卓Android广播线程服务与多媒体开发实验报告
实验报告
(2013/2014学年第一学期)
课程名称软件技术系列课程(Android基础)
实验名称Android广播、线程、服务与多媒体开发
实验时间2013年12月9日
指导单位计算机学院、诚迈科技(南京)公司
指导教师
学生姓名
班级学号
学院(系)
计算机学院
专
业
软件工程(计算机软件
与服务外包)
成绩批阅人王彦日期2013-12-09
实验报告
实验名称
Android广播、线程、服务与多媒体开发
指导教师
实验类型
实验
实验学时
4
实验时间
2013-12-9
一、实验目的和要求
验证Broadcast的发送与接收
验证多线程间的数据传递
验证Service的使用方法
验证多媒体开发中音频、视频、或图像的采集与播放
编写一个Android小程序要求:
1、使用广播传递数据或信息
2、使用多线程
3、适当应用Service
4、实现至少一种多媒体功能
二、实验环境(实验设备)
PC(Window7)、Eclipse
1
三、实验原理及内容
在这个程序中涉及到了Receiver和BroadcastReceiver的结合使用,首先在
AndroidManifest.xml中注册Receiver,实现能够在后台播放音乐的功能。
通过CommandReceiver类实现接受前台Activity发送的播放命令的
Intent。
在CommandReceiver类中,有后台Service注册的接受前台控制命
令Intent的Receiver,广播播放状态变化的Intent
代码
public
classMusicService
extends
Service
implementsRunnable{
private
MediaPlayer
player
;
private
List
lists
;
public
static
int
_id
=1;
//
当前播放位置
public
static
Boolean
isRun=
true;
public
LrcProcess
mLrcProcess
;
public
LrcView
mLrcView;
public
static
int
playing_id
=0;
public
static
Boolean
playing
=false
;
@Override
public
IBinderonBind(Intentarg0){
//TODOAuto-generatedmethodstubreturnnull;
}
@Override
publicvoidonCreate(){
//TODOAuto-generatedmethodstub
lists=MusicList.getMusicData(getApplicationContext());
SeekBarBroadcastReceiverreceiver=newSeekBarBroadcastReceiver();
IntentFilterfilter=newIntentFilter(".karl.seekBar");
this.registerReceiver(receiver,filter);
newThread(this).start();
super.onCreate();
}
@Override
publicvoidonStart(Intentintent,intstartId){
2
//TODOAuto-generatedmethodstub
Stringplay=intent.getStringExtra(
"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.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=intent.getIntExtra(
"id"
0);
playMusic(id);
}
}
privatevoidplayMusic(intid){
/////////////////////////初始化歌词配置/////////////////////////
mLrcProcess=newLrcProcess();
//读取歌词文件
3
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){
player.release();
player=null;
}
if
(id>=
lists
.size()-1){
_id
=
lists
.size()-1;
}
else
if
(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-generatedcatchblocke.printStackTrace();
}catch(SecurityExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}
player.start();
4
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
.reset();
Intentintent=
newIntent(
"pletion"
);
sendBroadcast(intent);
playMusic(
_id);
}
}
});
player.setOnErrorListener(
newOnErrorListener(){
@Override
public
booleanonError(MediaPlayermp,
int
what,
int
extra){
//TODOAuto-generatedmethodstub
if
(null
!
=
player
){
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){
//TODOAuto-generatedcatchblocke.printStackTrace();
5
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}
player.start();
returnfalse;
}
});
}
privateclassSeekBarBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//TODOAuto-generatedmethodstub
intseekBarPosition=intent.getIntExtra(
"seekBarPosition"
0);
//System.out.println("--------"+seekBarPosition);
player
.seekTo(seekBarPosition*
player
.getDuration()/100);
player
.start();
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstubwhile(isRun){
try{
Thread.sleep(200);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblocke.printStackTrace();
}
if(null!
=player){
intposition=player.getCurrentPosition();
inttotal=player.getDuration();
Intentintent=newIntent(".karl.progress");
intent.putExtra("position",position);
intent.putExtra("total",total);
6
sendBroadcast(intent);
}
if(null!
=player){
if(player.isPlaying()){
playing=true;
}else{
playing=false;
}
}
}
}
HandlermHandler=newHandler();
//歌词滚动线程
RunnablemRunnable=newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
MusicActivity.lrc_view.SetIndex(LrcIndex());
MusicActivity.lrc_view.invalidate();
mHandler.postDelayed(mRunnable,100);
}
};
//创建对象
privateList
//初始化歌词检索值
privateintindex=0;
//初始化歌曲播放时间的变量
privateintCurrentTime=0;
//初始化歌曲总时间的变量
privateintCountTime=0;
/**
*歌词同步处理类
*/
publicintLrcIndex(){
if(player.isPlaying()){
//获得歌曲播放在哪的时间
CurrentTime=player.getCurrentPosition();
//获得歌曲总时间长度
CountTime=player.getDuration();
}
7
if(CurrentTime for(inti=0;i if(i if(CurrentTime index=i; } if(CurrentTime>lrcList.get(i).getLrc_time() &&CurrentTime index=i; } } if(i==lrcList.size()-1 &&CurrentTime>lrcList.get(i).getLrc_time()){ index=i; } } } returnindex; } } 8 四、实验小结(包括问题和解决方法、心得体会等) 1.对于sendBroadCast的intent对象,需要设置其actionname; 2.推荐使用显式指明receiver,在配置文件AndroidManifest.xml指 明; 3.一个receiver可以接收多个action; 4.每次接收广播都会重新生成一个接收广播的对象,再次调用 onReceive; 5.在BroadCast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给 Activity或者Service去处理。 通过这次实验,让我对Broadcast、尤其是Service有了更深入的认 识,还让我意识到编程方面和知识体系机构方面存在的不足。 总之,这次 试验让我Android编程能力有了一定的提高。 利用这次试验,也将我们的大 作业更加完善。 9
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 广播 线程 服务 多媒体 开发 实验 报告