2012-06-28 8 views
5

を検出は、いくつかの向きに活動の方向スティックを維持しながら、私はセンサデータを使用して手動で再生せずにAndroidデバイスの向きの変化を検出する必要があるデバイスの向き

onConfigurationChangeが回転しないように私の活動を固執するよう動作しません。

オリエンテーションの変化を検出するためにセンサデータを再生する私は、ホイールの発明として、アンドロイドはデバイスの向きの変化を検出するためのアルゴリズムの実装を既に持っていると考えています。そして、別の側面から、向きの変化の検出は、このような簡単なチェックではありません。

public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) { 
      return; 
     } 
     //getResources().getConfiguration().orientation; 
     if (event.values[1] < 6.5 && event.values[1] > -6.5) { 
      if (orientation!=1) { 
       Log.d("Sensor", "Protrait"); 
      } 
      orientation=1; 
     } else { 
      if (orientation!=0) { 
       Log.d("Sensor", "Landscape"); 
      } 
      orientation=0; 
     } 
    } 

ノイズからのフィルタリングや急激な短いシェイク/ローテーションのような実際のデータ処理が実際に必要です。

レガシーサービスを使用してデバイスの方向がどのように検出されるかについての考え方はありますか? (もう一度、私は何らかのオリエンテーションに私の活動を固執するので、onConfigurationChangeは動作しません)

+0

が、これはあなたが望んだものではありません??? http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone –

+0

いいえ、変更するリソースがありません – deimus

答えて

8

オリエンテーションイベントのリスナーがあります。

Check the document here.

SO question mentioning implementation of that Listener.

Code Example for the same here in this blog

私は、これはあなたに私の活動は常にポートレートモードに設定されて

+0

ありがとうございました。尊敬 !!!私は新しいアンドロイドですが、たくさんのアンドロイドデベロッパーがこのようにstackoverflowでこれを認識していないようです – deimus

+0

あなたはDeimusを歓迎します。誰も完璧ではありません、すべてが独自の専門分野を持っています。 5日:)ハッピーコーディー – rajpara

5

を助けることを願っています。このコードを作成します。

myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) { 
     public void onOrientationChanged(int arg0) { 
      if (arg0>=315 || arg0<45){ 
       currentOrientation = Surface.ROTATION_90; 
      }else if (arg0>=45 && arg0<135){ 
       currentOrientation = Surface.ROTATION_180; 
      }else if (arg0>=135 && arg0<225){ 
       currentOrientation = Surface.ROTATION_270; 
      }else if (arg0>=225 && arg0<315){ 
       currentOrientation = Surface.ROTATION_0; 
      } 
     } 
    }; 
+0

これは私を助けてくれました。アクティビティがある方向にロックされていても、まだデバイスの位置を取得する必要がある場合は、これが正しい方法です:) – Tooroop

5

マニフェストにscreenOrientationプロパティを設定することによって、あなたはそれが発射停止するようもうonConfigurationChangedからオリエンテーション値を取得することはできません、方向を計算するPitchrollyaw角を得るためにSensorEventListenerを実装することは可能ですが、そのような仕事のためには少し複雑で過度のものです。私が見つけた最良の解決策は、次のコードは、値が0回転角度に応じて4にある姿勢変化に回転値を更新しますOrientationEventListenerを使用することです:

private OrientationEventListener listener; 
private int rotation; 

@Override 
protected void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.main); 

    listener = new OrientationEventListener (this, SensorManager.SENSOR_DELAY_NORMAL) 
    { 
     @Override 
     public void onOrientationChanged (int orientation) 
     { 
      rotation = ((orientation + 45)/90) % 4; 
     } 
    }; 

    if (myOrientationEventListener.canDetectOrientation()) listener.enable(); 
    else listener = null; // Orientation detection not supported 
} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    if (listener != null) listener.disable(); 
} 
関連する問題