2012-04-01 39 views
9

Tôi đang phát triển một ứng dụng báo thức. Từ hoạt động chính tôi đặt báo thức bằng phát sóng. Sau đó trong onReceive trong phát sóng nhận tôi gọi hoạt động đó là cho phép người dùng tắt hoặc báo lại báo động ... Trong hoạt động đó, vào đầu của onCreate tôi sử dụng dòng này để bật màn hình và mở khóa thiết bị:Bật màn hình theo cách lập trình trong android

final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Công trình này hoàn hảo trên Samsung Galaxy S2 với Android 2.3.4 nhưng không hoạt động trên HTC với Android 2.3.5. Trên htc nó không có gì, và khi tôi nhấn nút khóa màn hình tự động mở ra mà không có tôi kéo vòng tròn. Giống như flag_dissmiss_keygard của nó đang hoạt động nhưng flag_turn_screen_on isnt. Có một cách khác hay giải pháp khác để làm điều này?

Trả lời

14

Tôi bắt đầu giống như bạn và cờ cửa sổ không thực sự hoạt động.

Cuối cùng tôi đã nhận nó để làm việc bằng cách sử dụng hai dịch vụ Android: KEYGUARD_SERVICEPOWER_SERVICE:

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP 
     | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

Đừng quên để mở khóa sau khi bạn đã hoàn tất với nó.

Bạn sẽ cần phải yêu cầu quyền DISABLE_KEYGUARDWAKE_LOCK

+0

Tôi đã thử nó trên Nexus One (2.3.6) và Nexus S (4.1.1) và nó hoạt động khá tốt. – nifo

+4

Nhà phát triển, tôi cầu xin bạn: xin đừng làm điều này !!! Chỉ muốn đưa ra cảnh báo rằng việc tắt trình bảo vệ phím sẽ thực hiện những gì nó nói: nó sẽ bỏ qua mọi mã PIN hoặc Mở khóa mẫu. Hãy thử một báo chí dài của nhà (bánh gừng) hoặc nút chuyển đổi ứng dụng (ICS) và bạn sẽ thấy những gì tôi có ý nghĩa. Tôi không gặp vấn đề gì khi sử dụng các thông số bố cục trên các điện thoại phổ biến nhất và số lượng điện thoại Gingerbread sẽ giảm hàng ngày. Vui lòng xem xét lại cờ cửa sổ! –

+2

Hey @PatrickHorn bạn có thể chỉ định ví dụ về thiết bị mà trong đó điều này bỏ qua màn hình khóa mã PIN hay không. Trong các bài kiểm tra của tôi, tôi có thể hiển thị một màn hình cho người dùng với thông điệp tôi muốn và người thứ hai cố gắng nhấn vào nhà hoặc chuyển đổi ứng dụng, anh ấy nhận được màn hình PIN. Vì vậy, nó có vẻ đủ an toàn với tôi. – marmor

1

Tôi cũng bị nhiều vấn đề cho ứng dụng của tôi. Trên thực tế tôi muốn khóa màn hình khi người dùng nhấn nút quay lại hai lần. và mở khóa khi người dùng nhấn nút home.

Để mở khóa mã của nhà sản xuất thiết bị là đúng. :) Tôi đã sử dụng mã này.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
       WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
               | PowerManager.ACQUIRE_CAUSES_WAKEUP 
               | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
       wakeLock.acquire(); 
+1

Trong thiết bị của tôi giải pháp này chỉ bật màn hình NHƯNG không mở khóa android. Tôi có cần thêm gì không? – Manza

+0

@Manza Sử dụng mã từ câu trả lời dưới đây do nhà sản xuất cung cấp. Điều đó cũng sẽ mở khóa thiết bị. –

2

Dưới đây là giải pháp

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.TYPE_SYSTEM_ALERT | 
        LayoutParams.TYPE_SYSTEM_OVERLAY, 
        LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
        LayoutParams.FLAG_KEEP_SCREEN_ON| 
        LayoutParams.FLAG_DISMISS_KEYGUARD| 
        LayoutParams.FLAG_TURN_SCREEN_ON, 
      PixelFormat.TRANSPARENT); 

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    km.isKeyguardLocked(); 

    windowManager.addView(mTopView, params); 
    getWindow().setBackgroundDrawable(); 
+0

Điều này có yêu cầu bất kỳ sự cho phép nào không? –

+0

Xin lỗi vì sự chậm trễ, tôi đã cho phép trong AndroidManifest.xml koteswarao

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