1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android 通过加速度传感器实现手机来电时翻转静音

android 通过加速度传感器实现手机来电时翻转静音

时间:2023-07-29 17:24:56

相关推荐

android 通过加速度传感器实现手机来电时翻转静音

实现思路

通过加速度传感器获取 X,Y,Z 三轴所受的重力计算在指定的时间段内,手机在 X,Y,Z 矢量和的方向上的速度如果速度大于指定的速度阀值,判定手机当前在剧烈抖动;并结束当前方法通过Z轴的改变判断手机是否发生反转,如果是调用AudioManager的setRingerMode(AudioManager.RINGER_MODE_SILENT)方法使手机静音

代码

public class MainActivity extends AppCompatActivity {SensorManager mSensorManager = null;AccelerometerSilentListener mAccelerometerSilentListener = null;AudioManager mAudioManager = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mAccelerometerSilentListener = new AccelerometerSilentListener();mSensorManager.registerListener(mAccelerometerSilentListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onDestroy() {super.onDestroy();if (mSensorManager != null) {mSensorManager.unregisterListener(mAccelerometerSilentListener);}}private class AccelerometerSilentListener implements SensorEventListener {private static final int SPEED_LIMIT = 800; //速度阀指private static final int UPDATE_INTERNAL_TIME = 60; //两次取样时间差private long lastTime = 0;private float lastX = 0;private float lastY = 0;private float lastZ = 0;private boolean isUp = false;@Overridepublic void onSensorChanged(SensorEvent event) {long currentTime = System.currentTimeMillis();float internalTime = currentTime - lastTime;if (internalTime < UPDATE_INTERNAL_TIME) {return;}lastTime = currentTime;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) / internalTime * 10000; //算出后速度为 mm/sif (speed > SPEED_LIMIT) {return;}if (x > -1 && x < 1 && y > -1 && y < 1) {if (z > 0) {isUp = true;} else {isUp = false;}} else {if (z > -10f && z < -9.6f && isUp) {mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);} else if (z > 9.6f && z < 10f && !isUp) {mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);}}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。