1

過去にいくつかの Android Dev を行ったことがありますが、しばらく時間がかかりました。方向センサーと近接センサーを使用するアプリを構築したいと考えています。それで...

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

リスナーをセットアップします - すべてのセンサーをリッスンします - 2 つだけをリッスンする必要があるのだろうか? (これはバッテリーを節約しますか?)

Sensor mySensor = event.sensor;
    // if (mySensor.getType() != Sensor.TYPE_ORIENTATION) return;
    if (mySensor.getType() == Sensor.TYPE_ORIENTATION)
    {
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        tv.setText("Rotation around X, Azimuth = " + x);
        tv1.setText("Rotation around Y, Pitch = " + y);
        tv2.setText("Rotation around Z, Roll = " + z);
    }
    if (mySensor.getType() == SensorManager.SENSOR_PROXIMITY)
    {

        float p = event.values[0];
        tv3.setText("Proximity = " + p);

    }

次に onSensorChanged で - 上記を参照

私のLG Optimus Oneでは、方向センサーのTextViewsに値を表示することができます(この電話には近接センサーがありません)

しかし、Nexus One で同じコードを実行すると、きれいな空白の画面が表示されます!?

質問が長くなってすみません!しかし、どんな助けでも良いでしょう.さらに情報が必要な場合は、質問してください.LG電話は2.2です.Nexus Oneは2.2.2です.

デビッド

4

1 に答える 1

1

すべてのセンサーに同じリスナーを使用できます。しかし、本当に複数またはすべてのセンサーをリッスンしたい場合は、次の行を書き直す必要があります。

mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

getDefaultSensor(int type)ソースコードに見られるように、の実際の実装は 1 つのセンサーのみを返すためです。

public Sensor getDefaultSensor(int type) {
    // TODO: need to be smarter, for now, just return the 1st sensor
    List<Sensor> l = getSensorList(type);
    return l.isEmpty() ? null : l.get(0);
}

public List<Sensor> getSensorList(int type) {
    // cache the returned lists the first time
    List<Sensor> list;
    final ArrayList<Sensor> fullList = sFullSensorsList;
    synchronized(fullList) {
        list = sSensorListByType.get(type);
        if (list == null) {
           if (type == Sensor.TYPE_ALL) {
               list = fullList;
           } else {
                list = new ArrayList<Sensor>();
                for (Sensor i : fullList) {
                     if (i.getType() == type)
                        list.add(i);
                }
           }
           list = Collections.unmodifiableList(list);
           sSensorListByType.append(type, list);
       }

    return list;
}

したがってSensor.TYPE_ALL、メソッドの場合、使用可能なすべてのセンサーgetSensorList(int type)の (順不同) リストが提供され、getDefaultSensor(int type)その最初のセンサーのみが返されます。

すべてのセンサーを含むリストは順不同であるため、getDefaultSensor(Sensor.TYPE_ALL) はランダムなセンサーを提供します。試してみたところ、最初に加速度計を取得し、次に光センサーを取得しました。リスナーで方向と近接の変更のみを処理するため、getDefaultSensor(Sensor.TYPE_ALL) が Nexus で別のセンサーを提供したと思われます。

含まれているすべてのセンサーをそれぞれ登録するには、使用可能なすべてのセンサーのリストを受け取り、リストをmSensorManager.getSensorList(Sensor.TYPE_ALL)反復処理する必要があります。

バッテリーの節約に関するご質問について - センサーが永続的に動作しているかどうかはわかりません。そのような場合でも、不要な処理を減らすことで、常にバッテリーの電力を節約できます。特定のセンサーが提供する情報が必要ない場合は、センサーからのメッセージを受信するように登録しないでください。これにより、アプリケーションに送信されるメッセージが減少します。

于 2011-03-12T20:59:35.947 に答える