Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 压力传感器没有得到任何值_Android_Android Sensors - Fatal编程技术网

Android 压力传感器没有得到任何值

Android 压力传感器没有得到任何值,android,android-sensors,Android,Android Sensors,我现在正在开发一个应用程序,其中一部分包括估计用户所在建筑物的楼层。我正试图在支持它的设备上使用气压计/压力传感器,并试图据此做出估计。如果用户没有气压计/压力传感器,应用程序将打开一个对话框供手动输入,否则将估计高度和楼层数 现在,我只是想让气压计/压力传感器工作。我正在使用Android Emulator,它有可以设置的压力值,我的代码的相关部分设置如下: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:andr

我现在正在开发一个应用程序,其中一部分包括估计用户所在建筑物的楼层。我正试图在支持它的设备上使用气压计/压力传感器,并试图据此做出估计。如果用户没有气压计/压力传感器,应用程序将打开一个对话框供手动输入,否则将估计高度和楼层数

现在,我只是想让气压计/压力传感器工作。我正在使用Android Emulator,它有可以设置的压力值,我的代码的相关部分设置如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.flamedra.findmycar">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-feature android:name="android.hardware.sensor.pressure" android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_profile"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:configChanges="orientation|keyboardHidden|screenSize">
        <activity
            android:name=".activities.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
                    android:name=".activities.CompassFragmentActivity"
                    android:theme="@style/AppTheme.NoActionBar"
                    android:configChanges="orientation|keyboardHidden|screenSize"
                   />

        <!--Maps Android Key-->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_api_key" />
        <!--Maps Android Key-->
    </application>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

</manifest>
MainActivity.java

public class MainActivity extends AppCompatActivity implements SensorEventListener, .... {

    //sensor variables
    public float mPressureValue = 0.0f;
    public float mHeight = 0.0f;
    public Integer pressureBasedFloor = 0;

    //check if device has pressure sensor, setup in OnCreate
    boolean hasBarometer = false;

    //pressure sensor to get pressure, height and floor
    @Override
    public void onSensorChanged(SensorEvent event) {
        //if you use this listener as listener of only one sensor (ex, Pressure), then you don't need to check sensor type.
        //if a pressure sensor exists, use it to calculate height
        if (hasBarometer) {
            if( Sensor.TYPE_PRESSURE == event.sensor.getType() ) {
                mPressureValue = event.values[0];
                System.out.println("Pressure" + mPressureValue);
                mHeight = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, mPressureValue);
                System.out.println("Height" + mHeight);
                pressureBasedFloor = Math.round(mHeight);
            }
        }
    }

     //pressure sensor
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }


     @Override
    protected void onCreate(Bundle savedInstanceState) {

        //check if barometer sensor exists
        hasBarometer = getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_BAROMETER);

        final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    //if user has no barometer sensor, request dialog
                    if (!hasBarometer) {
                        showRequestFloorDialog(view); //no barometer found, manual entry
                    } else {
                        currUserData.setUserFloorNumber(pressureBasedFloor); //barometer found, add calculated floor number to field
                    }
                }
            }
        });
    }
}
currUserData是存储用户估计楼层数的自定义类UserData的实例。我的清单文件设置如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.flamedra.findmycar">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-feature android:name="android.hardware.sensor.pressure" android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_profile"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:configChanges="orientation|keyboardHidden|screenSize">
        <activity
            android:name=".activities.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
                    android:name=".activities.CompassFragmentActivity"
                    android:theme="@style/AppTheme.NoActionBar"
                    android:configChanges="orientation|keyboardHidden|screenSize"
                   />

        <!--Maps Android Key-->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_api_key" />
        <!--Maps Android Key-->
    </application>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

</manifest>

现在,pressureBasedFloor的值始终保持为0,即使emulator上的压力值设置为990。没有错误


我做错了什么?

Emulator没有硬件传感器,因此您需要从AndroidManifest.xml中删除以下行:

android:name="android.hardware.sensor.pressure"
android:required="true"
在MainActivity中,您忘记使用SensorManager注册。请看下面的代码:

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    float pressure;

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

        sensorManager = (SensorManager) getSystemService(Service.SENSOR_SERVICE);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
            pressure = event.values[0];
            Log.i("Baro", " Pressure " + pressure);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        Log.i("Baro", " Accuracy " + accuracy);
    }
}

Emulator没有硬件传感器,因此需要从AndroidManifest.xml中删除以下行:

android:name="android.hardware.sensor.pressure"
android:required="true"
在MainActivity中,您忘记使用SensorManager注册。请看下面的代码:

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    float pressure;

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

        sensorManager = (SensorManager) getSystemService(Service.SENSOR_SERVICE);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
            pressure = event.values[0];
            Log.i("Baro", " Pressure " + pressure);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        Log.i("Baro", " Accuracy " + accuracy);
    }
}