Android - обнаруживает, когда телефон переворачивается

Я хочу определить, когда телефон повернут, а экран телефона направлен вниз, а задняя сторона телефона направлена вверх. Как мне это сделать?

В основном я хочу обнаружить, когда телефон перевернулся!

2 ответа

Вот как я это сделал:

package com.example.accsensordemo.service;

import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Vibrator;
import android.util.Log;

public class MotionControlService extends Service implements SensorEventListener {

 private static final String TAG = "MotionControlService";

 private float mGZ = 0;//gravity acceleration along the z axis
 private int mEventCountSinceGZChanged = 0;
 private static final int MAX_COUNT_GZ_CHANGE = 10;

 @Override
 public IBinder onBind(Intent intent) {
 return null;
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {

 Log.d(TAG, "onStartCommand, Started: " + mStarted);

 if (!mStarted) {
 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

 mSensorManager.registerListener(this,
 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
 SensorManager.SENSOR_DELAY_GAME);

 mStarted = true;
 }
 return START_STICKY;
 }

 @Override
 public void onSensorChanged(SensorEvent event) {
 int type = event.sensor.getType();
 if (type == Sensor.TYPE_ACCELEROMETER) {
 float gz = event.values[2];
 if (mGZ == 0) {
 mGZ = gz;
 } else {
 if ((mGZ * gz) < 0) {
 mEventCountSinceGZChanged++;
 if (mEventCountSinceGZChanged == MAX_COUNT_GZ_CHANGE) {
 mGZ = gz;
 mEventCountSinceGZChanged = 0;
 if (gz > 0) {
 Log.d(TAG, "now screen is facing up.");
 } else if (gz < 0) {
 Log.d(TAG, "now screen is facing down.");
 }
 }
 } else {
 if (mEventCountSinceGZChanged > 0) {
 mGZ = gz;
 mEventCountSinceGZChanged = 0;
 }
 }
 }
 }
 }

 @Override
 public void onAccuracyChanged(Sensor sensor, int accuracy) {
 // TODO Auto-generated method stub
 }
}


Для этого вам необходимо зарегистрировать SensorEventListener по ориентации, а затем добавить обратный вызов к методу onSensorChanged. Логика, вероятно, будет очень похожа на компас, который реализован здесь: http://www.vogella.com/articles/AndroidSensor/article.html, за исключением того, что вы захотите проверить, не имеет ли значение sensorEvent ROTATION_0, ROTATION_90, ROTATION_180 или ROTATION_270 и действуют соответственно.

Вам также, вероятно, потребуется сохранить предыдущую ориентацию экрана, чтобы вы могли проверить, было ли вращение вращением на 180 градусов или только поворот на 90 градусов.

licensed under cc by-sa 3.0 with attribution.