3

ハイ、

近接センサーに関連する問題があります。指を置くと画面を消したい、指を離すと画面をつけたい。オフの部分はうまくいきましたが、センサーから指を離すとonSensorChangedメソッドが実行されないようです。そのコードは次のとおりです。

public void onSensorChanged(SensorEvent event) {
        float distance = event.values[0];
        boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && distance < event.sensor.getMaximumRange());
        boolean isValidCallState = false;

        if (callsInfo != null) {
            for (SipCallSession callInfo : callsInfo) {
                int state = callInfo.getCallState();
                isValidCallState |= ((state == SipCallSession.CallState.CONFIRMED)
                        || (state == SipCallSession.CallState.CONNECTING)
                        || (state == SipCallSession.CallState.CALLING) || (state == SipCallSession.CallState.EARLY && !callInfo
                        .isIncoming()));
            }
        }
        if (isValidCallState && active) {
            Log.e("", "turn off");
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF;
            lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF;

            getWindow().setAttributes(lp);
            lockOverlay.show();
        } else {
            Log.e("", "turn on");
            WindowManager.LayoutParams lp = getWindow().getAttributes();

            lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
            lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
            getWindow().setAttributes(lp);
        }
        Log.e("", "turn ???"); // --> does not print this when releasing the sensor
    }

何か案は?ありがとう。

4

2 に答える 2

2

私は自分の質問に対する答えを見つけ、近接センサーのメイン フローを理解することができました。

まず、近接センサーを処理するには 2 つの方法があります。 1. PROXIMITY_SCREEN_OFF_WAKE_LOCK をロックします。私が読んだことから、これは何らかの形でアンドロイドによって使用される隠し定数であり、値は 32 です(少なくとも現時点では、将来のバージョンで変更される場合と変更されない場合があります)。このロックが成功すると、近接センサーが通話中と同じように動作します。

try {
                    Method method = powerManager.getClass().getDeclaredMethod(
                            "getSupportedWakeLockFlags");
                    int supportedFlags = (Integer) method.invoke(powerManager);
                    Field f = PowerManager.class.getDeclaredField("PROXIMITY_SCREEN_OFF_WAKE_LOCK");
                    int proximityScreenOffWakeLock = (Integer) f.get(null);
                    if ((supportedFlags & proximityScreenOffWakeLock) != 0x0) {
                        proximityWakeLock = powerManager.newWakeLock(proximityScreenOffWakeLock,
                                "com.voalte.CallProximity");
                        proximityWakeLock.setReferenceCounted(false);
                    }

                } catch (Exception e) {
                }
  1. Sensor のリスナーを登録します。この場合、近接センサー アクションは onSensorChanged メソッドで処理する必要があります (screenBrigthness を設定できます)。

ノート:

  1. 画面がオフになると、onPause が呼び出されます。
  2. 最初の方法を使用する場合、PROXIMITY_SCREEN_OFF_WAKE_LOCK を設定できない場合に備えて、バックアップも考慮する必要があります。したがって、onStart と onResume でロックをインスタンス化して、null と照合することをお勧めします。null でない場合はロックを取得し、それ以外の場合はセンサーのリスナーを登録します。
  3. onSensorChanged で、センサーを覆うときに screenBrightness を BRIGHTNESS_OVERRIDE_OFF に設定し、解放するときに screenBrightness を BRIGHTNESS_OVERRIDE_FULL および/または BRIGHTNESS_OVERRIDE_NONE に設定しましたが、画面がオンになりませんでした。したがって、回避策は、デフォルトで非表示に設定されている黒いレイアウトを表示して全画面を占有するようにすることでした。

これが誰かの助けになることを願っています。

于 2012-02-02T12:14:00.237 に答える
0

あなたのプログラムは「画面上」で実行されるアクティビティだと思いますか?

この件についてはよくわかりませんが、Android で読んだテキストに基づいて、Android は画面がダウンしたときにアプリを一時停止/終了すると思います。

この一時停止を防ぐか、アプリをバックグラウンド サービスで実行する必要があります。しかし、サービスが同じ方法でセンサーを読み取ることができるかどうかはわかりません。

この「答え」が本当に役立つかどうかはわかりませんが、何を検索すればよいかがわかります。

于 2012-01-31T09:15:42.050 に答える