Log in

View Full Version : [FTC]: [FTC]: Using Android's Built in Sensors


jkgjur
16-11-2016, 00:12
I have been playing around with getting the built in sensors in the ZTE phones to return some values for me. Currently, I just want it to return the different sensors available on the phone. I have written code that will do this, but as soon as I initialized the robot, it gave off this error:

Can't create handler inside thread that has not called Looper.prepare()

I looked up the error and I tried using the methods that were given. I wrote some more code that could have possibly fixed it, but the same error was returned. This is the current code that I am testing:

My Sensors class
package org.firstinspires.ftc.robotcontroller.internal.sen sor;

import android.app.Activity;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.os.Handler;
import android.os.Looper;

import java.util.List;

public class Sensors extends Activity implements SensorEventListener {

private final SensorManager sensorManager;

public Sensors() {
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
}

protected void onResume() {
super.onResume();
}

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

public void onAccuracyChanged(Sensor sensor, int accuracy) {
}

public void onSensorChanged(SensorEvent event) {
}

public String listAvailableSensors() {
List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL); // gets list of all sensors available on the phone
return sensorList.toString();
}



}


My TestPhoneSensor class
package org.firstinspires.ftc.robotcontroller.internal.sen sor;

import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.qualcomm.robotcore.eventloop.opmode.OpMode;

public class TestPhoneSensor extends OpMode {

Sensors sensor;

@Override
public void init() {
sensor = new Sensors();
}

@Override
public void init_loop() {

}


class LooperThread extends Thread { // code block that was supposed to "fix" it
public Handler mHandler;

public void run() {
Looper.prepare();

mHandler = new Handler() {
public void handleMessage(Message msg) {

}
};

Looper.loop();
}
}



@Override
public void loop() {
new Thread() { // other code block that was supposed to "fix" it
public void run() {
new Sensors().runOnUiThread(new Runnable(){

@Override
public void run(){
try {
telemetry.addData("Sensor List:", sensor.listAvailableSensors());//Edit,integrate this on the runOnUiThread
} catch (Exception e) {
telemetry.addData("Error:", e.getStackTrace());
}
}
});
}
}.start();

}




}


Any help is appreciated.

batteriesinblac
19-11-2016, 21:31
You want the code structured similar to the snippet below


// get sensorManager and initialise sensor listeners
mSensorManager = (SensorManager) hardwareMap.appContext.getSystemService(Context.SE NSOR_SERVICE);
if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCEL EROMETER) == null ||
mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSC OPE) == null ||
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR _ACCELERATION) == null ||
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNET IC_FIELD) == null) {
DbgLog.msg("FTC4855 - For this OpMode a phone with Gyro / Accelerometer / Magnetometer is required");
bInitialized = false;
}
else {
bInitialized = true;

initListeners();

// wait for one second until gyroscope and magnetometer/accelerometer
// data is initialised then scedule the complementary filter task
fuseTimer.scheduleAtFixedRate(new calculateFusedOrientationTask(),
1000, TIME_CONSTANT);
}

...

// This function registers sensor listeners for the accelerometer, magnetometer and gyroscope.
private void initListeners(){
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELE ROMETER),
SensorManager.SENSOR_DELAY_FASTEST);

mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSC OPE),
SensorManager.SENSOR_DELAY_FASTEST);

mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNET IC_FIELD),
SensorManager.SENSOR_DELAY_FASTEST);

mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR _ACCELERATION),
SensorManager.SENSOR_DELAY_FASTEST);
}