2012-01-31 16 views
3

Hy、近接センサーが画面の電源がオフになっていませんか?

近接センサに関連する問題があります。指を置くと、画面が消えてしまいます。指をかけると、画面がオンになります。 私は正常に電源オフしましたが、センサーから指を離すと、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 
    } 

アイデア?ありがとう。

答えて

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. センサーのリスナーを登録します。この場合、近接センサーアクションはonSensorChangedメソッドで処理する必要があります(screenBrigthnessを設定できます)。

注:画面をオフにすると

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

これは誰かの助けになると思っています。

0

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

私はこのテーマについてよく分かりませんが、いくつかのテキストに基づいて私はアンドロイドで読んだことがあります。アンドロイドは画面がダウンしたときにアンドロイドが一時停止/終了すると思います。

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

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

+0

ロックをいくつか作ってみました。最初に私は試しました:PARTIAL_WAKE_LOCK、次にPROXIMITY_SCREEN_OFF_WAKE_LOCKと32の値は、動作しませんでした:( – Andrei

関連する問題