2010-08-10 35 views
49

Có cách nào để phát hiện khi người dùng mở khóa điện thoại không? Tôi biết về ACTION_SCREEN_ONACTION_SCREEN_OFF, nhưng chúng dường như được kích hoạt khi màn hình bật/tắt khi nhấn nút nguồn, nhưng không thực sự khi điện thoại được mở khóa khi nhấn nút Menu ...Android - phát hiện sự kiện mở khóa điện thoại, không hiển thị trên

Tôi đang cố gắng phát hiện mở khóa/khóa trong khi hoạt động đang chạy và tôi muốn tiếp tục hoạt động sau khi mở khóa.

Trả lời

1

đã không kiểm tra nó, nhưng hãy thử như sau:

  • Chờ ACTION_SCREEN_ON.
  • (Sau khi màn hình bật,) Đợi ACTION_MAIN với danh mục CATEGORY_HOME (Màn hình chính khởi chạy) - Đây có thể là những gì được gửi sau khi điện thoại được mở khóa.

Bước đầu tiên là cần thiết để lọc ra các lần nhấn phím HOME thông thường.

+0

Nhưng tính năng này có hoạt động trên tất cả các điện thoại không? Ví dụ, trên myTouch nhấn nút Menu mở khóa điện thoại, một số điện thoại khác yêu cầu bạn phải trượt qua điện thoại. Vì vậy, có cái gì đó có thể bắt tất cả? – Chris

+0

Tôi tin như vậy - ACTION_MAIN với danh mục CATEGORY_HOME chắc chắn được gọi để chạy màn hình chính (tức là trình khởi chạy). Có rất nhiều điện thoại Android, tuy nhiên, vì vậy tôi không thể chắc chắn 100%.Tốt hơn cho nó một thử và xem nếu nó làm việc cho bạn. – adamk

+0

Tôi đoán tôi quên đề cập đến việc tôi đang chạy một hoạt động và trong khi đang chạy, tôi muốn khóa/mở khóa màn hình và tiếp tục hoạt động khi đã mở khóa. Việc chờ ACTION_MAIN và CATEGORY_HOME chỉ đóng băng hoạt động của tôi khi mở khóa. – Chris

61

Dưới đây là những điều cần làm:

Giả sử bạn muốn để phát hiện các sự kiện mở khóa và làm điều gì đó trong hoạt động của bạn khi điện thoại được mở khóa. Có bộ thu phát sóng cho ACTION_SCREEN_ON, ACTION_SCREEN_OFF và ACTION_USER_PRESENT.

onResume hoạt động sẽ được gọi khi ACTION_SCREEN_ON được kích hoạt. Tạo trình xử lý và đợi ACTION_USER_PRESENT. Khi nó được kích hoạt, hãy thực hiện những gì bạn muốn cho hoạt động của mình.

tín dụng đi vào câu trả lời của CommonsWare đây: Android -- What happens when device is unlocked?

+1

là có bất cứ điều gì mà tôi có thể nhận được gọi lại tại c/C++ tức là tại lớp bản địa. – CoDe

17

Sau khi không có thứ tự với điều này trong một thời gian, tôi đã phát hiện ra rằng cách tốt nhất để làm điều này là để đăng ký một BroadcastReceiver vào "android.intent.action.USER_PRESENT " hoạt động.

"Hành động phát sóng: Đã gửi khi người dùng có mặt sau khi thiết bị tỉnh dậy (ví dụ: khi bảo vệ phím tắt)."

Để phân biệt giữa các trường hợp người dùng đã bật màn hình của mình khi nó không bị khóa khi thực sự mở khóa, hãy sử dụng KeyguardManager để kiểm tra cài đặt bảo mật.

Mã dụ:

Thêm phần này vào hoạt động của bạn:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT")); 

Sau đó sử dụng lớp này:

public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE); 
     if (keyguardManager.isKeyguardSecure()) { 

      //phone was unlocked, do stuff here    

     } 
    } 
} 
+1

Bạn không muốn kiểm tra 'if (! KeyguardManager.isKeyguardLocked())' và '! IsDeviceSecure()' trên SDK 23+ Thiết bị? – for3st

+0

Đây là một chút sai lầm theo https://stackoverflow.com/a/30053876/461982 cho biết bạn muốn kiểm tra 'isDeviceLocked' để xác minh trạng thái thực tế, không chỉ khi một khóa bảo mật đã được bật trong Cài đặt. Bạn cũng có thể kiểm tra 'inKeyguardRestrictedInputMode' của KeyguardManager cho API <22 – LoungeKatt

5
public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)){ 
      Log.d(TAG, "Phone unlocked"); 
     }else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
      Log.d(TAG, "Phone locked"); 
     } 
    } 
} 

đăng ký nhận bởi tuyên bố này

receiver = new PhoneUnlockedReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_USER_PRESENT); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(receiver, filter); 
+0

Mã của bạn không hoạt động –

+0

Tôi đang sử dụng mã này và hoạt động tốt, vui lòng kiểm tra xem bạn đã áp dụng bất kỳ khóa mẫu/ghim nào hay sử dụng bất kỳ ứng dụng khóa màn hình của bên thứ ba nào. Nó có thể gây trở ngại. –

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