2012-11-09 25 views
5

Burada, ekranın açık olup olmadığını belirlemeye çalışıyorum ama güç açma/kilit açma düğmesine basıldığında çalışma görünmüyor. Uygulama hatasız çalışır, ancak if-else'deki kodun etkisi yoktur. Düzenlenmiş şimdi kod çalışması (teşekkürler Olgun) ancak mediaplayer oynatımı durmuyor ve her zaman açık/kapalı ekranda yeni mediaplayer objct (çoklu oynatma) oluşturuluyor.Ekran açık/kapalı algılama

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

    } 

} 

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 { } } 

MainActivity.java

}

cevap

5

Intent.ACTION_SCREEN_OFF ve ACTION_SCREEN_ON yukarıdaki yayınlar kayıt için göz atın. here iyi bir örnek bulabilirsiniz.

+0

bağlantıdaki kod gayet iyi çalışıyor, ancak durdurma ve bırakma yöntemlerini kullandıktan sonra bile mediaplayer oynatmaları durmuyor – dreamer1989

2

Bunu aktivitenize eklemeyi deneyebilirsiniz.

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

Benzer şekilde ACTION_SCREEN ile yaklaşım benim için işe yaramadı da ACTION_SCREEN_ON

6

için ekleyebilir.

/** 
* 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

Bu yaklaşım benim için de çözüldü, çünkü sadece ekranın onPause için açık veya kapalı olduğu durumda davayı ele almam gerekiyordu (). Ekranda onResume() işleminden önce açık veya kapalı olup olmadığına bakmanız gereken bir durum için farklı bir yaklaşım kullanmalısınız. – filipebarretto

+0

Kilitli ekran açık olduğunda ne olur? Yukarıdaki çözüm bunu tespit edemiyorum – Jame

0

senin bir backgroung Service içinde BroadcastReceiverIntent.ACTION_SCREEN_ON ve Intent.ACTION_SCREEN_OFF olaylarını Kayıt: Bazı farklı çözümler sonra bu kod nihayet benim için sorun çözüldü. Benim için çalıştı.