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();
	}

}
时间: 2024-10-12 17:00:43

android音乐播放器开发 SweetMusicPlayer 摇一摇换歌的相关文章

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词

在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将一下载入在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api.尽管还是资源不全.并且还有非常多错误. 特别头疼的是有时候歌词竟然不分行.解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/

android音乐播放器开发 SweetMusicPlayer 加载歌曲列表

上一篇写了播放器的整体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,现在来总结下加载歌曲列表. 比较好的实现思路就是,自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,好处有很多,但是这样做的话代码量会比较大,写了一段扫描sd卡的代码,然后发现扫描音乐的速度简直慢的惊人,可能自己的目录太多,太深,目前还没想到一个比较好的算法去快速扫描sd卡. 楼主比较偷懒,android自己本身有一个关于媒体信息的数据

android音乐播放器开发 SweetMusicPlayer 播放本地音乐

上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,现在来总结下播放本地音乐. 一,MediaPlayer 首先来看看MediaPlayer的生命周期: Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态.这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确

android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https://github.com/huweigoodboy/SweetMusicPlayer 比較好的实现思路就是.自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,优点有非常多,可是这样做的话代码量会比較大,写了一段扫描sd卡的代码.然后发现扫描音乐的速度简直慢的惊人,可能自己的文件夹太多,太

android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词

上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539,现在来将一下加载本地歌词.好了,还是用那张图. 一,从内存卡上匹配歌词 将会从以下路径匹配 1)  SweetMusicPlayer/Lyrics/ 2)  歌曲同级目录下 3)  歌曲父级目录/lryics(Lryic加不加s,首字母大小与否又分情况) LrcContent package com.huwei.sweetmusicp

android音乐播放器开发 SweetMusicPlayer 智能加载在线歌词

上一篇写了使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773,如果没有本地歌词怎么办?现在来将一下加载在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api,虽然还是资源不全,而且还有很多错误.特别头疼的是有时候歌词居然不分行,解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/ 比如

android音乐播放器开发教程

android音乐播放器开发教程 android音乐播放器开发教程,布布扣,bubuko.com

Android音乐播放器开发

今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是.MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/android:list"的设置,否则程序会报错,说找不到listview.这个效果还是不错的.可以当做是简单的音乐播放器,可以读取sdcard里面后缀是.MP3的歌曲.有问题可以留言,想要源码可以留言,这个代码比较简单.转载请标明出处: http://blog.csdn.net/wdaming1986/

Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

Android音乐播放器(歌词.均衡器.收藏.qq5.0菜单.通知) 一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 下载地址:http://www.devstore.cn/code/info/1144.html 运行截图:     热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较