android 摇一摇功能的实现

引言:

今天,在修改闹钟的一个bug,发现了在时钟(android 5.0)设置中有一个摇动行为设置项,主要是针对闹钟响铃声时,如果我们不想起床,可以通过设置摇动手机来关闭铃声或者延时多长时间再响闹铃。

主要原理

(1)启动一个service,中service中监听摇动手机的操作。

(2)在服务中,注册一个SensorEventListener监听事件,处理Sensor.TYPE_ACCELEROMETER.

当摇动手机,触发摇动事件时,进行相应的事件操作。

这个触发摇动事件的触发值是SENSITIVITY,我们可以调节这个值来调整触发摇动事件的敏感度。

触发摇动手机事件后,进行相对应的操作 handleShakeAction(),我只是弹出了一个Toase,你可以写自己想做的任务操作。

核心代码

(1)ShakeService—–监听摇动手机的服务

package com.example.shakefunction;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ShakeService extends Service{

    public static final String TAG = "ShakeService";
    private SensorManager mSensorManager;

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

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

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        mSensorManager.registerListener(mShakeListener,
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                //SensorManager.SENSOR_DELAY_GAME,
                50 * 1000); //batch every 50 milliseconds

        return super.onStartCommand(intent, flags, startId);
    }

    private final SensorEventListener mShakeListener = new SensorEventListener() {
        private static final float SENSITIVITY = 16;
        private static final int BUFFER = 5;
        private float[] gravity = new float[3];
        private float average = 0;
        private int fill = 0;

        @Override
        public void onAccuracyChanged(Sensor sensor, int acc) {
        }

        public void onSensorChanged(SensorEvent event) {
            final float alpha = 0.8F;

            for (int i = 0; i < 3; i++) {
                gravity[i] = alpha * gravity[i] + (1 - alpha) * event.values[i];
            }

            float x = event.values[0] - gravity[0];
            float y = event.values[1] - gravity[1];
            float z = event.values[2] - gravity[2];

            if (fill <= BUFFER) {
                average += Math.abs(x) + Math.abs(y) + Math.abs(z);
                fill++;
            } else {
                Log.i(TAG, "average:"+average);
                Log.i(TAG, "average / BUFFER:"+(average / BUFFER));
                if (average / BUFFER >= SENSITIVITY) {
                    handleShakeAction();
                }
                average = 0;
                fill = 0;
            }
        }
    };

    protected void handleShakeAction() {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "shake success", Toast.LENGTH_LONG).show();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

(2)在主界面中启动和关闭ShakeService

Intent intent = new Intent();
intent.setClass(this, ShakeService.class); 

if(view == startService){
    startService(intent);
}else if(view == stopService){
    stopService(intent);
}

(3)在AndroidManifest.xml定义ShakeService

<service android:name=".ShakeService"
         android:exported="false">
</service>

源码下载

http://download.csdn.net/detail/hfreeman2008/8970759

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-17 13:00:50

android 摇一摇功能的实现的相关文章

Android加速度传感器的使用:摇一摇功能的实现

一.原理介绍: Android手机中摇一摇的功能已经很常见了,最近接触到了这个功能,原理很简单:使用加速度传感器,在晃动手机时,监听加速度在各个方向的变化,当加速度值超过设定的灵敏度时,则触发摇一摇功能. 二.使用到的类: SensorManager SensorEventListener 三.功能实现: 1.摇一摇功能:我将摇一摇功能封装成了一个类ShakeUtils,在使用时按照注释中的说明使用即可,ShakeUtils.java如下(差的包请CTRL+SHIFT+O导入): /** * 摇

Android 使用加速度传感器实现摇一摇功能及优化

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得传感器管理器的实例 sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 2.通过传感器管理器获得加速传感器 accelerateSensor = getSensorManager(cont

Android 微信摇一摇功能实现

开发之前 今天学习了一下传感器, 脑子里就蹦出了微信的摇一摇, 于是鼓了鼓勇气抽空写了出来, 本人菜鸟一枚, 希望大神们多多指点 开发环境 Android Studio 2.2.1 JDK1.7 API 24 Gradle 2.2.1 相关知识点 加速度传感器 补间动画 手机震动 (Vibrator) 较短 声音/音效 的播放 (SoundPool) 开始开发 案例预览 案例分析 我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时

Android摇一摇功能的实现

Android利用传感器实现类似摇一摇功能 1.基本原理 摇一摇功能基本原理是利用手机加速度传感器,当加速度到达某个值时,触发某个事件,如UI改变,手机震动,播放声音,获取数据等事件. 2.传感器原理和使用 传感器原理和使用,可以参见上一篇博客,Android中传感器Sensor的使用 3.声音事件 获取对象MediaPlay类  mediaPlayer=MediaPlayer.create(getApplicationContext(), R.raw.music); 事件触发:mediaPla

android传感器;摇一摇抽签功能

package com.kane.sensortest; import java.util.Random; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.ap

Android实现摇一摇功能

做过一个小项目,其中实现了摇一摇功能和刮一刮功能还有播放背景音乐等 摇一摇功能主要用到加速度传感器:Sensor.TYPE_ACCELEROMETER 摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件. /** * FileName: MainActivity.java * @desc 该类是用于显示摇一摇界面 * @author HTP * @Date 20140311 * @version 1.00 */ public class MainActivity extends

Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内容,很多手机需要一直按住退格键逐字逐句的删除,稍稍麻烦,不过 在iPhone上,有个人性化的功能,当我们想要去撤销刚刚输入的所有内容的时候,可以轻轻晃动手机,会弹出提示框,点击确定就可以清空内容,如下图: 在 android中,一般手机貌似没有定制这个功能,不过我们可以自己去实现这样的功能,放置在我

Android 摇一摇之双甩功能

最近做一个摇一摇的功能 网上相关代码很多 但是这次的需求有点奇葩 要求是摇两次才生效 看起来好像很简单 但真正要做遇到的问题还是很多 时间限制 机型灵敏性 摇动的方式 弄了一周多 做出的效果算一般吧 原理介绍 其实就是加速度传感器的使用 开发传感器应用的步骤如下 1 调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取 SensorManager对象 SensorManager代表系统的传感器管理服务2 调用SensorManager的ge

Android实战简易教程-第三十一枪(基于加速度传感器的摇一摇功能实例)

下面我们来看一下微信摇一摇功能的模拟实现,我们是基于手机加速度传感器实现该功能,实现方法比较简单. MainActivity.java: MainActivity.java: package com.location.activity; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; i

android 实现摇一摇功能

实现"摇一摇"功能,其实很简单,就是检测手机的重力感应,具体实现代码如下: 一.在 AndroidManifest.xml 中添加操作权限 <uses-permission android:name="android.permission.VIBRATE"/> 二.实现代码 [java] view plaincopy package com.xs.test; import android.app.Activity; import android.hard