特定三星设备上指纹识别崩溃

7

我最近发布了一个新的应用程序,支持指纹认证。

在我们的所有测试设备上都可以正常工作:
- OnePlus Three
- OnePlus Five
- Samsung S6 Edge
- Samsung S7
- Samsung S8

但是当发布后,我们开始从 Fabric 获取以下堆栈跟踪导致的崩溃:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.our.app/com.our.app.ui.LoginActivity}: java.lang.SecurityException: Permission Denial: getCurrentUser() from pid=30208, uid=10038 requires android.permission.INTERACT_ACROSS_USERS
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3319)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
       at android.app.ActivityThread.access$1100(ActivityThread.java:229)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:7325)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by java.lang.SecurityException: Permission Denial: getCurrentUser() from pid=30208, uid=10038 requires android.permission.INTERACT_ACROSS_USERS
       at android.os.Parcel.readException(Parcel.java:1620)
       at android.os.Parcel.readException(Parcel.java:1573)
       at android.hardware.fingerprint.IFingerprintService$Stub$Proxy.hasEnrolledFingerprints(IFingerprintService.java:503)
       at android.hardware.fingerprint.FingerprintManager.hasEnrolledFingerprints(FingerprintManager.java:776)
       at com.our.app.fingerprint.handler.FingerprintHandler.canUseFingerprint(SourceFile:65)
       at com.our.app.Client.canUseFingerprint(SourceFile:335)
       at com.our.app.ui.LoginActivity.updateViewVisibilityBasedOnState(SourceFile:501)
       at com.our.app.ui.LoginActivity.updateViewVisibilityBasedOnState(SourceFile:472)
       at com.our.app.ui.LoginActivity.continueWithOnCreateLogic(SourceFile:399)
       at com.our.app.ui.LoginActivity.onCreate(SourceFile:321)
       at android.app.Activity.performCreate(Activity.java:6904)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
       at android.app.ActivityThread.access$1100(ActivityThread.java:229)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:7325)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

根据Fabric的说法,以下设备遇到了崩溃问题:
- Galaxy A5
- Galaxy S5 Mini
- Galaxy A3(2016)

这些设备都运行着Android 6.0.1。
考虑到它们都是三星设备,我开始怀疑Knox可能是问题所在,尽管在堆栈跟踪中没有明确列出。但我不知道如何解决或修复它。
我在三星自己的网站上找到了一个类似的问题,但没有解决方法:
https://seap.samsung.com/forum-topic/getting-javalangsecurityexception-permission-denial 在堆栈跟踪中命名的权限是系统权限,没有用户应用程序可以获取,只有系统应用程序可以获取。
有人有解决此问题的想法吗?

  • 三星Galaxy A5
  • 三星Galaxy S5 Mini
  • 三星Galaxy A3(2016)
这些设备有指纹触控功能吗?
- KuLdip PaTel
@KuLdipPaTel S5 Mini和A3都有指纹扫描仪。 - Milos Lulic
1
你解决了这个问题吗?我们也遇到了同样的问题... - Jens Moser
我记得在Galaxy S7上第一次设备重启后调用hasEnrolledFingerprints时会出现SecurityException。如果在hasEnrolledFingerprints之前调用isHardwareDetected,则不会发生异常。我无法再在该设备上复现此问题,但它现在运行的是Android 7.0,我不记得我们获得它时它运行的是哪个Android版本。 - Michael
2个回答

2

不确定您是否曾经找到了解决方案,作为一种解决方法,我只是在我们的调用中加入了权限检查。

inline val Activity.fingerprintManager: FingerprintManagerCompat?
  get() = (
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) {
      FingerprintManagerCompat.from(this)
    } else { null }
  )

-1

是的,我看到了这个崩溃。

由于INTERACT_WITH_USERS是一个系统权限,所以它对我们来说崩溃也不奇怪。

三星真是太傻了。

将代码放在try/catch中以捕获SecurityException异常。

-Ken


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接