提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
目标:这次主要的实验目的就是在手机上实现一个简单的音乐播放,这其中我学到比较有感觉的知识就是关于广播一类方面的。在之后的代码中有体现到我学习到的东西。
一、MainActivity主界面
这部分是对于播放界面的代码分析。
LinearLayout
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="4">
<ImageButton
android:id="@+id/previous"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:src="@drawable/previous"
android:contentDescription="TODO" />
<ImageButton
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:src="@drawable/play"
android:contentDescription="TODO" />
<ImageButton
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:src="@drawable/stop"
android:contentDescription="TODO" />
<ImageButton
android:id="@+id/next"
android:layout_width="0dp"
android:layout_height="64dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:src="@drawable/next"
android:contentDescription="TODO" />
</LinearLayout>
这是关于按键的样式设计
static final String CTL_ACTION = "org.gssmhzf.action.CTL_ACTION";
static final String UPDATE_ACTION ="org.gssmhzf.action.UPDATE_ACTION";
定义两个广播监听的ACTION
public class ActivityReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int update = intent.getIntExtra("update",-1);
int current = intent.getIntExtra("current", -1);
if (current >= 0){
title.setText(titleStrs[current]);
author.setText(authorStrs[current]);
}
switch (update){
case 0x11:
play.setImageResource(R.drawable.play);
status = 0x11;
break;
case 0x12:
play.setImageResource(R.drawable.pause);
status = 0x12;
break;
case 0x13:
play.setImageResource(R.drawable.play);
status = 0x13;
break;
}
}
}
这步是自定义广播,使其可以在serv和activity之间转换和传递
activityReceiver = new ActivityReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(UPDATE_ACTION);
registerReceiver(activityReceiver,filter);
Intent intent = new Intent(MainActivity.this,MusicService.class);
startService(intent);
}
@Override
public void onClick(View v) {
// 创建Intent
Intent intent = new Intent("org.hzf.action.CTL_ACTION");
switch (v.getId())
{
// 按下播放/暂停按钮
case R.id.play:
intent.putExtra("control", 1);
break;
// 按下停止按钮
case R.id.stop:
intent.putExtra("control", 2);
break;
case R.id.previous:
intent.putExtra("control", 3);
break;
// 按下下一首
case R.id.next:
intent.putExtra("control", 4);
break;
}
// 发送广播,将被Service组件中的BroadcastReceiver接收到
sendBroadcast(intent);
}
这里是最关键的广播和监听两步骤,这使我们可以通过对按钮的操作可以发挥我们想要的作用,让播放器的功能初步实现。
二、MusicService部分代码
这部分是对于服务的代码分析。
private void prepareAndPlay(String music){
try {
AssetFileDescriptor afd = am.openFd(music);
mediaPlayer.reset();
mediaPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
mediaPlayer.prepare();
mediaPlayer.start();
Log.v("hxl","音乐开始");
}catch (IOException e){
e.printStackTrace();
}
}
这部分就是为我们的播放器准备音乐,有了音乐才能播放。
mPlayer = new MediaPlayer();
// 为MediaPlayer播放完成事件绑定监听器
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d("MusicService", "歌曲播放完毕");
current++;
if (current >= 4)
{
current = 0;
}
//发送广播通知Activity更改文本框
Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
sendIntent.putExtra("current", current);
// 发送广播,将被Activity组件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
// 准备并播放音乐
prepareAndPlay(musics[current]);
}
});
这部分是可以让我们没有对播放器进行操作时,播放器可以自己默认就是循环播放,不会说没有我们操控它就啥也不干。
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(final 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;
}
case 3:
// 如果原来正在播放或暂停
if (status == 0x12 || status == 0x13) {
mediaPlayer.stop();
if (current - 1 < 0) {
current = musics.length - 1;
} else {
current--;
}
prepareAndPlay(musics[current]);
status = 0x12;
}
break;
//下一首
case 4:
if (status == 0x12 || status == 0x13) {
mediaPlayer.stop();
if (current + 1 >= musics.length) {
current = 0;
} else {
current++;
}
prepareAndPlay(musics[current]);
status = 0x12;
}
break;
这是对播放器现在的情况,进行一个逻辑控制,这样就可以对activity发送的信息进行处理
界面截图展示
总结
对这次实验进行总结:
这次实验是在as上进行代码,完成一个音乐播放器,这里运用了广播和监听的知识,使我们可以通过按钮让这个小程序进行我们需要的功能,还通过一些功能为播放器提供音乐,总体来说是比较基础但是非常经典的,让我们在实践的方面了解了Android上实现一个小播放器的步骤,在之后我也会进行进度条等方面的完善,这方面逐渐补充的过程我觉得还是能学到很多的。
全部代码请看:https://github.com/hxlzzz/MusicBoxHuang