2013-03-19 2 views
1

Я пытаюсь использовать датчик линейного ускорения слияния в приложении для Android. Однако он не может найти датчик для Sensor.TYPE_LINEAR_ACCELERATION.Телефон не может найти датчик Sensor.TYPE_LINEAR_ACCELERATION

я выполняю эти вызовы:

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mLinearAcceleration = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 

После вышесказанного mAccelerometer определен, но mLinearAcceleration равно нулю. Я знаю, что TYPE_LINEAR_ACCELERATION не добавляли до уровня API 9, но я думаю, что я бегу по крайней мере уровне API 9. Вот отрывок из моего файла манифеста:

<uses-sdk 
android:minSdkVersion="9" 
android:targetSdkVersion="17" /> 

Так что я считаю, я работаю под правильным Уровень API.

Однако, когда я пытаюсь указать все доступные датчики, я не нахожу все датчики, которые должны быть доступны для этого уровня API.

Когда я звоню ...

List<Sensor> l = mSensorManager.getSensorList(Sensor.TYPE_ALL); 
for(Sensor s : l) 
    System.out.println(s.getName()); 

я

Goldfish 3-axis Accelerometer 
Goldfish 3-axis Magnetic field sensor 
Goldfish Orientation sensor 
Goldfish Temperature sensor 
Goldfish Proximity sensor 

Ни один из них не линейное ускорение, а одна является ориентация, устаревший датчик. Похоже, что мои датчики работают так, как если бы они были до уровня API 9, но я не знаю, почему это было бы. Есть ли какое-то поле в моем проекте, которое может заставить приложение действовать как более старый API? (Кроме минимального поддерживается поля API в файле AndroidManifest.xml, который уже установлен на 9)

+1

Хорошо, что ваш телефон не использует датчик TYPE_LINEAR_ACCELERATION –

ответ

1

поставить это в манифесте

<uses-permission android:name=”android.permission.SET_ORIENTATION” /> 

для доступа к вашему акселерометр

попробовать это :

 /* put this into your activity class */ 
    private SensorManager mSensorManager; 
    private float mAccel; // acceleration apart from gravity 
    private float mAccelCurrent; // current acceleration including gravity 
    private float mAccelLast; // last acceleration including gravity 

    private final SensorEventListener mSensorListener = new SensorEventListener() { 
public void onSensorChanged(SensorEvent se) { 
    float x = se.values[0]; 
    float y = se.values[1]; 
    float z = se.values[2]; 
    mAccelLast = mAccelCurrent; 
    mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
    float delta = mAccelCurrent - mAccelLast; 
    mAccel = mAccel * 0.9f + delta; // perform low-cut filter 
} 

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

    @Override 
    protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onPause() { 
    mSensorManager.unregisterListener(mSensorListener); 
    super.onPause(); 
    } 

И это:

/* do this in onCreate */ 
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
mAccel = 0.00f; 
mAccelCurrent = SensorManager.GRAVITY_EARTH; 
mAccelLast = SensorManager.GRAVITY_EARTH; 
+1

Это просто обход, чтобы использовать акселерометр, чтобы изолировать гравитацию? Я мог бы попробовать, но я беспокоюсь, что когда пользователь перемещает телефон, сила тяжести и сила от их руки будут мешать друг другу. Я пытаюсь измерить силу из их рук. Но я попробую этот метод. Невозможно ли распознать датчик слияния Sensor.TYPE_LINEAR_ACCELERATION? –

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