0

再現する手順

  1. 通常のサンプリング周期で重力センサーのリスナーを登録します。独自のコード (以下の基本的な例) を使用するか、単にMy Sensorsをインストールして、メニューからセンサーの更新レートをNormalに設定してください。

    Sensor gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
    sensorManager.registerListener(callback, gravitySensor, SENSOR_DELAY_NORMAL);
    
  2. センサー出力を観察します。event.values[1]デバイスが直立している場合、Y 軸 ( ) は ~9.7 を報告するはずです。

  3. デバイスを 1 回か 2 回、強くすばやく振ってください。その後、再び垂直に保持します。
  4. これを行った後、センサー出力を見てください。
    • 最初の 2 秒間、Y 軸の値は 9.7 から -9.7 に移行します。
    • 次の 6 秒間、Y 軸の値は反転したままです (-9.7)。
    • 次の 2 秒間、Y 軸の値は 9.7 に戻ります。

ユーザーがデバイスを振ったり振ったりするたびに 10 秒間不正なデータが表示されるのは完全に直感に反するため、これは私にはバグのように見えます。

デバイスの詳細

  • Samsung Galaxy S5 (G900I) の使用
  • Android 5.0 の実行 (Android 6 へのアップグレード後にも発生)
  • 影響を受けるセンサー
    • 重力センサー (Samsung Electronics) (バージョン 3)
    • MPL 回転ベクトル (Invensense) (バージョン 1)
    • MPL Game Rotation Vector (Invensense) (バージョン 1)
    • 方向センサー (Samsung Electronics) (バージョン 1)

私の質問

  1. これは、このデバイスの正常な動作ですか? (Galaxy S5で発生しますか?)
  2. これは一般的な Android デバイスの正常な動作ですか? (上記のセンサー タイプを搭載した Android デバイスで発生しますか?)
  3. これを防ぐ方法はありますか?
4

1 に答える 1

1

部分的な回避策: 高速サンプリング レートを使用する

センサーのサンプリング レートを次のいずれかに設定すると、問題は発生しなくなりました。

  • SENSOR_DELAY_GAME
  • SENSOR_DELAY_FASTEST
  • 54999以下

残念ながら、センサーが別のアプリによって既にリッスンされている場合、他のアプリによって要求されたサンプリング レートが、私のアプリによって要求された値の代わりに使用されます。したがって、SENSOR_DELAY_NORMALたとえば、別のアプリが既にセンサーをリッスンしている場合、私のアプリはその速度でセンサーの更新のみを取得するため、アプリはバグを完全に回避できません。

于 2015-11-22T05:49:53.280 に答える