2017-04-06 2 views
1

Ich arbeite gerade an einer Anwendung, und ein Teil davon besteht darin, den Boden eines Gebäudes zu schätzen, in dem sich der Benutzer befindet. Ich versuche, den Barometer/Drucksensor auf Geräten zu verwenden Unterstütze es und versuche, daraus eine Schätzung zu machen. Verfügt der Benutzer über keinen Barometer-/Drucksensor, öffnet die App einen Dialog zur manuellen Eingabe, ansonsten wird die Höhe und Etagennummer geschätzt.Drucksensor erhält keine Werte

Gerade jetzt, ich versuche nur den Barometer/Drucksensor arbeiten. Ich bin mit dem Android-Emulator mit der Druckwerte aufweist, die eingestellt werden können, und die entsprechenden Abschnitte meines Codes wird wie folgt festgelegt:

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 ist eine Instanz einer benutzerdefinierten Klasse UserData, die die geschätzte Etagennummer des Benutzers speichert. Mein Manifest-Datei wird wie folgt festgelegt:

<?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> 

Gerade jetzt, der Wert von pressureBasedFloor bleibt 0 ganzen obwohl der Druckwert auf meinem Emulator wird auf 990. Es gibt keine Fehler.

Was mache ich falsch?

Antwort

5

Emulator wird Hardware-Sensor nicht besser werden, die so die folgende Zeile aus AndroidManifest.xml zu entfernen, die android sagt: name = "android.hardware.sensor.pressure" android: required = "true"

Und In MainActivity haben Sie vergessen, sich mit SensorManager zu registrieren. Sehen Sie sich meine unten genannten Code

public class MainActivity erweitert AppCompatActivity implementiert 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); 
} 

}

Verwandte Themen