2016-01-05 24 views
17

Một người dùng ứng dụng của tôi báo cáo rằng khi ứng dụng của tôi đang nghe xác thực vân tay (tôi gọi là fingerprintManager.authenticate) và màn hình bị tắt (bằng cách nhấn nút công tắc nguồn của thiết bị), nó không có thể sử dụng dấu vân tay để mở khóa thiết bị.Dừng nghe dấu vân tay khi tắt màn hình

Tôi cũng có thể thấy phương thức gọi lại onAuthenticationError được gọi khi màn hình tắt, điều này không xảy ra khi tôi rời khỏi hoạt động của mình, vì tôi gọi CancellationSignal.cancel() theo phương pháp của mình. Tôi đã kiểm tra rằng đang được gọi.

Các hành vi tương tự có thể được quan sát thấy trong các mẫu vân tay Dialog (https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog, chuyển từ https://github.com/googlesamples/android-FingerprintDialog)

tôi có thể làm gì để giải quyết hành vi này?

EDIT: Tôi cũng đã cố gắng đăng ký bộ thu phát sóng cho android.intent.action.SCREEN_OFF được thông báo sau onPause, vì vậy không có gì ngạc nhiên khi gọi cancel() trong bộ thu đó không thay đổi bất cứ điều gì.

+0

Có onAuthenticationError xảy ra trước hoặc sau phương thức onPause của bạn không? – Wossname

+1

Xin chào Philipp, bạn đã tìm ra vấn đề chưa? nếu vậy bạn có thể vui lòng chia sẻ giải pháp, cảm ơn! – Xcihnegn

Trả lời

2

Tôi đã gặp phải hành vi tương tự với Samsung vân tay SDK (không thể xác thực khi màn hình bị khóa hoặc tắt, nó không phải là một lỗi, đó là do thiết kế). Sau khi xem xét kịch bản này - chúng tôi đã kết luận rằng cách tiếp cận tốt nhất là tạo thông báo cho người dùng có chứa PendingIntent sẽ kích hoạt ứng dụng của bạn và bắt đầu quá trình xác thực in ngón tay.

Thông báo có thể làm cho điện thoại rung/bíp để người dùng được cảnh báo.

Hy vọng điều này sẽ hữu ích.

+0

Tôi không thấy điều này sẽ giúp ích gì trong trường hợp của tôi. Tôi đang nói về một tình huống mà tôi đã bắt đầu xác thực, nhưng người dùng tắt màn hình. – Philipp

+0

Tôi hiểu lầm những gì bạn đã viết. chúc may mắn giải quyết điều này. – FunkSoulBrother

2

Trong phương thức gọi lại trênError() cũng gọi 'stopListeningc'. Sau đó, khi màn hình tắt, trình nghe vân tay từ ứng dụng của bạn sẽ ngừng hoạt động, sau đó thiết bị của bạn sẽ nghe dấu vân tay.

Hope trợ giúp này!

4

Vấn đề của tôi tương tự như của bạn: nếu ai đó gửi ứng dụng của tôi về nền bằng cách nhấn nút Home, nó vẫn giữ quyền kiểm soát Cảm biến vân tay, vì vậy không ai khác có thể sử dụng nó. Kêu gọi hủy bỏ từ hoạt động onPause() không được làm việc:

@Override 
    protected void onPause() { 
      super.onPause(); 
      /** 
      * We are cancelling the Fingerprint Authentication 
      * when application is going to background 
      */ 
      if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){ 
       log.info("canceling AndroidFingerprintHelper dialog"); 
       fingerprintHelper.cancelIdentify(); 
      } 
    } 

Bạn cần phải gọi phương thức cancel() của CancellationSignal của bạn trong phương pháp của hoạt động của bạn onPause() nhưng trướcsuper.onPause(). Nếu không, bạn sẽ nhận được cảnh báo

Từ chối your.package.name.; không trong foreground

cancelAuthentication(): từ chối tên gói của bạn

Tôi đã tìm kiếm mã nguồn của FingerPrint Dịch vụ Android và tôi đã tìm thấy dòng này:

public void cancelAuthentication(final IBinder token, String opPackageName) { 
     if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) { 
      return; 
     } 
    //we don't get here 
    ... 
    ... 
} 

nơi canUseFingerprint là thực sự kiểm tra xem chúng tôi có tiền cảnh hay không (một trong những điều đó):

private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly) { 

     if (foregroundOnly && !isForegroundActivity(uid, pid)) { 
      Slog.v(TAG, "Rejecting " + opPackageName + " ; not in foreground"); 
      return false; 
     } 
     //we don't get here 
} 

Điều này wa y, chúng tôi không bao giờ có thể gọi cancelAuth từ nền. Và Android cho rằng chúng ta đang ở chế độ nền sau khi gọi super.onPause();. Sau nhiều giờ nghiên cứu các giải pháp duy nhất mà tôi đã tìm thấy là để trao đổi các hủy hành động và super.onPause():

@Override 
    protected void onPause() { 
     /** 
     * We are cancelling the Fingerprint Authentication 
     * when application is going to background 
     */ 
     if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){ 
      log.info("canceling AndroidFingerprintHelper dialog"); 
      fingerprintHelper.cancelIdentify(); 
     } 
     super.onPause(); 
    } 

Làm việc đối với tôi trên Android M và N. Hope this helps.

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