2014-01-06 2 views
0

im писать простой IMU с помощью телефона Android (отправка данных через TCP на компьютер и визуализация его на ПК). Дело в том, что компиляция кода и отлично работает на API 18 и 19 (проверена на разных телефонах), проблема в том, что он не хочет работать с API 16 (телефон и эмулятор). Мне удалось заметить, что проблема заключается в методе, который инициализирует датчики. Я отправляю код и ошибку logcat ниже. Я сократил запись на SD и отправил через TCP, потому что он работает на API 16 безупречно (когда initSensors(), закомментирован). Надеюсь, ты поможешь мне. РобертsensorManager method - Невозможно возобновить работу

Основной класс:

public class Sensor412 extends Activity { 

    public SensorManager mSensorManager; 
    public mySensors mSensors; 

    // Initializing Sensors 
    void initSensors() { 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

     List<Sensor> accel_sensor_list = mSensorManager 
        .getSensorList(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener((SensorEventListener) mSensors, 
      accel_sensor_list.get(0), SensorManager.SENSOR_DELAY_UI); 

     List<Sensor> magn_sensor_list = mSensorManager 
       .getSensorList(Sensor.TYPE_MAGNETIC_FIELD); 
     mSensorManager.registerListener((SensorEventListener) mSensors, 
       magn_sensor_list.get(0), SensorManager.SENSOR_DELAY_UI); 

     List<Sensor> gyro_sensor_list = mSensorManager 
       .getSensorList(Sensor.TYPE_GYROSCOPE); 
     mSensorManager.registerListener((SensorEventListener) mSensors, 
       gyro_sensor_list.get(0), SensorManager.SENSOR_DELAY_UI); 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      //Creating sensor class 
      mSensors = new mySensors(); 

     }//onCreate 

     @Override 
     protected void onPause() { 
      super.onPause(); 
      // Wyłącz odczyt gdy aplikacja wchodzi w stan Pause 
      mSensorManager.unregisterListener(mSensors); 
     }//onPause 

     @Override 
     protected void onResume() { 
      super.onResume(); 
      // Włącz odczyt gdy aplikacja zostanie wznowiona (stan Resume) 
      initSensors(); 
     }//onResume  
    } 

mySensors класс: ошибка

package com.example.sensor412; 

import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 

public class mySensors implements SensorEventListener { 

    private static int VECTOR_SIZE = 3; 
    private static int MATRIX_SIZE = 16; 

    private int type; 
    public static float z_deg, y_deg, x_deg, accels_x, accels_y, accels_z, 
      magn_x, magn_y, magn_z, gyro_x, gyro_y, gyro_z; 
    private boolean isReady; 

    float[] vals = new float[VECTOR_SIZE]; 
    float[] accels = new float[VECTOR_SIZE]; 
    float[] magn = new float[VECTOR_SIZE]; 
    float[] gyro = new float[VECTOR_SIZE]; 
    float[] orientation_rad = new float[VECTOR_SIZE]; 

    float[] R_orig = new float[MATRIX_SIZE]; 
    float[] I_orig = new float[VECTOR_SIZE]; 
    float[] R_remapped = new float[MATRIX_SIZE]; 

    public void onSensorChanged(SensorEvent event) { 
     type = event.sensor.getType(); 
     vals = event.values.clone(); 

     switch (type) { 
     case Sensor.TYPE_ACCELEROMETER: 
      accels = vals.clone(); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      magn = vals.clone(); 
      break; 
     case Sensor.TYPE_GYROSCOPE: 
      gyro = vals.clone(); 
      isReady = true; 
     } 

     if (isReady && magn != null && accels != null && gyro != null) { 
      isReady = false; 

      SensorManager.getRotationMatrix(R_orig, I_orig, accels, magn); 
      SensorManager.getOrientation(R_orig, orientation_rad); 
      //rad->deg 
      z_deg = orientation_rad[0] * 57.2957795f; 
      y_deg = orientation_rad[1] * 57.2957795f; 
      x_deg = orientation_rad[2] * 57.2957795f; 

      accels_x = accels[0]; 
      accels_y = accels[1]; 
      accels_z = accels[2]; 

      magn_x = magn[0]; 
      magn_y = magn[1]; 
      magn_z = magn[2]; 

      gyro_x = gyro[0]; 
      gyro_y = gyro[1]; 
      gyro_z = gyro[2]; 

     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 
} 

Logcat:

01-06 00:10:16.296: E/AndroidRuntime(660): java.lang.RuntimeException: Unable to resume activity {com.example.sensor412/com.example.sensor412.Sensor412}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.os.Looper.loop(Looper.java:137) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-06 00:10:16.296: E/AndroidRuntime(660): at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 00:10:16.296: E/AndroidRuntime(660): at java.lang.reflect.Method.invoke(Method.java:511) 
01-06 00:10:16.296: E/AndroidRuntime(660): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-06 00:10:16.296: E/AndroidRuntime(660): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-06 00:10:16.296: E/AndroidRuntime(660): at dalvik.system.NativeStart.main(Native Method) 
01-06 00:10:16.296: E/AndroidRuntime(660): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
01-06 00:10:16.296: E/AndroidRuntime(660): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
01-06 00:10:16.296: E/AndroidRuntime(660): at java.util.ArrayList.get(ArrayList.java:304) 
01-06 00:10:16.296: E/AndroidRuntime(660): at java.util.Collections$UnmodifiableList.get(Collections.java:1050) 
01-06 00:10:16.296: E/AndroidRuntime(660): at com.example.sensor412.Sensor412.initSensors(Sensor412.java:125) 
01-06 00:10:16.296: E/AndroidRuntime(660): at com.example.sensor412.Sensor412.onResume(Sensor412.java:266) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.Activity.performResume(Activity.java:5082) 
01-06 00:10:16.296: E/AndroidRuntime(660): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565) 
01-06 00:10:16.296: E/AndroidRuntime(660): ... 12 more 

Снова я хотел бы добавить, что на Android 4.3 и 4.4 это делает ork отлично - как доказательство Я добавляю скриншот от моего Nexus 4, работающего под Android 4.4. (https://dl.dropboxusercontent.com/u/60262901/sensorapp.png)

EDIT: Спасибо за ответы, как телефон я тестирование приложения с и эму не имеют гироскоп это вызвало проблемы, реальные телефоны с API 18 и 19 имели эти датчики и с этим ему работала безупречно. Спасибо за ответы!

+0

Что находится на линии 125 в вашем классе 'Sensor412'? –

+0

Линия 124 'mSensorManager.registerListener ((SensorEventListener) mSensors,' Строка 125 'gyro_sensor_list.get (0), SensorManager.SENSOR_DELAY_UI);' Pastebin полный класс: http://pastebin.com/QXhcRaSk – Listek999

+0

Я думаю, что у вашего телефона не было датчика гироскопа. Проверьте размер gyro_sensor_list перед вызовом gyro_sensor_list.get (0). –

ответ

0

Похоже, что список датчиков гироскопа пуст, следовательно IndexOutOfBoundsException. Можете ли вы подтвердить, что у эмулятора и устройства на API 16 есть гироскопы? В качестве защиты вы должны убедиться, что массив не пуст, прежде чем пытаться получить из него какие-либо элементы.

+0

Да, список пуст, потому что у телефона emu и API 16 (Galaxy Core) нет гироскопа. В качестве объяснения самого себя я хочу сказать, что я был уверен, что у каждого телефона есть это сейчас. Спасибо за ответ. – Listek999

+0

Верьте или нет, у некоторых телефонов среднего и нижнего уровня все еще нет современных датчиков! Фактически, вы должны, вероятно, делать проверки всех ваших датчиков, чтобы убедиться, что у них есть телефон. Вы не хотите, чтобы приложение вышло из строя, когда кто-то, у кого нет одного из датчиков, вы хотите его открыть! –

+1

Хорошо, вот что я сейчас буду писать. Спасибо еще раз. – Listek999

Смежные вопросы