android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

上一篇写了如何在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,现在来讲讲摇一摇功能开发。


同样用了一个Service去实现摇一摇。

ShakeListener继承自SensorEventListener,当加速度感应器感受到重力变化,就去通知onShakeListener调用onShake(),

在震动的同时随机一首歌。


一,加速度感应器

在这里需要设置一个速度阈值和时间间隔,控制一定的时间间隔才能触发第二次震动,还有感受速度太小也不去onShake()。


1)得到sensorManager。

sensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);

2)得到sensor

sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

3)注册感应监听

sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);


package com.huwei.sweetmusicplayer.ui.listeners;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
 

public class ShakeListener implements SensorEventListener {
	//速度阈值
	private static final int SPEED_SHAKEHOLD=3000;
	//检测时间间隔
	private static final int UPTATE_INTERVAL_TIME = 70;
	//传感器管理器
	private SensorManager sensorManager;
	//传感器 
	private Sensor sensor;
	//重力感应监听器
	private OnShakeListener onShakeListener;
	// 上下文
	private Context mContext;
	// 手机上一个位置时重力感应坐标
	private float lastX;
	private float lastY;
	private float lastZ;
	// 上次检测时间
	private long lastUpdateTime;
	
	public ShakeListener(Context mContext) {
		super();
		this.mContext = mContext;
		
		start();
	}

	
	public void start(){
		sensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
		if(sensorManager!=null){
			//获得加速度感应器
			sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		}
		
		if(sensor!=null){
			//注册加速器,并且设置速率
			sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
		}
	}
	
	// 设置重力感应监听器
	public void setOnShakeListener(OnShakeListener listener) {
		onShakeListener = listener;
	}
	
	public void stop(){
		sensorManager.unregisterListener(this);
	}
	
	
	//重力感应到变化
	@Override
	public void onSensorChanged(SensorEvent event) {
		// TODO Auto-generated method stub
		long currentUpdateTime=System.currentTimeMillis();
		
		long timeInterval=currentUpdateTime-lastUpdateTime;
		
		if(timeInterval<UPTATE_INTERVAL_TIME){
			return;
		}
		
		lastUpdateTime=currentUpdateTime;
		
		float x=event.values[0];
		float y=event.values[1];
		float z=event.values[2];
		
		float deltaX=x-lastX;
		float deltaY=y-lastY;
		float deltaZ=z-lastZ;
		
		lastX=x;
		lastY=y;
		lastZ=z;
		
		double speed=Math.sqrt(deltaX*deltaX+deltaY*deltaY*deltaZ*deltaZ)/timeInterval*10000;
		
		
		if(speed>SPEED_SHAKEHOLD){
			onShakeListener.onShake();
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub

	}
	
	
	// 摇晃监听接口
	public interface OnShakeListener {
		public void onShake();
	}

}

二,控制震动

得到Vibrator对象

vibrator=(Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);

震动方法有两种

vibrator.vibrate(500);震动多少毫秒

或者设置一个震动周期的数组

vibrator.vibrate(new long[]{100,200,100,200}, -1);   //停止,震动,停止,震动

-1表示重复次数为不重复

package com.huwei.sweetmusicplayer.services;

import com.huwei.sweetmusicplayer.datamanager.MusicManager;
import com.huwei.sweetmusicplayer.ui.listeners.ShakeListener;
 

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.Vibrator;
import android.util.Log;

public class ShakeService extends Service {
	private static final String TAG="ShakeService";
	private ShakeListener mShakeListener;
	private Vibrator vibrator;
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		
		vibrator=(Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);
		mShakeListener=new ShakeListener(getBaseContext());
		mShakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() {
			
			@Override
			public void onShake() {
				// TODO Auto-generated method stub
				 mShakeListener.stop();
				 startVibrator();
				 //vibrator.cancel();
				 mShakeListener.start();
			}
		} );
	}

	//震动函数
	void startVibrator(){
		Log.i(TAG,"shake");
		
		vibrator.vibrate(500);
		
		
		MusicManager.getInstance().random_a_song();
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		mShakeListener.start();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mShakeListener.stop();
	}

	
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。