现在在做一个MP3的播放器
A界面是歌曲列表,B是播放界面
A跳转到B1(new 了一个新activity),然后给B1注册一个重力感应,返回A
再跳转到B2(重新new了一个activity),然后重力感应不起作用了,除了还在切歌,界面上的text都不变问题2:A跳转到B,然后给B1注册一个重力感应,退出程序再重新A-》B,然后重力感应不起作用了,除了还在切歌,界面上的text和进度条都不变我的想法会不会是重力感应绑定在B1上,所以B2不会变,而切歌其实还在B1那切的代码:
B界面:
public class MusicPlay extends Activity implements SensorEventListener{
private RelativeLayout broadcastView;
private ImageButton lastBut,nextBut,suspendBut;
private TextView musicNameText,nameText,barText;
private SeekBar bar;
private static MediaPlayer mediaPlayer;
private boolean suspendFlag = true;//判断当前歌曲是否暂停
private boolean order = true;//播放顺序
private String filePath;//歌曲地址
private int id;//歌曲id
private int length = MusicList.path.size();//歌曲数量
private SensorManager mSensorMgr;
private long curTime,lastTime,duration;
private float last_x = 0.0f;
private float last_y = 0.0f;
private float last_z = 0.0f;
private float shake = 0.0f;
// private float totalShake = 0.0f;
private boolean checkTime = true;
private int thisBg = 0;//当前图片的标记
private int lastBg = 0;//上一张图片的标记
private boolean seekBarFlag = true;
private boolean gravityFlag = true;
NotificationManager notificationManager;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.musicplay);
Log.e("ddd", String.valueOf((int)(Math.random()*length)));
Bundle bundle = this.getIntent().getBundleExtra("result");
id = bundle.getInt("_id");
Log.e("yy", String.valueOf(id));
filePath = MusicList.path.get(id).toString();
this.broadcastView = (RelativeLayout)findViewById(R.id.broadcastView);
this.musicNameText = (TextView)findViewById(R.id.musicNameText);
this.nameText = (TextView)findViewById(R.id.nameText);
this.bar = (SeekBar)findViewById(R.id.bar);
this.lastBut = (ImageButton)findViewById(R.id.lastOne);
this.nextBut = (ImageButton)findViewById(R.id.nextOne);
this.suspendBut = (ImageButton)findViewById(R.id.suspend);
this.bar = (SeekBar)findViewById(R.id.bar);
this.barText = (TextView)findViewById(R.id.barText);
this.suspendBut.setOnClickListener(new OnClickListenerImpl());
this.nextBut.setOnClickListener(new OnClickListenerImpl());
this.lastBut.setOnClickListener(new OnClickListenerImpl());
//置mediaPlayer为空闲状态
if(this.mediaPlayer!=null){
Log.e("返回再点", "到了这一步");
MusicPlay.this.mediaPlayer.stop();
MusicPlay.this.mediaPlayer.release();
MusicPlay.this.bar.setProgress(0);
}
//取得传感器管理对象
mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
//播放歌曲
this.musicBroadcast(filePath);
}
//实时更新进度条组件
private class UpdateSeekBar extends AsyncTask<Integer, Integer, String>{ @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
} @Override
protected void onProgressUpdate(Integer... values) {
MusicPlay.this.bar.setProgress(values[0]);
} @Override
protected String doInBackground(Integer... params) {
while(seekBarFlag){
try{
Thread.sleep(params[0]);
}catch(Exception e){
}
this.publishProgress(MusicPlay.this.mediaPlayer.getCurrentPosition());
}
return null;
}
}
//根据str路径寻找歌曲播放
public void musicBroadcast(String str){
try {
MusicPlay.this.seekBarFlag = true;
this.bar.setProgress(0);
//显示 歌名,歌手名
Log.e("返回再点",str);
Log.e("返回再点", MusicList.find("_filePath", str, "_musicName"));
MusicPlay.this.musicNameText.setText(MusicList.find("_filePath", str, "_musicName"));
this.nameText.setText(MusicList.find("_filePath", str, "_name"));
//初始化mediaPlayer
this.mediaPlayer= new MediaPlayer();
//把歌曲路径置入mediaPlayer之中
this.mediaPlayer.setDataSource(str);
//mediaPlayer组件准备
this.mediaPlayer.prepare(); //mediaPlayer播放
this.mediaPlayer.start();
//以歌曲时间为长度初始化进度条
this.bar.setMax(MusicPlay.this.mediaPlayer.getDuration());
UpdateSeekBar seekBar = new UpdateSeekBar();
seekBar.execute(1000);
//对进度条加入监听,实时更新
this.bar.setOnSeekBarChangeListener(new setOnSeekBarChangeListenerImpl());
//设置监听,当播放完毕,自动切歌
this.mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.e("yw","切歌");
MusicPlay.this.checkMusic("next");
}
});
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//拖动进度条时触发此监听
private class setOnSeekBarChangeListenerImpl implements OnSeekBarChangeListener{ @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int x = progress/1000;
int min = x/60;
int second = x%60;
MusicPlay.this.barText.setText(min+":"+second);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
//拖动进度条停下的时候,歌曲跳转到对应的时间
public void onStopTrackingTouch(SeekBar seekBar) {
MusicPlay.this.mediaPlayer.seekTo(seekBar.getProgress());
}
}
//开始,暂停,前一首,后一首的按钮监听
private class OnClickListenerImpl implements OnClickListener{
//略
}
//创建菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//略
}
//菜单的操作监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
//得到被点击的item的itemId
switch(item.getItemId()){
case R.id.sequences:
MusicPlay.this.order = true;
break;
case R.id.random:
MusicPlay.this.order = false;
break;
case R.id.gravity:
if(gravityFlag){
//注册SensorEventListener
mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
gravityFlag =false;
Toast.makeText(this, "已开启摇摇换歌", Toast.LENGTH_LONG).show();
}else{
mSensorMgr.unregisterListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
gravityFlag =true;
Toast.makeText(this, "已关闭摇摇换歌", Toast.LENGTH_LONG).show();
}
break;
}
return true;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
//传感度数据的监测
@Override
public void onSensorChanged(SensorEvent e) {
// float bx = 0;
// float by = 0;
// float bz = 0;
// long btime = 0;
float x = e.values[SensorManager.DATA_X];
float y = e.values[SensorManager.DATA_Y];
float z = e.values[SensorManager.DATA_Z];
// float speadX = (x - bx) / (System.currentTimeMillis() - btime);
// //y轴的速度
// float speadY = (y - by) / (System.currentTimeMillis() - btime);
// //z轴的速度
// float speadZ = (z - bz) / (System.currentTimeMillis() - btime);
// bx = x;
// by = y;
// bz = z;
//获取当前时刻的毫秒数
curTime = System.currentTimeMillis();
//100毫秒检测一次
if ((curTime - lastTime) > 100) {
// totalShake = 0;
duration = (curTime - lastTime);
// // 看是不是刚开始晃动
// if (last_x == 0.0f && last_y == 0.0f && last_z == 0.0f) {
// //last_x、last_y、last_z同时为0时,表示刚刚开始记录
// initTime = System.currentTimeMillis();
// } else {
// 单次晃动幅度
shake = (Math.abs(x - last_x) + Math.abs(y - last_y) + Math.abs(z - last_z)) / duration * 100;
// }
//把每次的晃动幅度相加,得到总体晃动幅度
// totalShake += shake;
//如果晃动幅度大于35,则切歌
if(shake > 35 ){
if(MusicPlay.this.checkTime){
//延时1s,1s内只能切一次歌
new Thread(new sleep()).start();
MusicPlay.this.checkMusic("next");
MusicPlay.this.checkBackground();
}
}
//把当前的参数赋值给lastXXX值,用于下次比较
last_x = x;
last_y = y;
last_z = z;
lastTime = curTime;
}
}
//切歌时候的主方法
private void checkMusic(String str){
//先停止当前歌曲的播放
MusicPlay.this.mediaPlayer.stop();
MusicPlay.this.mediaPlayer.release();
MusicPlay.this.suspendBut.setBackgroundResource(R.drawable.pic_suspend);
MusicPlay.this.suspendFlag = true;
//把进度条置零
MusicPlay.this.bar.setProgress(0);
//判断是否为顺序播放
if(order){
if(str.equals("next")){
if(id == length-1){
MusicPlay.this.musicBroadcast(MusicList.path.get(0).toString());
MusicPlay.this.id = 0;
}else{
MusicPlay.this.musicBroadcast(MusicList.path.get(id+1).toString());
MusicPlay.this.id = id+1;
}
}else if(str.equals("last")){
if(id==0){
MusicPlay.this.musicBroadcast(MusicList.path.get(length-1).toString());
MusicPlay.this.id = length-1;
}else{
MusicPlay.this.musicBroadcast(MusicList.path.get(id-1).toString());
MusicPlay.this.id = id-1;
}
}
}else{
int x = (int)(Math.random()*length);
MusicPlay.this.musicBroadcast(MusicList.path.get(x).toString());
MusicPlay.this.id = x;
}
}
//延时1s
private class sleep implements Runnable{ @Override
public void run() {
try {
MusicPlay.this.checkTime = false;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
MusicPlay.this.checkTime = true;
}
}
//切换背景图
private void checkBackground(){
// Log.e("切图片", "切切切");
thisBg = (int)(Math.random()*5);
while(thisBg==lastBg){
thisBg = (int)(Math.random()*5);
}
String str="pic_bg"+String.valueOf(thisBg);
String type="drawable";
Log.e("切图片", str);
int Rid=getResources().getIdentifier(str,type,getPackageName());
MusicPlay.this.broadcastView.setBackgroundResource(Rid);
lastBg = thisBg;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getRepeatCount() != 0){
return false;
}
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
MusicPlay.this.suspendFlag = false;
MusicPlay.this.suspendBut.setBackgroundResource(R.drawable.pic_play);
Intent intent = new Intent(MusicPlay.this,
MainActivity.class);
startActivity(intent);
MusicPlay.this.seekBarFlag = false;
// notificationManager.cancelAll();
finish();
break;
default:
break;
}
return false;
} }
A界面是歌曲列表,B是播放界面
A跳转到B1(new 了一个新activity),然后给B1注册一个重力感应,返回A
再跳转到B2(重新new了一个activity),然后重力感应不起作用了,除了还在切歌,界面上的text都不变问题2:A跳转到B,然后给B1注册一个重力感应,退出程序再重新A-》B,然后重力感应不起作用了,除了还在切歌,界面上的text和进度条都不变我的想法会不会是重力感应绑定在B1上,所以B2不会变,而切歌其实还在B1那切的代码:
B界面:
public class MusicPlay extends Activity implements SensorEventListener{
private RelativeLayout broadcastView;
private ImageButton lastBut,nextBut,suspendBut;
private TextView musicNameText,nameText,barText;
private SeekBar bar;
private static MediaPlayer mediaPlayer;
private boolean suspendFlag = true;//判断当前歌曲是否暂停
private boolean order = true;//播放顺序
private String filePath;//歌曲地址
private int id;//歌曲id
private int length = MusicList.path.size();//歌曲数量
private SensorManager mSensorMgr;
private long curTime,lastTime,duration;
private float last_x = 0.0f;
private float last_y = 0.0f;
private float last_z = 0.0f;
private float shake = 0.0f;
// private float totalShake = 0.0f;
private boolean checkTime = true;
private int thisBg = 0;//当前图片的标记
private int lastBg = 0;//上一张图片的标记
private boolean seekBarFlag = true;
private boolean gravityFlag = true;
NotificationManager notificationManager;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.musicplay);
Log.e("ddd", String.valueOf((int)(Math.random()*length)));
Bundle bundle = this.getIntent().getBundleExtra("result");
id = bundle.getInt("_id");
Log.e("yy", String.valueOf(id));
filePath = MusicList.path.get(id).toString();
this.broadcastView = (RelativeLayout)findViewById(R.id.broadcastView);
this.musicNameText = (TextView)findViewById(R.id.musicNameText);
this.nameText = (TextView)findViewById(R.id.nameText);
this.bar = (SeekBar)findViewById(R.id.bar);
this.lastBut = (ImageButton)findViewById(R.id.lastOne);
this.nextBut = (ImageButton)findViewById(R.id.nextOne);
this.suspendBut = (ImageButton)findViewById(R.id.suspend);
this.bar = (SeekBar)findViewById(R.id.bar);
this.barText = (TextView)findViewById(R.id.barText);
this.suspendBut.setOnClickListener(new OnClickListenerImpl());
this.nextBut.setOnClickListener(new OnClickListenerImpl());
this.lastBut.setOnClickListener(new OnClickListenerImpl());
//置mediaPlayer为空闲状态
if(this.mediaPlayer!=null){
Log.e("返回再点", "到了这一步");
MusicPlay.this.mediaPlayer.stop();
MusicPlay.this.mediaPlayer.release();
MusicPlay.this.bar.setProgress(0);
}
//取得传感器管理对象
mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
//播放歌曲
this.musicBroadcast(filePath);
}
//实时更新进度条组件
private class UpdateSeekBar extends AsyncTask<Integer, Integer, String>{ @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
} @Override
protected void onProgressUpdate(Integer... values) {
MusicPlay.this.bar.setProgress(values[0]);
} @Override
protected String doInBackground(Integer... params) {
while(seekBarFlag){
try{
Thread.sleep(params[0]);
}catch(Exception e){
}
this.publishProgress(MusicPlay.this.mediaPlayer.getCurrentPosition());
}
return null;
}
}
//根据str路径寻找歌曲播放
public void musicBroadcast(String str){
try {
MusicPlay.this.seekBarFlag = true;
this.bar.setProgress(0);
//显示 歌名,歌手名
Log.e("返回再点",str);
Log.e("返回再点", MusicList.find("_filePath", str, "_musicName"));
MusicPlay.this.musicNameText.setText(MusicList.find("_filePath", str, "_musicName"));
this.nameText.setText(MusicList.find("_filePath", str, "_name"));
//初始化mediaPlayer
this.mediaPlayer= new MediaPlayer();
//把歌曲路径置入mediaPlayer之中
this.mediaPlayer.setDataSource(str);
//mediaPlayer组件准备
this.mediaPlayer.prepare(); //mediaPlayer播放
this.mediaPlayer.start();
//以歌曲时间为长度初始化进度条
this.bar.setMax(MusicPlay.this.mediaPlayer.getDuration());
UpdateSeekBar seekBar = new UpdateSeekBar();
seekBar.execute(1000);
//对进度条加入监听,实时更新
this.bar.setOnSeekBarChangeListener(new setOnSeekBarChangeListenerImpl());
//设置监听,当播放完毕,自动切歌
this.mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.e("yw","切歌");
MusicPlay.this.checkMusic("next");
}
});
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//拖动进度条时触发此监听
private class setOnSeekBarChangeListenerImpl implements OnSeekBarChangeListener{ @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int x = progress/1000;
int min = x/60;
int second = x%60;
MusicPlay.this.barText.setText(min+":"+second);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
//拖动进度条停下的时候,歌曲跳转到对应的时间
public void onStopTrackingTouch(SeekBar seekBar) {
MusicPlay.this.mediaPlayer.seekTo(seekBar.getProgress());
}
}
//开始,暂停,前一首,后一首的按钮监听
private class OnClickListenerImpl implements OnClickListener{
//略
}
//创建菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//略
}
//菜单的操作监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
//得到被点击的item的itemId
switch(item.getItemId()){
case R.id.sequences:
MusicPlay.this.order = true;
break;
case R.id.random:
MusicPlay.this.order = false;
break;
case R.id.gravity:
if(gravityFlag){
//注册SensorEventListener
mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
gravityFlag =false;
Toast.makeText(this, "已开启摇摇换歌", Toast.LENGTH_LONG).show();
}else{
mSensorMgr.unregisterListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
gravityFlag =true;
Toast.makeText(this, "已关闭摇摇换歌", Toast.LENGTH_LONG).show();
}
break;
}
return true;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
//传感度数据的监测
@Override
public void onSensorChanged(SensorEvent e) {
// float bx = 0;
// float by = 0;
// float bz = 0;
// long btime = 0;
float x = e.values[SensorManager.DATA_X];
float y = e.values[SensorManager.DATA_Y];
float z = e.values[SensorManager.DATA_Z];
// float speadX = (x - bx) / (System.currentTimeMillis() - btime);
// //y轴的速度
// float speadY = (y - by) / (System.currentTimeMillis() - btime);
// //z轴的速度
// float speadZ = (z - bz) / (System.currentTimeMillis() - btime);
// bx = x;
// by = y;
// bz = z;
//获取当前时刻的毫秒数
curTime = System.currentTimeMillis();
//100毫秒检测一次
if ((curTime - lastTime) > 100) {
// totalShake = 0;
duration = (curTime - lastTime);
// // 看是不是刚开始晃动
// if (last_x == 0.0f && last_y == 0.0f && last_z == 0.0f) {
// //last_x、last_y、last_z同时为0时,表示刚刚开始记录
// initTime = System.currentTimeMillis();
// } else {
// 单次晃动幅度
shake = (Math.abs(x - last_x) + Math.abs(y - last_y) + Math.abs(z - last_z)) / duration * 100;
// }
//把每次的晃动幅度相加,得到总体晃动幅度
// totalShake += shake;
//如果晃动幅度大于35,则切歌
if(shake > 35 ){
if(MusicPlay.this.checkTime){
//延时1s,1s内只能切一次歌
new Thread(new sleep()).start();
MusicPlay.this.checkMusic("next");
MusicPlay.this.checkBackground();
}
}
//把当前的参数赋值给lastXXX值,用于下次比较
last_x = x;
last_y = y;
last_z = z;
lastTime = curTime;
}
}
//切歌时候的主方法
private void checkMusic(String str){
//先停止当前歌曲的播放
MusicPlay.this.mediaPlayer.stop();
MusicPlay.this.mediaPlayer.release();
MusicPlay.this.suspendBut.setBackgroundResource(R.drawable.pic_suspend);
MusicPlay.this.suspendFlag = true;
//把进度条置零
MusicPlay.this.bar.setProgress(0);
//判断是否为顺序播放
if(order){
if(str.equals("next")){
if(id == length-1){
MusicPlay.this.musicBroadcast(MusicList.path.get(0).toString());
MusicPlay.this.id = 0;
}else{
MusicPlay.this.musicBroadcast(MusicList.path.get(id+1).toString());
MusicPlay.this.id = id+1;
}
}else if(str.equals("last")){
if(id==0){
MusicPlay.this.musicBroadcast(MusicList.path.get(length-1).toString());
MusicPlay.this.id = length-1;
}else{
MusicPlay.this.musicBroadcast(MusicList.path.get(id-1).toString());
MusicPlay.this.id = id-1;
}
}
}else{
int x = (int)(Math.random()*length);
MusicPlay.this.musicBroadcast(MusicList.path.get(x).toString());
MusicPlay.this.id = x;
}
}
//延时1s
private class sleep implements Runnable{ @Override
public void run() {
try {
MusicPlay.this.checkTime = false;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
MusicPlay.this.checkTime = true;
}
}
//切换背景图
private void checkBackground(){
// Log.e("切图片", "切切切");
thisBg = (int)(Math.random()*5);
while(thisBg==lastBg){
thisBg = (int)(Math.random()*5);
}
String str="pic_bg"+String.valueOf(thisBg);
String type="drawable";
Log.e("切图片", str);
int Rid=getResources().getIdentifier(str,type,getPackageName());
MusicPlay.this.broadcastView.setBackgroundResource(Rid);
lastBg = thisBg;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getRepeatCount() != 0){
return false;
}
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
MusicPlay.this.suspendFlag = false;
MusicPlay.this.suspendBut.setBackgroundResource(R.drawable.pic_play);
Intent intent = new Intent(MusicPlay.this,
MainActivity.class);
startActivity(intent);
MusicPlay.this.seekBarFlag = false;
// notificationManager.cancelAll();
finish();
break;
default:
break;
}
return false;
} }
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货