布局文文件:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:background="#ffffff"> <TextView android:id="@+id/myTextView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请摇晃手机" android:textSize="30dp" android:textColor="#000000" android:gravity="center" /> </LinearLayout> java文件:ShakeListener.javapackage com.example.myShake;
import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Log; /** * 一个检測手机摇晃的监听器 */ public class ShakeListener implements SensorEventListener { // 速度阈值,当摇晃速度达到这值后产生作用private static final int SPEED_SHRESHOLD = 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 c) { // 获得监听对象mContext = c;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_GAME);}}// 停止检測public void stop() { sensorManager.unregisterListener(this);}// 设置重力感应监听器public void setOnShakeListener(OnShakeListener listener) { onShakeListener = listener;}// 重力感应器感应获得变化数据public void onSensorChanged(SensorEvent event) { // 如今检測时间long currentUpdateTime = System.currentTimeMillis();// 两次检測的时间间隔long timeInterval = currentUpdateTime - lastUpdateTime;// 推断是否达到了检測时间间隔if (timeInterval < UPTATE_INTERVAL_TIME)return;// 如今的时间变成last时间lastUpdateTime = currentUpdateTime;// 获得x,y,z坐标float x = event.values[0];float y = event.values[1];float z = event.values[2];// 获得x,y,z的变化值float deltaX = x - lastX;float deltaY = y - lastY;float deltaZ = z - lastZ;// 将如今的坐标变成last坐标lastX = x;lastY = y;lastZ = z;double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ* deltaZ)/ timeInterval * 10000;Log.v("thelog", "===========log===================");// 达到速度阀值。发出提示if (speed >= SPEED_SHRESHOLD) { onShakeListener.onShake();}}public void onAccuracyChanged(Sensor sensor, int accuracy) { }// 摇晃监听接口public interface OnShakeListener { public void onShake();} }java文件:MyActivity.java
package com.example.myShake;
import android.app.Activity; import android.app.Service; import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.os.Vibrator; import android.util.Log; import android.widget.TextView; public class MyActivity extends Activity { private AudioManager audioManager;//管理音频的类 private SoundPool soundPool;//声明一个SoundPool private int music, music2;//。来设置suondID private ShakeListener mShakeListener=null; public static long GrouplastUpdateTime; private TextView MyTextView; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MyTextView=(TextView)findViewById(R.id.myTextView); mShakeListener = new ShakeListener(this); setListeners(); initState(); } //加入摇一摇声音 private void initState() { soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);//第一个參数为同一时候播放数据流的最大个数,第二数据流类型,第三为声音质量 music = soundPool.load(this, R.raw.shake_sound_male, 1); //把你的声音素材放到res/raw里,第2个參数即为资源文件,第3个为音乐的优先级 music2 = soundPool.load(this, R.raw.shake_sound, 1); } //加入摇一摇监听 private void setListeners() { mShakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() { public void onShake() { System.out.println("<<<<<<"+"Group"); long currentUpdateTime = System.currentTimeMillis(); long timeInterval = currentUpdateTime - GrouplastUpdateTime; //设置每三秒可摇一次 if (timeInterval < 3000) return; GrouplastUpdateTime = currentUpdateTime; // 手机震动效果 // Vibrator vVi = (Vibrator) MyActivity.this // .getSystemService(Service.VIBRATOR_SERVICE);//此处报错。什么安全异常,小五也不知道为啥 。望高手指点
// vVi.vibrate(400); //播放音频。能够对左右音量分别设置,能够设置优先级,循环次数以及速率 //速率最高2,最低0.5,正常为1 float volumeNum = (float)getVolume()/7; int streamID = soundPool.play(music, 1, 1, 0, 0, (float)1.4); soundPool.setVolume(streamID, volumeNum, volumeNum); // soundPool.play(music, 1, 1, 0, 0, 1);//播放声音 Thread thread=new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); float volumeNum = (float)getVolume()/7; int streamID = soundPool.play(music2, 1, 1, 0, 0, (float)1.4); soundPool.setVolume(streamID, volumeNum, volumeNum);//播放声音 } catch (InterruptedException e) { e.printStackTrace(); } } }); thread.start(); MyTextView.setText("Hello World!!!"); } }); } //获得当前系统音量 0~7 private int getVolume(){ int volume = -1; audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); volume = audioManager.getStreamVolume(AudioManager.STREAM_RING); Log.i("STREAM_RING", "" + volume); return volume; } }