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

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

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


person Naddy    schedule 21.07.2013    source источник


Ответы (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
    }
}
person t-gao    schedule 09.04.2014

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

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

person Jonathan    schedule 21.07.2013
comment
Я хочу обнаружить вращение в z-плоскости. Это, вероятно, для xy-плоскости. Во всяком случае, я нашел решение здесь - person Naddy; 21.07.2013
comment
Есть ли способ обнаружить его без службы, а вместо этого с помощью ‹action android:name=android.intent.action.x? - person powder366; 27.02.2014