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();
} }
android音乐播放器开发 SweetMusicPlayer 摇一摇换歌的更多相关文章
- android音乐播放器开发 SweetMusicPlayer 实现思路
一,实现效果 眼下还不是特别完好,主要有下面几个功能, 1,载入歌曲列表(实现a-z字母检索) 2,播放本地音乐 3.智能匹配本地歌词 4.智能载入在线歌词(事实上不算智能.发现歌词迷api提供的歌词 ...
- android音乐播放器开发 SweetMusicPlayer 播放本地音乐
上一篇写了载入歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,如今来总结下播放本地音乐. 一,MediaPlayer 首 ...
- android音乐播放器开发 SweetMusicPlayer
智能负载直插式歌词
在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将 ...
- android音乐播放器开发 SweetMusicPlayer 载入歌曲列表
上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...
- android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词
上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539. 代码地址:https://gith ...
- android音乐播放器开发教程
android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...
- Android音乐播放器开发
今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是.MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/and ...
- Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...
- 一款非常简单的android音乐播放器源码分享给大家
一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...
随机推荐
- (P2022 有趣的数)||(zoj Little Sub and Mr.Potato's Math Problem)(思维)
题目链接:https://www.luogu.org/problemnew/show/P2022 题目大意:中文题目 具体思路: 第一步:我们可以先计算出当前的数前面按照字典序的话,前面有多少数(包括 ...
- oracle开机自启,开机自动关闭防火墙,开机监听自启
1.修改oratab 2,修改rc.local 3.关闭防火墙,设置开机时清空所有规则 参考文章: 1.https://blog.csdn.net/weeknd/article/details/726 ...
- 总结---Python中的面向对象!
面向对象这种编程的范式每个语言都是通用的,这里总结一下python的面向对象语法,主要包含以下几个方面! 1 基本语法 # 定义类 class Person(object): n = 10 # 类变量 ...
- Linux中Samba详细安装【转】
转自:http://www.cnblogs.com/whiteyun/archive/2011/05/27/2059670.html 为了实现Windows主机与Linux服务器之间的资源共享,Lin ...
- PHP中VC6、VC9、TS、NTS版本区别与用法
1. VC6与VC9的区别: VC6 版本是使用 Visual Studio 6 编译器编译的,如果你的 PHP 是用 Apache 来架设的,那你就选择 VC6 版本. VC9 版本是使用 Vis ...
- django-xadmin后台开发
先通过pip命令行安装django<=1.9版本 示例:pip install django==1.9 从https://github.com/sshwsfc/xadmin下载xadmin源码解 ...
- Ibatis.Net <![CDATA[ ]]>标记学习(九)
当Sql语句中包含特殊字符时,例如: <select id="SelectOnePerson" resultMap="PersonModel"> s ...
- java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决
错误方式 @Test public void testDeserializeTest() throws IOException, ClassNotFoundException { ByteArrayO ...
- Archlinux系统配置学习笔记(一)
本文档是有关Archlinux系统配置的学习笔记,参考和学习的是Archlinux官方网站上的相应文档:General Recommendations. 这里的配置主要是针对按照官方网站上的文档刚刚完 ...
- Windows自动联网修复系统损坏文件
sfc修复: Win+X---命令提示符(管理员)---sfc /scannow---Enter可以查看是否存在系统文件损坏等问题 以管理员权限运行命令提示符,执行“dism /online /cle ...