2012-01-31 68 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

我找到了我的問題的答案,並設法弄清楚接近傳感器的主要流程。

首先,有兩種方法處理接近傳感器: 1.鎖定PROXIMITY_SCREEN_OFF_WAKE_LOCK。從我讀的這個是某種被android使用的隱藏常量,它的值爲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

我猜你的程序是一個「在屏幕上」運行的活動?

我對這個主題不太瞭解,但是基於我在android上讀過的一些文本,我認爲當屏幕出現故障時,android會暫停/關閉應用程序。

要麼你不得不阻止這種暫停,要麼在後臺服務中運行你的應用程序。但我不知道服務是否可以用相同的方式讀取傳感器。

林不知道這個「答案」是否真的會幫助你,但你可能會知道要搜索什麼。

+0

我試着做一些鎖。首先,我嘗試了:PARTIAL_WAKE_LOCK,然後PROXIMITY_SCREEN_OFF_WAKE_LOCK和32值,但沒有工作:( – Andrei 2012-01-31 09:20:10

相關問題