【问题标题】:Screen on/off detection屏幕开/关检测
【发布时间】:2012-11-09 11:50:30
【问题描述】:

我正在尝试确定屏幕是否打开,但按下电源锁定/解锁按钮时似乎无法正常工作。应用程序正常工作,但 if-else 中的代码似乎没有效果。 已编辑 现在代码工作(感谢Olgun),但媒体播放器播放不会停止,并且每次在屏幕上/关闭屏幕时都会创建新的媒体播放器对象(多次播放)。

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 {

    }
}

}

【问题讨论】:

    标签: android


    【解决方案1】:

    使用 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();
        }
    }
    

    【讨论】:

    • 这种方法也为我解决了,因为我只需要处理 onPause() 开启或关闭屏幕的情况。对于需要在 onResume() 之前处理屏幕是打开还是关闭的情况,您应该使用不同的方法。
    • 如果屏幕处于锁定状态会发生什么。我认为上述解决方案无法检测到它
    • 这行得通,但速度很慢。根据分析器,100 毫秒。最好不要在主电极上这样做。
    【解决方案2】:

    Intent.ACTION_SCREEN_OFF 和 ACTION_SCREEN_ON 检查上述广播注册。 here你可以找到一个很好的例子。

    【讨论】:

    • 链接中的代码工作正常,但即使在使用停止和释放方法后,媒体播放器播放也不会停止
    • @PrimožKralj 为什么不呢?
    【解决方案3】:

    您可以尝试将其添加到您的活动中。

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

    同样你也可以为ACTION_SCREEN_ON添加

    【讨论】:

      【解决方案4】:

      在背景Service 中为Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF 事件注册您的BroadcastReceiver。它对我有用。

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 2012-12-20
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多