2017-04-06 6 views
1

저는 현재 응용 프로그램에서 작업 중입니다. 그 중 일부는 사용자가있는 건물의 바닥을 평가하는 것으로 구성되어 있습니다. 저는 기압계/압력 센서를 그것을지지하고 그것에 근거한 추정을하려는 것입니다. 사용자가 기압계/압력 센서를 가지고 있지 않다면, 앱은 수동 입력을위한 대화창을 열어줍니다. 그렇지 않으면 높이와 층 번호가 추정됩니다.압력 센서에 아무런 값이 없습니다.

지금 당장은 바로미터/압력 센서 작동을 시도하고 있습니다. 내가 설정할 수있는 압력 값이 안드로이드 에뮬레이터를 사용하고, 다음과 같이 내 코드의 관련 섹션 설정 :

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의 값은 내 에뮬레이터의 압력 값은 오류가없는 990로 설정된 경우에도 전체에 0을 유지 : 다음과 같이 내 매니페스트 파일이 설정되어 있습니다.

내가 뭘 잘못하고 있니? 이름 = "android.hardware.sensor.pressure" 안드로이드 : : 필요 = "true"를

그리고

답변

5

에뮬레이터는 안드로이드 말했다의 AndroidManifest.xml에서 다음 줄을 제거하기 위해 하드웨어 센서 그래서 더 나은 필요하지 않습니다 MainActivity에서 SensorManager를 사용하여 등록하는 것을 잊었습니다. 내 아래에 언급 된 코드를보고

공용 클래스 MainActivity는 AppCompatActivity가 {

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); 
} 

}

SensorEventListener를 구현 확장