资源描述
实 验 报 告
(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
三、 实验原理及内容
在这个程序中涉及到了Receiver和BroadcastReceiver的结合使用,首先在AndroidManifest.xml中注册Receiver,实现能够在后台播放音乐的功能。
通过CommandReceiver类实现接受前台Activity发送的播放命令的Intent。在CommandReceiver类中,有后台Service注册的接受前台控制命令Intent的Receiver,广播播放状态变化的Intent
代码
public class MusicService extends Service implements Runnable {
private MediaPlayer player;
private List<Music> 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 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 receiver = 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.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);
}
}
private void playMusic(int id) {
// /////////////////////// 初始化歌词配置 /////////////////////// //
mLrcProcess = new LrcProcess();
// 读取歌词文件
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;
}
Music m = lists.get(_id);
String 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.printStackTrace();
} 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.setOnCompletionListener(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 intent = 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);
String 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.printStackTrace();
} 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;
}
});
}
private 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.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 = player.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 = 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<LrcContent> lrcList = new ArrayList<LrcContent>();
// 初始化歌词检索值
private int index = 0;
// 初始化歌曲播放时间的变量
private 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 < 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()) {
index = i;
}
}
if (i == lrcList.size() - 1
&& CurrentTime > lrcList.get(i).getLrc_time()) {
index = i;
}
}
}
return index;
}
}
四、 实验小结(包括问题和解决方法、心得体会等)
1.对于sendBroadCast的intent对象,需要设置其actionname;
2.推荐使用显式指明receiver,在配置文件AndroidManifest.xml指明;
3.一个receiver可以接收多个action;
4.每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive;
5.在BroadCast中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。
通过这次实验,让我对Broadcast、尤其是Service有了更深入的认识,还让我意识到编程方面和知识体系机构方面存在的不足 。总之,这次试验让我Android编程能力有了一定的提高。利用这次试验,也将我们的大作业更加完善。
8
展开阅读全文