Android MP3播放器实例--------MusicActivity类以及MusicService类详细讲解
这两个类是此播放器中最重要的实现代码逻辑的两个类,其实代码很简单 只是一些简单的播放器的逻辑实现。
package music.mic.act;
import java.util.List;
import music.mic.mic.Music;
import music.mic.util.LrcView;
import music.mic.util.MusicList;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MusicActivity extends Activity implements SensorEventListener {
private TextView textName;
private TextView textSinger;
private TextView textStartTime;
private TextView textEndTime;
private ImageButton imageBtnLast;
private ImageButton imageBtnRewind;
public static ImageButton imageBtnPlay;
private ImageButton imageBtnForward;
private ImageButton imageBtnNext;
private ImageButton imageBtnLoop;
private ImageButton imageBtnRandom;
public static LrcView lrc_view;
private ImageView icon;
private SeekBar seekBar1;
private AudioManager audioManager;// 音量管理者
private int maxVolume;// 最大音量
private int currentVolume;// 当前音量
private SeekBar seekBarVolume;
private List<Music> lists;
private Boolean isPlaying = false;
private static int id = 1;
private static int currentId = 2;
private static Boolean replaying = false;
private MyProgressBroadCastReceiver receiver;
private MyCompletionListner completionListner;
public static Boolean isLoop = true;
private SensorManager sensorManager;
private boolean mRegisteredSensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一篇我们已经讲过设置window的属性,以及与setContent顺序问题。这里就不在多说。
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.music);
//通过id找到所有的控件
textName = (TextView) this.findViewById(R.id.music_name);
textSinger = (TextView) this.findViewById(R.id.music_singer);
textStartTime = (TextView) this.findViewById(R.id.music_start_time);
textEndTime = (TextView) this.findViewById(R.id.music_end_time);
seekBar1 = (SeekBar) this.findViewById(R.id.music_seekBar);
// icon = (ImageView) this.findViewById(R.id.image_icon);
imageBtnLast = (ImageButton) this.findViewById(R.id.music_lasted);
imageBtnRewind = (ImageButton) this.findViewById(R.id.music_rewind);
imageBtnPlay = (ImageButton) this.findViewById(R.id.music_play);
imageBtnForward = (ImageButton) this.findViewById(R.id.music_foward);
imageBtnNext = (ImageButton) this.findViewById(R.id.music_next);
imageBtnLoop = (ImageButton) this.findViewById(R.id.music_loop);
seekBarVolume = (SeekBar) this.findViewById(R.id.music_volume);
imageBtnRandom = (ImageButton) this.findViewById(R.id.music_random);
lrc_view = (LrcView) findViewById(R.id.LyricShow);
//为imageButton设置监听MylIstener()
imageBtnLast.setOnClickListener(new MyListener());
imageBtnRewind.setOnClickListener(new MyListener());
imageBtnPlay.setOnClickListener(new MyListener());
imageBtnForward.setOnClickListener(new MyListener());
imageBtnNext.setOnClickListener(new MyListener());
imageBtnLoop.setOnClickListener(new MyListener());
imageBtnRandom.setOnClickListener(new MyListener());
//设置重力感应这个我没有测试 因为没有真机。。。各位有真机的可以试试
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到歌曲列表
lists = MusicList.getMusicData(this);
//得到AudioManager对象
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);// 获得最大音量
currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获得当前音量
//设置音量
seekBarVolume.setMax(maxVolume);
seekBarVolume.setProgress(currentVolume);
//这里的音量也是一个可拖动的进度条,所以要加监听实现功能。
seekBarVolume.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_ALLOW_RINGER_MODES);
}
});
// 电话状态监听
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new MobliePhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
seekBar1.setProgress(seekBar.getProgress());
Intent intent = new Intent("music.mic.seekBar");
intent.putExtra("seekBarPosition", seekBar.getProgress());
// System.out.println("==========="+seekBar.getProgress());
sendBroadcast(intent);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
}
});
completionListner = new MyCompletionListner();
IntentFilter filter = new IntentFilter("music.mic.completion");
//注册广播接收器
this.registerReceiver(completionListner, filter);
}
private class MobliePhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "playing");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
imageBtnPlay.setImageResource(R.drawable.pause1);
replaying = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */
case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */
Intent intent2 = new Intent(MusicActivity.this, MusicService.class);
intent2.putExtra("play", "pause");
startService(intent2);
isPlaying = false;
imageBtnPlay.setImageResource(R.drawable.play1);
replaying = false;
break;
default:
break;
}
}
}
//以下是一个Activity每个生命周期的每个阶段内处理的函数
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
receiver = new MyProgressBroadCastReceiver();
IntentFilter filter = new IntentFilter("music.mic.progress");
this.registerReceiver(receiver, filter);
id = getIntent().getIntExtra("id", 1);
if (id == currentId) {
Music m = lists.get(id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
//通过Intent将参数等传递到Service中进行处理
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "replaying");
intent.putExtra("id", id);
startService(intent);
if (replaying == true) {
imageBtnPlay.setImageResource(R.drawable.pause1);
// /replaying=false;
isPlaying = true;
} else {
imageBtnPlay.setImageResource(R.drawable.play1);
// replaying=true;
isPlaying = false;
}
} else {
Music m = lists.get(id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "play");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
replaying = true;
currentId = id;
}
}
//重力感应
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensors.size() > 0) {
Sensor sensor = sensors.get(0);
mRegisteredSensor = sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
Log.e("--------------", sensor.getName());
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
if (mRegisteredSensor) {
sensorManager.unregisterListener(this);
mRegisteredSensor = false;
}
super.onPause();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
this.unregisterReceiver(receiver);
this.unregisterReceiver(completionListner);
super.onDestroy();
}
//广播接收器
public class MyProgressBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int position = intent.getIntExtra("position", 0);
int total = intent.getIntExtra("total", 0);
int progress = position * 100 / total;
textStartTime.setText(toTime(position));
seekBar1.setProgress(progress);
seekBar1.invalidate();
}
}
//按钮监听实现分别对不同的按钮进行设置监听方法 ,这里唯一需要注意就是上一首,下一首的逻辑判断 也非常简单。
private class MyListener implements OnClickListener {
public void onClick(View v) {
if (v == imageBtnLast) {
// 第一首
id = 0;
Music m = lists.get(0);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "first");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
} else if (v == imageBtnRewind) {
// 前一首
int id = MusicService._id - 1;
if (id >= lists.size() - 1) {
id = lists.size() - 1;
} else if (id <= 0) {
id = 0;
}
Music m = lists.get(id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "rewind");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
} else if (v == imageBtnPlay) {
// 正在播放
if (isPlaying == true) {
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "pause");
startService(intent);
isPlaying = false;
imageBtnPlay.setImageResource(R.drawable.play1);
replaying = false;
} else {
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "playing");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
imageBtnPlay.setImageResource(R.drawable.pause1);
replaying = true;
}
} else if (v == imageBtnForward) {
// 下一首
int id = MusicService._id + 1;
if (id >= lists.size() - 1) {
id = lists.size() - 1;
} else if (id <= 0) {
id = 0;
}
Music m = lists.get(id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "forward");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
} else if (v == imageBtnNext) {
// 最后一首
int id = lists.size() - 1;
Music m = lists.get(id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "last");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
} else if (v == imageBtnLoop) {
if (isLoop == true) {
// 顺序播放
imageBtnLoop.setBackgroundResource(R.drawable.play_loop_spec);
isLoop = false;
} else {
// 单曲播放
imageBtnLoop.setBackgroundResource(R.drawable.play_loop_sel);
isLoop = true;
}
} else if (v == imageBtnRandom) {
imageBtnRandom.setImageResource(R.drawable.play_random_sel);
}
}
}
private class MyCompletionListner extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Music m = lists.get(MusicService._id);
textName.setText(m.getTitle());
textSinger.setText(m.getSinger());
textEndTime.setText(toTime((int) m.getTime()));
imageBtnPlay.setImageResource(R.drawable.pause1);
}
}
public String toTime(int time) {
time /= 1000;
int minute = time / 60;
int hour = minute / 60;
int second = time % 60;
return String.format("%02d:%02d", minute, second);
}
// 重力感应 甩歌代码
private static final int SHAKE_THRESHOLD = 3000;
private long lastUpdate = 0;
private double last_x = 0;
private double last_y = 4.50;
private double last_z = 9.50;
// 这个控制精度,越小表示反应越灵敏
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
// 处理精准度改变
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// 每200毫秒检测一次
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
double x = event.values[SensorManager.DATA_X];
double y = event.values[SensorManager.DATA_Y];
double z = event.values[SensorManager.DATA_Z];
Log.e("---------------", "x=" + x + " y=" + y + " z=" + z);
float speed = (float) (Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000);
if (speed > SHAKE_THRESHOLD) {
// 检测到摇晃后执行的代码
if (MusicService.playing == true) {
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "pause");
startService(intent);
isPlaying = false;
imageBtnPlay.setImageResource(R.drawable.play1);
replaying = false;
} else {
Intent intent = new Intent(MusicActivity.this, MusicService.class);
intent.putExtra("play", "playing");
intent.putExtra("id", id);
startService(intent);
isPlaying = true;
imageBtnPlay.setImageResource(R.drawable.pause1);
replaying = true;
}
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
}
Android MP3播放器实例--------MusicActivity类以及MusicService类详细讲解相关推荐
- android播放器实例,android音乐播放器实例
郑州app开发android音乐播放器实例.布局代码是一个imagebutton和seekbar. 下面是java代码 MainActivity.java package cn.xhhkj.music ...
- sony android mp3播放器,高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测
原标题:高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测 用传统的音乐播放器来听歌,似乎已经逐渐变成了一个相对小众的需求. 在我眼里,曾被称呼为「随身听」的音乐播放器,已经逐渐被归类为如 ...
- sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...
入手一年,详细聊聊 索尼ZX505.艾利和SR15 两款安卓播放器的使用体验 2020-12-04 16:00:21 113点赞 179收藏 28评论 创作立场声明:本文所测商品为自费购入.如参加张大 ...
- Android Mp3播放器核心功能服务
步骤简明详细,一看就懂,代码齐全,复制可用 开发工具为:Android Studio 看图便知功能 看代码便知详情 第一步:设置布局 <?xml version="1.0" ...
- android mp3播放器学习之预备知识1:activity
对应的MP3源码下载:http://download.csdn.net/detail/brightshadow11111/4971610 学习android毋庸置疑,activity是相当相当重要的一 ...
- android MP3播放器(支持歌词滚动等功能)
大二课余时间写的音乐播放器,发现目前网上很多android播放器都缺胳膊少腿的, 于是便分享出来给才接触android的同学作参考,(Tomcat服务器功能已删除) 实现了启动动画,引导界面,appw ...
- 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器
上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...
- 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器
大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...
- Android音乐播放器的开发实例(2021新版-Java版)
Android音乐播放器的开发实例 介绍 该项目旨在引导喜爱 Android 开发爱好者入门教程实例,可以一步一步的跟着来完成属于自己的项目开发过程. 此项目为基于 Java 语言开发,使用 Recy ...
最新文章
- 修复mysql数据库供应商_修复MYSQL数据库
- string和stringstream用法总结
- Azkaban的Web Server源码探究系列20:resolvebuildFlow
- Pandas库学习笔记
- Cloud for Customer Mashup debug in IFrame
- oracle查询哪些数据未压缩,求助大佬:向压缩表插入数据,压缩未生效
- 8.仿阿里云虚拟云服务器的FTP(包括FTP文件夹大小限制)
- Linux有问必答:如何查看Linux上程序或进程用到的库
- 虚短”“虚断”两板斧,搞定运算放大器 11张大图详(转)感觉特别有用 转过来收藏...
- 耐克官网一直显示无法连接服务器,nikeapp无法连接服务器是什么原因 nikeapp怎么抢鞋子...
- 你知道腾讯程序员一年写多少代码嘛?
- OpenJ_Bailian - 2711
- 使用组件不渲染 Unknown custom element: <xxx> - did you register the component correctly? For recursiv
- python机器学习基础05——sklearn之逻辑回归+分类评价指标
- AlphaFold2源码解析(9)--模型之损失
- linux 编译c文件 arm,用arm-linux-gcc编译arm裸机程序(可调用库)
- 地图的历史:从古代地图到 GIS
- 构建CMS:结构和样式
- 指令集董事长潘爱民出席2022 ECUG Con,为中国技术力量发声
- 网页设计用什么软件最好