Android SensorListener 弃用

标签 android android-sensors

我正在尝试更改以下代码以使用指南针,但是我遇到了麻烦,我尝试使用 SensorEventListener,但我失败了。有没有我可以遵循的教程?任何帮助将不胜感激。

private static SensorListener orientationListener;
    private static boolean isTrackingOrientation = false;

    @Override
    public void onCreate(Bundle icicle) {

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

        orientationListener = new SensorListener() {
            public void onSensorChanged(int s, float v[]) {
                float northDirection = v[android.hardware.SensorManager.DATA_X];
                ((QiblaCompassView)findViewById(R.id.qibla_compass)).setDirections(northDirection, VARIABLE.qiblaDirection);

            }
            public void onAccuracyChanged(int s, int a) {
            }
        }; 
    }

    @Override
    public void onResume() {
        startTrackingOrientation();
        super.onResume();
    }
    @Override
    public void onPause() {
        stopTrackingOrientation();
        super.onPause();
    }

    private void startTrackingOrientation() {
        if(!isTrackingOrientation) isTrackingOrientation = ((SensorManager)getSystemService(SENSOR_SERVICE)).registerListener(orientationListener, android.hardware.SensorManager.SENSOR_ORIENTATION);
    }
    private void stopTrackingOrientation() {
        if(isTrackingOrientation) ((SensorManager)getSystemService(SENSOR_SERVICE)).unregisterListener(orientationListener);
        isTrackingOrientation = false;
    }

最佳答案

这是对传感器工作原理的一个很好的解释: http://developer.android.com/reference/android/hardware/SensorEvent.html

此代码成功运行:

package com.example.testvideo;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity implements SensorEventListener {

    SensorManager mSensorManager;
    Sensor accSensor;
    Sensor magnetSensor;

    float gravity[];
    float geoMagnetic[];
    float azimut;
    float pitch;
    float roll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        magnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        mSensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, magnetSensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this, accSensor);
        mSensorManager.unregisterListener(this, magnetSensor);
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            gravity = event.values.clone();
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            geoMagnetic = event.values.clone();

        if (gravity != null && geoMagnetic != null) {

            float R[] = new float[9];
            float I[] = new float[9];
            boolean success = SensorManager.getRotationMatrix(R, I, gravity, geoMagnetic);
            if (success) {
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                azimut = 57.29578F * orientation[0];
                pitch = 57.29578F * orientation[1];
                roll = 57.29578F * orientation[2];

                float dist = Math.abs((float) (1.4f * Math.tan(pitch * Math.PI / 180)));

                Log.d("log", "orientation values: " + azimut + " / " + pitch + " / " + roll + " dist = " + dist);
            }
        }
    }

}

关于Android SensorListener 弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737171/

相关文章:

android - 如何以编程方式在 Android 设备中设置模拟传感器(加速度计)

android - 没有这样的属性 : ABI for class: org. gradle.api.tasks.OutputFile

android - 无法在 Galaxy Tab 10 上查看陀螺仪

java - 如何在Android中显示绘制位图

java - Android Studio myfirstapp 中的错误 : Gradle errors

Android旋转向量和旋转矩阵

Android 在设备休眠时减慢前台服务

android - Intent Service 在一段时间后被杀死

android - 我正在创建一个 Android 应用程序。我正在尝试创建包含图像按钮的主菜单 GUI,但我的应用程序不断崩溃

java - 为什么没有导入facebook sdk