2012-02-28 25 views
5

ateşleyemeyen ve ben üzerinde 2.3 ile benim LG Optimus S mükemmel çalışıyor bu etkinliği var, ama benim stok üzerinde ICS 4.0.2 çalıştıran Verizon Galaxy Nexus TYPE_MAGNETIC_FIELD olayı hiç ateş etmiyor.TYPE_MAGNETIC_FIELD olay benim Galaxy Nexus ICS ben telefonun eğik açı almaya çalışıyorum 4.0.2

TYPE_MAGNETIC_FIELD olayı hiç tetiklemediğinden, SensorManager.getRotationMatrix'e geçmek için gerekli mGravs dizisini alamıyorum. Bu yüzden telefonun açısını anlatamam. Bu kodun diğer cihazımda harika çalıştığından ve telefonun eğim açısını problemsiz görebildiğim gibi. Benim Galaxy Nexus ile bu olayı almamanızın

Herhangi biliyor musunuz? SDK'nın çalışmasını engelleyecek herhangi bir değişiklik oldu mu?

package com.rain.united; 

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class Gameplay extends Activity implements SensorEventListener{ 
    private static final String TAG = "CameraDemo"; 
    private TextView mOrientationData; 
    private SensorManager mSensMan; 
    private float mAzimuth; 
    private float[] mGravs = new float[3]; 
    private float[] mGeoMags = new float[3]; 
    private float[] mOrientation = new float[3]; 
    private float[] mRotationM = new float[9]; 
    private float[] mRemapedRotationM = new float[9]; 
    private boolean mFailed; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gameplay); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     mOrientationData = (TextView) findViewById(R.id.orientation_data); 

     mSensMan = (SensorManager) getSystemService(SENSOR_SERVICE); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mSensMan.registerListener(this, mSensMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_UI); 
     mSensMan.registerListener(this, mSensMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_UI); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensMan.unregisterListener(this); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
      return; 
     Log.d("united", "anything"); 
     switch (event.sensor.getType()) { 
      case Sensor.TYPE_MAGNETIC_FIELD: 
       //I NEVER GET TO THIS CODE ON MY GALAXY NEXUS 
       System.arraycopy(event.values, 0, mGravs, 0, 3); 
       Log.d("united", mGravs.toString()); 
       break; 
      case Sensor.TYPE_ACCELEROMETER: 
       // Here let's try another way: 
       for (int i=0;i<3;i++) mGeoMags[i] = event.values[i]; 
        break; 
       default: 
        return; 
     } 
     if (SensorManager.getRotationMatrix(mRotationM, null, mGravs, mGeoMags)){ 
      //Rotate to the camera's line of view (Y axis along the camera's axis) 
      //TODO: Find how to use android.opengl.Matrix to rotate to an arbitrary coordinate system. 
      SensorManager.remapCoordinateSystem(mRotationM, SensorManager.AXIS_X, 
        SensorManager.AXIS_Z, mRemapedRotationM); 
      SensorManager.getOrientation(mRemapedRotationM, mOrientation); 
      onSuccess(); 
     } else { 
      onFailure(); 
     } 
    } 

    void onSuccess(){ 
     if (mFailed) mFailed = false; 
     //  Convert the azimuth to degrees in 0.5 degree resolution. 
     mAzimuth = (float) Math.round((Math.toDegrees(mOrientation[0])) *2)/ 2; 
     //  Adjust the range: 0 < range <= 360 (from: -180 < range <= 180). 
     mAzimuth = (mAzimuth+360)%360; // alternative: mAzimuth = mAzimuth>=0 ? mAzimuth : mAzimuth+360; 
     mOrientationData.setText("Azimuth= " + mAzimuth); 
    } 
    void onFailure() { 
     if (!mFailed) { 
      mFailed = true; 
      mOrientationData.setText("didn't get rotation info"); 
     } 
    } 
} 
+0

Bununla başa çıkmayı başardınız mı? – Mikooos

+1

Aynı problemim var. –

+0

Galaxy S3 ve Asus tablette de aynı sorun var. Birisi bu kötü şeyi düzeltti mi? – WindRider

cevap

3
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) return; 

bu satırı kaldırın:

İşte benim faaliyettir. Manyetik sensör bu doğruluk durumunu geri veriyor ve kodunuz bu olayları atıyor.

+0

Thx, bu – Hrk

+0

beni de yardım etti SE Xperia Mini X8 ve Samsung Galaxy S1 (ve daha büyük olasılıkla çok) üzerinde yardımcı oldu !!!!! – user2924714

İlgili konular