2013-07-21 1 views

답변

0

이렇게하려면 방향에 SensorEventListener를 등록한 다음 onSensorChanged 메서드에 콜백을 추가해야합니다. 이 논리는 아마도 http://www.vogella.com/articles/AndroidSensor/article.html에 구현 된 나침반과 매우 비슷하게 보일 것입니다. 단, sensorEvent의 값이 ROTATION_0, ROTATION_90, ROTATION_180 또는 ROTATION_270인지 확인하고 그에 따라 동작하는지 확인하고 싶을 것입니다.

또한 회전이 180도 회전인지 또는 단지 90도 회전인지를 확인할 수 있도록 이전 화면 방향을 저장할 필요가 있습니다.

+0

내가 Z-평면에서의 회전을 감지합니다. 아마도 xy 평면 일 것입니다. 어쨌든 나는 해결책을 찾았습니다. (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

관련 문제