2012-11-09 108 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事件。它为我工作。