Android 屏幕开/关检测
在这里,我试图确定屏幕是否打开,但按下电源锁定/解锁按钮时,屏幕似乎不工作。应用程序运行时没有错误,但if-else中的代码似乎没有效果。 已编辑 现在代码可以工作了(感谢Olgun),但是mediaplayer播放不会停止,每次屏幕上/屏幕下都会创建新的mediaplayer objct(多个播放) SCBroadcaster.javaAndroid 屏幕开/关检测,android,Android,在这里,我试图确定屏幕是否打开,但按下电源锁定/解锁按钮时,屏幕似乎不工作。应用程序运行时没有错误,但if-else中的代码似乎没有效果。 已编辑 现在代码可以工作了(感谢Olgun),但是mediaplayer播放不会停止,每次屏幕上/屏幕下都会创建新的mediaplayer objct(多个播放) SCBroadcaster.java public class SCBroadcaster extends BroadcastReceiver { PowerManager pm;
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 {
}
}
}Intent.ACTION\u SCREEN\u OFF和ACTION\u SCREEN\u ON检查上述广播注册。您可以找到一个很好的示例。您可以尝试将此添加到活动中
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
类似地,您可以在上为
操作屏幕添加操作屏幕的方法对我不起作用。经过一些不同的解决方案,这段代码最终为我解决了问题:
/**
* 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();
}
}
在背景服务中注册您的BroadcastReceiver
,查看Intent.ACTION\u SCREEN\u ON
和Intent.ACTION\u SCREEN\u OFF
事件。这对我来说很有效。链接中的代码工作正常,但即使使用了停止和释放方法,mediaplayer播放也不会stops@PrimožKralj为什么不呢?这种方法也解决了我的问题,因为我只需要在屏幕打开或关闭onPause()时处理这个问题。对于需要在onResume()之前处理屏幕是打开还是关闭的情况,您应该使用不同的方法。如果屏幕以锁定方式打开,会发生什么情况。我认为上面的解决方案无法检测到它,但它非常慢。根据分析器,100毫秒。最好不要在主控台上做。