2013-07-21 2 views

ответ

0

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

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

+0

Я хочу, чтобы обнаружить вращение в плоскости г. Это, вероятно, для xy-plane. В любом случае я нашел решение [здесь] (http://android-er.blogspot.in/2011/02/detect-phone-flipping.html) – Naddy

+0

Есть ли способ обнаружить его без службы и вместо этого через powder366

4

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

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 
    } 
} 
+0

Он отлично работает, спасибо вам. – Leebeedev

+0

Отлично, отлично работает. Спасибо за обмен. – Zekitez

Смежные вопросы