Я пытаюсь внедрить MovementDetector в свою программную клавиатуру, но получаю эту ошибку. Когда я компилирую свой код, все работает, но когда я начинаю использовать свою клавиатуру, он показывает ошибку в logcat. Вот мой код:
public class MovementDetector implements SensorEventListener {
protected final String TAG = getClass().getSimpleName();
private Sensor accelerometer;
private SensorManager mSensorMgr;
public static Context mContext;
float [] history = new float[2];
public static String [] direction = {"NONE","NONE"};
private MovementDetector(Context context) {
mContext = context;
}
private static MovementDetector mInstance;
public static MovementDetector getInstance() {
if (mInstance == null) {
mInstance = new MovementDetector(mContext);
mInstance.init();
}
return mInstance;
}
private HashSet<Listener> mListeners = new HashSet<MovementDetector.Listener>();
private void init() {
mSensorMgr = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
accelerometer = mSensorMgr.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
}
public void start() {
mSensorMgr.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
public void stop() {
mSensorMgr.unregisterListener(this);
}
public void addListener(Listener listener) {
mListeners.add(listener);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1];
history[0] = event.values[0];
history[1] = event.values[1];
float diff = (float) Math.sqrt(x * x + y * y + z * z);
if (diff > 0.5)
if (xChange > 2){
direction[0] = "LEFT";
}else if (xChange < -2){
direction[0] = "RIGHT";
}
if (yChange > 2){
direction[1] = "DOWN";
}else if (yChange < -2){
direction[1] = "UP";
}
for (Listener listener : mListeners) {
listener.onMotionDetected(event, diff);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public interface Listener {
void onMotionDetected(SensorEvent event, float acceleration);
}
}
Я получаю ошибку в этой строке:
mSensorMgr = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
Я запускаю MovementDetector в OnCreateInputView() и останавливаю его в OnDestory(), но проблема не в этом. Проблема в классе MovementDetector. Может кто-нибудь, пожалуйста, скажите мне, что мне делать и что я сделал не так? Заранее спасибо. Действительно нужно, чтобы этот MovementDetector работал.
mContext
равна нулю. Его не передают должным образом в конструкторе. Поставьте точку останова в конструкторе и посмотрите, получите ли вы там значение. - person Antrromet   schedule 12.08.2015private MovementDetector(Context context) { if(context != null) { mContext = context; } }
- person jelic98   schedule 12.08.2015context
конструктору. Проверьте место, где вы инициализируетеMovementDetector
cariable. - person Antrromet   schedule 15.08.2015mSensorMgr = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
, и ошибка в этой строке - person jelic98   schedule 15.08.2015MovementDetector
. Это будет выглядеть примерно так:mMovementDetector = new MovementDetector();
. Не могли бы вы вставить эту строку? - person Antrromet   schedule 15.08.2015MovementDetector.getInstance().start(); MovementDetector.getInstance().addListener(new MovementDetector.Listener() {/*detection of the movement*/}
и нигде больше я не могу найтиnew MovementDetector
- person jelic98   schedule 15.08.2015