listener - Android compass issue -
so im trying make app tracks direction phone pointed via compass , once button hit on screen displays number of pointed in degrees. far understand how compass created can not find values pointed direction in relation north. here have far.
public class compass extends activity implements onclicklistener, sensoreventlistener{ private final sensormanager dirpoint; float var; textview thenumber; button directionin; public compass(){ dirpoint = (sensormanager) getsystemservice(context.sensor_service); } public void onaccuracychanged(sensor sensor, int accuracy) {} public void onsensorchanged(sensorevent event) {} @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); thenumber = (textview) findviewbyid(r.id.output); directionin =(button) findviewbyid(r.id.buton); directionin.setonclicklistener(new onclicklistener(){ @override public void onclick(view v) { //gets direction of phone compass // ((textview)findviewbyid(r.id.output)).settext(var); } } } } any welcomed or if im headed in right direction nice.
you have implement "compass". can this:
let activity implement sensoreventlistener , add necessary fields:
public class compassactivity extends activity implements sensoreventlistener { private sensormanager sensormanager; private sensor accelerometer; private sensor magnetometer; private float[] lastaccelerometer = new float[3]; private float[] lastmagnetometer = new float[3]; private boolean lastaccelerometerset = false; private boolean lastmagnetometerset = false; private float[] rotationmatrix = new float[9]; private float[] orientation = new float[3]; private float currentdegree = 0f; in oncreate method of activity , start 2 sensors, accelerometer , magnetometer:
// oncreate method stub ... sensormanager = (sensormanager) getsystemservice(context.sensor_service); accelerometer = sensormanager.getdefaultsensor(sensor.type_accelerometer); magnetometer = sensormanager.getdefaultsensor(sensor.type_magnetic_field); sensormanager.registerlistener(this, accelerometer, sensormanager.sensor_delay_ui); sensormanager.registerlistener(this, magnetometer, sensormanager.sensor_delay_ui); // more oncreate method stub .... in method of sensoreventlistener can calculate heading of phone , calculate bearing between current location , other location:
@override public void onsensorchanged(sensorevent event) { if (event.sensor == this.accelerometer) { system.arraycopy(event.values, 0, this.lastaccelerometer, 0, event.values.length); this.lastaccelerometerset = true; } else if (event.sensor == this.magnetometer) { system.arraycopy(event.values, 0, this.lastmagnetometer, 0, event.values.length); this.lastmagnetometerset = true; } if (this.lastaccelerometerset && this.lastaccelerometerset) { sensormanager.getrotationmatrix(this.rotationmatrix,null, this.lastaccelerometer, this.lastmagnetometer); sensormanager.getorientation(this.rotationmatrix, this.orientation); float azimuthinradiands = this.orientation[0]; // heading of phone. if want // rotate view north don´t forget have // rotate negative value. float azimuthindegrees = (float) math.todegrees(azimuthinradiands); } } but don´t forget there more behind compass. have show user if magnetic field sensor uncalibrated. have calculate difference between magnetic , geographic north...
i have created small compass helper class. howto in readme. provide information need present compass on screen:
it provides current heading of device. please don´t hesitate ask me if have problems.
Comments
Post a Comment