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.
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.