2017-03-03 9 views
1

で作業することはできません。指紋が、私はこのように、デモを構築するために指紋APIを使用してみてくださいサービス

 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) { 

      } 

     } 

、それが活動コンポーネントで動作しますが、私は自分の指紋を区別することができます。 サービスやBroadcastReciverコンポーネントでこれらのコードを使用しようとすると、コールバックを受け取ることができませんが、FingerPrint APIはアクティビティコンポーネントでのみ使用できますか?なぜですか?

+0

あなたの指を置くように指示するにはUIを表示する必要があります。サービスからアクティビティを開始することができます – LaurentY

+0

サービスで作成されたフローティングビューを使用してユーザーに指を置くよう指示します。 .authenticate(null、cancellationSignal、0、myAuthCallback、null); >>サービスでこれらのコードを使用すると結果は得られませんが、アクティビティで動作します。 –

答えて

0

私は、

/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; 
    } 

をソースコードから答えを見出しましたフォアグラウンドでの認証が求められます!!

関連する問題