2014-12-01 3 views
1

Я пытаюсь обнаружить запуск/остановку движения устройства Android в движущейся машине. К этому я пытаюсь использовать Значительный датчик движения на своем планшете Google Nexus 7 (2012) (Jellybean). Используемый код ссылки: this.Значительный датчик движения в Google Nexus 7

Однако код никогда не обнаруживает существенное движение и SensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); всегда возвращает null в коде.

Не могли бы вы предложить, что мне не хватает? Любой другой способ обнаружения запуска/остановки движения Android-устройства в движущейся машине с использованием других датчиков?

ответ

1

Не могли бы вы предложить, что мне не хватает?

Планшет, вероятно, не снабжает датчик. Я обнаружил, что многие низкоконтрастные таблетки обеспечивают только акселерометр. Устройства с богатым сенсором поставляют 5 или 6 датчиков, но я не помню, чтобы через Сенсор Significant Motion.

Вы можете использовать следующий код для сброса датчиков из JNI. Я не уверен, что вы получите те же результаты от Java. Я использую этот код для выбора датчиков и семена генератора случайных чисел, поэтому я просмотрел их на нескольких устройствах. Интересующая статья - int type = ASensor_getType(sensor);.

ASensorManager* sensorManager = ASensorManager_getInstance(); 
int n = ASensorManager_getSensorList(sensorManager, &sensorArray); 

for (int i = 0; i < n; i++) { 
    const ASensor* sensor = sensorArray[i]; 
    if (sensor == NULL) continue; 

    const char* name = ASensor_getName(sensor); 
    int type = ASensor_getType(sensor); 
    const char* vendor = ASensor_getVendor(sensor); 
    int min_delay = ASensor_getMinDelay(sensor); 
    float resolution = ASensor_getResolution(sensor); 

    LOG_DEBUG("SensorArray: %s (%s) %d %d %f", name, vendor, type, 
       min_delay, resolution); 
} 

После вызова int type = ASensor_getType(sensor);, вы можете декодировать тип с помощью следующей функции.

static const char* SensorTypeToName(int sensorType) { 
    switch (sensorType) { 

    /* <ndk root>/.../sensor.h */ 
    case ASENSOR_TYPE_ACCELEROMETER: /* 1 */ 
     return "Accelerometer"; 
    case ASENSOR_TYPE_MAGNETIC_FIELD: /* 2 */ 
     return "Magnetic field"; 
    case ASENSOR_TYPE_GYROSCOPE: /* 4 */ 
     return "Gyroscope"; 
    case ASENSOR_TYPE_LIGHT: /* 5 */ 
     return "Light"; 
    case ASENSOR_TYPE_PROXIMITY: /* 8 */ 
     return "Proximity"; 

    /* http://developer.android.com/reference/android/hardware/Sensor.html */ 
    case 0: 
     return "type 0"; 
    case 3: 
     return "Orientation"; 
    case 6: 
     return "Pressure"; 
    case 7: 
     return "Temperature"; 
    case 9: 
     return "Gravity"; 
    case 10: 
     return "Linear acceleration"; 
    case 11: 
     return "Rotation vector"; 
    case 12: 
     return "Relative humidity"; 
    case 13: 
     return "Ambient temperature"; 
    case 14: 
     return "Uncalibrated magnetic field"; 
    case 15: 
     return "Rotation vector"; 
    case 16: 
     return "Uncalibrated gyroscope"; 
    case 17: 
     return "Significant motion"; 
    case 18: 
     return "type 18"; 
    case 19: 
     return "Step counter"; 
    case 20: 
     return "Geo-magnetic rotation vector"; 
    case 21: 
     return "Heart rate"; 
    default: 
     ; 
    } 
    return "Unknown"; 
} 
+0

Спасибо за этот код. Я проверю это через некоторое время и обновить вопрос. В то же время, знаете ли вы способ обнаружения начала/остановки движения на устройстве Android, размещенном в движущейся машине? Я полагался на Significant Sensor Motion Sensor, но теперь я ищу еще один вариант. Должен ли я поднимать новый вопрос для этого последующего комментария? – stackoverflowN