I am trying to get the phone tilt angle and I have this activity that works fine on my LG Optimus S with 2.3 on it, but in my Verizon Galaxy Nexus warehouse the ICS 4.0.2 TYPE_MAGNETIC_FIELD event never fires.
Since the TYPE_MAGNETIC_FIELD event never fires, I do not get the mGravs array needed to go to SensorManager.getRotationMatrix. Therefore, I can’t determine the angle of the phone. As I mentioned, this code works fine on my other device, and I can easily see the angle of the phone.
Does anyone know why I did not receive this event using Galaxy Nexus? Were there any changes to the SDK that would prevent this from working?
Here is my activity:
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;
@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) {
}
@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:
System.arraycopy(event.values, 0, mGravs, 0, 3);
Log.d("united", mGravs.toString());
break;
case Sensor.TYPE_ACCELEROMETER:
for (int i=0;i<3;i++) mGeoMags[i] = event.values[i];
break;
default:
return;
}
if (SensorManager.getRotationMatrix(mRotationM, null, mGravs, mGeoMags)){
SensorManager.remapCoordinateSystem(mRotationM, SensorManager.AXIS_X,
SensorManager.AXIS_Z, mRemapedRotationM);
SensorManager.getOrientation(mRemapedRotationM, mOrientation);
onSuccess();
} else {
onFailure();
}
}
void onSuccess(){
if (mFailed) mFailed = false;
mAzimuth = (float) Math.round((Math.toDegrees(mOrientation[0])) *2)/ 2;
mAzimuth = (mAzimuth+360)%360;
mOrientationData.setText("Azimuth= " + mAzimuth);
}
void onFailure() {
if (!mFailed) {
mFailed = true;
mOrientationData.setText("didn't get rotation info");
}
}
}