Android MP3播放器实例--------MusicActivity类以及MusicService类详细讲解
2012-03-06 16:25
465 查看
这两个类是此播放器中最重要的实现代码逻辑的两个类,其实代码很简单 只是一些简单的播放器的逻辑实现。
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;
}
}
}
}
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中的View类以及自定义View控件的方法
- 关于Android大数据收集,埋点统计的详细讲解以及案例代码分析附github代码
- Android异步加载网络数据以及数据缓存的讲解、实例
- Android 实例讲解自定义Camera拍照和预览以及前后置摄像头切换
- [置顶] 史上最全最详细的Spring定时任务的讲解以及实例
- 【React Native开发】React Native控件之ViewPagerAndroid讲解以及美团首页顶部效果实例(17)
- [实例教程] Android中的Intent详细讲解
- [Android实例] Android Service 服务详细讲解
- Android MP3播放器实例-------AlbumsActivity,ArtistsActivity以及对应的Adapter类
- JAVA 反射详细讲解 实例
- Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)
- 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
- Android开发自动生成的AndroidManifest.xml中的allowBackup属性的含义和危险性实例讲解
- Android自定义相机详细讲解
- 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
- android底层去掉虚拟按键的实例讲解
- Android中的Intent详细讲解
- bloom filter详细讲解以及代码分析
- mysql分区功能详细介绍,以及实例
- 【Android LibGDX游戏引擎开发教程】第03期:示例代码详细讲解