2017-03-03 1 views
1

Ich versuche Fingerabdruck-API mit einer Demo zu bauen, wie folgt aus:Fingerabdrucks nicht in Service arbeiten

 if (fingerprintManager.hasEnrolledFingerprints()) { 

      // start fingerprint auth here. 
      try { 
       //     CryptoObjectHelper cryptoObjectHelper = new CryptoObjectHelper(); 


       if (cancellationSignal == null) { 
        cancellationSignal = new CancellationSignal(); 

       } 

       if (cancellationSignal.isCanceled()) { 
        cancellationSignal = new CancellationSignal(); 
       } 


       myAuthCallback = new MyAuthCallback(context, handler); 



       fingerprintManager.authenticate(null, cancellationSignal, 0, myAuthCallback, null); 

      } catch (Exception e) { 

      } 

     } 

und es funktioniert in einer Aktivität Komponente, kann ich meine Fingerabdrücke unterscheiden. Aber wenn ich versuche, diese Codes mit einem Service oder einer BroadcastReciver-Komponente zu verwenden, kann ich keinen Rückruf erhalten, ist es richtig, dass die FingerPrint-API nur in der Aktivitätskomponente verwendet werden kann?

+0

Sie müssen dem Benutzer eine Benutzeroberfläche zeigen, um ihm mitzuteilen, dass er seinen Finger setzen soll, und Sie können die Aktivität von Ihrem Dienst aus starten – LaurentY

+0

Ich benutze eine vom Service erstellte schwebende Ansicht, um dem Benutzer mitzuteilen, dass er seinen Finger steckt. Die Frage ist >> fingerprintManager .authenticate (null, cancellationSignal, 0, myAuthCallback, null); >> Ich bekomme nichts über das Ergebnis, wenn ich diese Codes im Dienst verwende, aber es funktioniert in Activity, ich möchte es herausfinden. –

Antwort

0

Ich habe die Antwort aus dem Quellcode herausgefunden,

/frameworks/base/services/core/java/com/android/server/fingerprint/Fingerprint/FingerprintService.java

 @Override // Binder call 
     public void authenticate(final IBinder token, final long opId, final int groupId, 
       final IFingerprintServiceReceiver receiver, final int flags, 
       final String opPackageName) { 
      if (!canUseFingerprint(opPackageName, true /* foregroundOnly */)) { 
       if (DEBUG) Slog.v(TAG, "authenticate(): reject " + opPackageName); 
       return; 
     } 

       …… 

    private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly) { 
     checkPermission(USE_FINGERPRINT); 
     final int uid = Binder.getCallingUid(); 
     final int pid = Binder.getCallingPid(); 
     if (opPackageName.equals(mKeyguardPackage)) { 
      return true; // Keyguard is always allowed 
     } 
     if (!isCurrentUserOrProfile(UserHandle.getCallingUserId())) { 
      Slog.w(TAG,"Rejecting " + opPackageName + " ; not a current  user or profile"); 
      return false; 
     } 
     if (mAppOps.noteOp(AppOpsManager.OP_USE_FINGERPRINT, uid, opPackageName) 
       != AppOpsManager.MODE_ALLOWED) { 
      Slog.w(TAG, "Rejecting " + opPackageName + " ; permission denied"); 
      return false; 
     } 
     if (foregroundOnly && !isForegroundActivity(uid, pid)) { 
      Slog.w(TAG, "Rejecting " + opPackageName + " ; not in foreground"); 
      return false; 
     } 
     return true; 
    } 


    private boolean isForegroundActivity(int uid, int pid) { 
     try { 
      List<RunningAppProcessInfo> procs = 
        ActivityManagerNative.getDefault().getRunningAppProcesses(); 
      int N = procs.size(); 
      for (int i = 0; i < N; i++) { 
       RunningAppProcessInfo proc = procs.get(i); 
       if (proc.pid == pid && proc.uid == uid 
         && proc.importance == IMPORTANCE_FOREGROUND) { 
        return true; 
       } 
      } 
     } catch (RemoteException e) { 
      Slog.w(TAG, "am.getRunningAppProcesses() failed"); 
     } 
     return false; 
    } 

Es wird nach einer Vordergrundaktivität zur Authentifizierung gefragt !!

Verwandte Themen