首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FingerPrint无法在服务中工作

FingerPrint无法在服务中工作
EN

Stack Overflow用户
提问于 2017-03-03 17:03:34
回答 1查看 526关注 0票数 1

我尝试使用FingerPrint接口构建一个演示,如下所示:

代码语言:javascript
复制
        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接口只能在Activity组件中使用?为什么?

EN

回答 1

Stack Overflow用户

发布于 2017-03-13 09:33:47

我已经从源代码中找到了答案。

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

代码语言:javascript
复制
      @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;
  }

请求前台活动进行身份验证!!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42574605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档