2012-11-09 104 views
5

這裏我試圖確定屏幕是否打開,但按下電源鎖定/解鎖按鈕時似乎不工作。應用程序沒有錯誤,但if-else中的代碼似乎沒有效果。 編輯 現在的代碼工作(感謝Olgun),但媒體播放器回放犯規停止,每一次開/關篩選新的媒體播放器objct創建(多播放)。屏幕開/關檢測

SCBroadcaster.java

public class SCBroadcaster extends BroadcastReceiver { 
    PowerManager pm; 
    MediaPlayer mp; 
    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     // TODO Auto-generated method stub 
     mp = MediaPlayer.create(arg0, R.raw.gale); 
     if (arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
        mp.stop(); 
      mp.release(); 
      Toast.makeText(arg0, "oNONONO", Toast.LENGTH_LONG).show(); 

     } else if (arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      mp.start(); 
     } 

    } 

} 

MainActivity.java

public class MainActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_SCREEN_ON); 
    BroadcastReceiver bre = new SCBroadcaster(); 
    registerReceiver(bre, filter); 
} 

protected void onPause() { 
    super.onPause(); 
    if (SCBroadcaster.wasScreenOn) { 
     System.out.println("SCREEN TURNED OFF"); 
    } else { 

    } 
} 

protected void onResume() { 
    super.onResume(); 
    if (!SCBroadcaster.wasScreenOn) { 

    } else { 

    } 
} 

}

回答

5

Intent.ACTION_SCREEN_OFF和ACTION_SCREEN_ON檢查出上述廣播註冊。 here你可以找到一個很好的例子。

+0

鏈接中的代碼工作正常,但即使使用停止和釋放方法後,mediaplayer播放也不會停止 – dreamer1989

2

您可以嘗試在您的活動中添加此項。

IntentFilter filter = new IntentFilter(); 
filter.addAction(Intent.ACTION_SCREEN_OFF); 
BroadcastReceiver mReceiver = new ScreenReceiver(); 
registerReceiver(mReceiver, filter); 

同樣,你可以添加ACTION_SCREEN_ON

6

與ACTION_SCREEN的做法並沒有爲我工作。一些不同的解決方案後,該代碼終於解決了我的問題:

/** 
* Is the screen of the device on. 
* @param context the context 
* @return true when (at least one) screen is on 
*/ 
public boolean isScreenOn(Context context) { 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { 
     DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); 
     boolean screenOn = false; 
     for (Display display : dm.getDisplays()) { 
      if (display.getState() != Display.STATE_OFF) { 
       screenOn = true; 
      } 
     } 
     return screenOn; 
    } else { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     //noinspection deprecation 
     return pm.isScreenOn(); 
    } 
} 
+0

這種方法對我來說也解決了,因爲我只需要處理屏幕開啓或關閉onPause時的情況( )。對於需要在onResume()之前打開或關閉屏幕的情況,您應該使用不同的方法。 – filipebarretto

+0

如果屏幕鎖定,會發生什麼情況。我認爲上述解決方案無法檢測到它 – Jame

0

註冊您的backgroung ServiceBroadcastReceiverIntent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF事件。它爲我工作。