6

使用Location.getBearing();すると、ベアリングがランダムに変化するようです。

別名、デバイスをゆっくりと回転させることができますが、それは気付かず、ランダムな方位を選択するだけです。

デバイスを回転させると、タブレットのマップ アプリの [現在地] アイコンがゆっくりと回転するので、デバイスが動作していることがわかります。

ベアリングを取得する別の適切な方法はありますか? GPSを使用しています。自分がどちらの方向を向いているかを判断するためのより良い方法があるかもしれません。

4

3 に答える 3

3

Location.getBearing()、GPS 衛星が計算した方位を返します。これは、デバイスの進行方向をリアルタイムで表したものではありません。Google マップ アプリは、デバイスに組み込まれている G センサーを使用して、あなたが向いている方向を取得します。

于 2012-07-04T14:18:35.663 に答える
3

加速度計センサーと磁場 (G-) センサーから方位を取得してみてください。

ここにチュートリアルがあります: http://android-coding.blogspot.co.at/2012/03/create-our-android-compass.html

于 2012-07-04T14:19:47.553 に答える
0

リンクを使用したheromの回答から:http://android-coding.blogspot.co.at/2012/03/create-our-android-compass.html

クラスを拡張してセンサーを実装しました。extends Activity implements SensorEventListener

提案どおりに実装しましたが、画面の向きを考慮して修正しました。

これが私が行ったコードです:

@Override
public void onSensorChanged(SensorEvent event) {
    switch(event.sensor.getType()){
    case Sensor.TYPE_ACCELEROMETER:
        for(int i =0; i < 3; i++){
            valuesAccelerometer[i] = event.values[i];
        }
        break;
    case Sensor.TYPE_MAGNETIC_FIELD:
        for(int i =0; i < 3; i++){
            valuesMagneticField[i] = event.values[i];
        }
        break;
    }

    boolean success = SensorManager.getRotationMatrix(
            matrixR,
            matrixI,
            valuesAccelerometer,
            valuesMagneticField);

    if(success){
        SensorManager.getOrientation(matrixR, matrixValues);

        double azimuth = Math.toDegrees(matrixValues[0]);
        //double pitch = Math.toDegrees(matrixValues[1]);
        //double roll = Math.toDegrees(matrixValues[2]);

        WindowManager mWindowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);
        Display mDisplay = mWindowManager.getDefaultDisplay();

        Float degToAdd = 0f;

        if(mDisplay.getRotation() == Surface.ROTATION_0)
            degToAdd = 0.0f;
        if(mDisplay.getRotation() == Surface.ROTATION_90)
            degToAdd = 90.0f;
        if(mDisplay.getRotation() == Surface.ROTATION_180)
            degToAdd = 180.0f;
        if(mDisplay.getRotation() == Surface.ROTATION_270)
            degToAdd = 270.0f;

        mapView.setFacingDirection((float) (azimuth + degToAdd)); //DEGREES NOT RADIANS
    }
}
于 2015-11-18T15:54:24.983 に答える