2017-03-03 3 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 Component에서 작동하는이 코드를 사용하려고하면 FingerPrint API가 Activity Component에서만 사용할 수있는 콜백을받을 수 없습니까? 그 이유는 무엇입니까?

+0

손가락을 넣으라고 사용자에게 UI를 보여줘야하고 서비스에서 활동을 시작할 수 있습니다. – LaurentY

+0

서비스로 만든 부동보기를 사용하여 손가락을 넣으라고 사용자에게 알립니다. 질문 >> fingerprintManager .authenticate (null, cancellationSignal, 0, myAuthCallback, null); >> 서비스에서이 코드를 사용하면 결과에 대해 아무 것도 얻지 않지만 Activity에서는 작동합니다. –

답변

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

를 소스 코드에서 답을 발견했다 인증을 위해 전경 활동을 요청받습니다 !!