package com.google.mcommerce.sample.android.chapter08.sensor; import android.app.Activity; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import com.google.mcommerce.sample.android.R; public class VirtualIJaxActivity extends Activity implements SensorEventListener { private static final String TAG = "VirtualJax"; private SensorManager mgr; private Sensor accel; private Sensor compass; private Sensor orient; private TextView preferred; private TextView orientation; private int ready = 0; private float[] accelValues = new float[3]; private float[] compassValues = new float[3]; private float[] inR = new float[9]; private float[] inclineMatrix = new float[9]; private float[] orientationValues = new float[3]; private float[] prefValues = new float[3]; private float mAzimuth; private double mInclination; private int counter; private int mRotation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c08_sensor_virtua_jax); preferred = (TextView) findViewById(R.id.preferred); orientation = (TextView) findViewById(R.id.orientation); mgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); accel = mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); compass = mgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); orient = mgr.getDefaultSensor(Sensor.TYPE_ORIENTATION); WindowManager window = (WindowManager) this .getSystemService(WINDOW_SERVICE); int apiLevel = Integer.parseInt(Build.VERSION.SDK); if (apiLevel < 8) { mRotation = window.getDefaultDisplay().getOrientation(); } else { mRotation = window.getDefaultDisplay().getRotation(); } } @Override protected void onResume() { mgr.registerListener(this, accel, SensorManager.SENSOR_DELAY_GAME); mgr.registerListener(this, compass, SensorManager.SENSOR_DELAY_GAME); mgr.registerListener(this, orient, SensorManager.SENSOR_DELAY_GAME); super.onResume(); } @Override protected void onPause() { mgr.unregisterListener(this, accel); mgr.unregisterListener(this, compass); mgr.unregisterListener(this, orient); super.onPause(); } public void onAccuracyChanged(Sensor sensor, int accuracy) { // ignore } public void onSensorChanged(SensorEvent event) { // Need to get both accelerometer and compass // before we can determine our orientationValues switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: for (int i = 0; i < 3; i++) { accelValues[i] = event.values[i]; } if (compassValues[0] != 0) ready = ready | 1; break; case Sensor.TYPE_MAGNETIC_FIELD: for (int i = 0; i < 3; i++) { compassValues[i] = event.values[i]; } if (accelValues[2] != 0) ready = ready | 2; break; case Sensor.TYPE_ORIENTATION: for (int i = 0; i < 3; i++) { orientationValues[i] = event.values[i]; } break; } if (ready != 3) return; if (SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues)) { // got a good rotation matrix mInclination = SensorManager.getInclination(inclineMatrix); SensorManager.getOrientation(inR, prefValues); // Display every 10th value if (counter++ % 10 == 0) { doUpdate(null); counter = 1; } } } public void doUpdate(View view) { if (ready != 3) return; mAzimuth = (float) Math.toDegrees(prefValues[0]); if (mAzimuth < 0) { mAzimuth += 360.0f; } String msg = String .format("Preferred:\nazimuth (Z): %7.3f \npitch (X): %7.3f\nroll (Y): %7.3f", mAzimuth, Math.toDegrees(prefValues[1]), Math.toDegrees(prefValues[2])); preferred.setText(msg); msg = String .format("Orientation Sensor:\nazimuth (Z): %7.3f\npitch (X): %7.3f\nroll (Y): %7.3f", orientationValues[0], orientationValues[1], orientationValues[2]); orientation.setText(msg); preferred.invalidate(); orientation.invalidate(); } public void doShow(View view) { // google.streetview:cbll=30.32454,-81.6584&cbp=1,yaw,,pitch,1.0 // yaw = degrees clockwise from North // For yaw we can use either mAzimuth or orientationValues[0]. // // pitch = degrees up or down. -90 is looking straight up, // +90 is looking straight down // except that pitch doesn't work properly Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("google.streetview:cbll=30.32454,-81.6584&cbp=1," + Math.round(orientationValues[0]) + ",,0,1.0")); startActivity(intent); return; } }