2012-11-09 37 views
5

tại đây tôi đang cố gắng xác định xem màn hình có bật hay không nhưng dường như không hoạt động khi nhấn nút khóa/mở khóa nguồn. Ứng dụng hoạt động không có lỗi nhưng mã trong if-else doesnt dường như không có hiệu lực. Đã chỉnh sửa bây giờ công việc mã (cảm ơn Olgun) nhưng phát lại trình phát đa phương tiện không dừng và mỗi lần bật/tắt màn hình objct mediaplayer mới được tạo (nhiều lần phát lại).Phát hiện bật/tắt màn hình

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 { 

    } 
} 

}

Trả lời

5

Intent.ACTION_SCREEN_OFF và ACTION_SCREEN_ON kiểm tra đăng ký chương trình phát sóng trên. here bạn có thể tìm thấy một ví dụ điển hình.

+0

mã trong liên kết hoạt động tốt nhưng ngay cả sau khi sử dụng các phương pháp dừng và phát, các phát lại mediaplayer không dừng lại – dreamer1989

2

Bạn có thể thử thêm nội dung này vào hoạt động của mình.

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

Tương tự như vậy bạn có thể thêm cho ACTION_SCREEN_ON cũng

6

Cách tiếp cận với các ACTION_SCREEN không làm việc cho tôi. Sau khi một số giải pháp khác nhau mã này cuối cùng đã giải quyết được vấn đề đối với tôi:

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

Cách tiếp cận này cũng đã giải quyết cho tôi, vì tôi chỉ cần xử lý trường hợp khi màn hình bật hoặc tắt cho onPause (). Đối với trường hợp bạn cần xử lý nếu màn hình bật hoặc tắt trước onResume(), bạn nên sử dụng một cách tiếp cận khác. – filipebarretto

+0

Điều gì sẽ xảy ra nếu màn hình bật với khóa. Tôi nghĩ rằng giải pháp trên không thể phát hiện ra nó – Jame

0

đăng ký của bạn BroadcastReceiver trong một backgroung Service cho Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF sự kiện. Nó làm việc cho tôi.

Các vấn đề liên quan