日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Attempt to invoke virtual method ‘boolean FingerprintManager.isHardwareDetected()‘ on a null objec

發布時間:2024/1/18 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Attempt to invoke virtual method ‘boolean FingerprintManager.isHardwareDetected()‘ on a null objec 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

解決Android指紋識別Crash異常java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.hardware.fingerprint.FingerprintManager.isHardwareDetected()' on a null object的問題及原因探究

問題

應用需要提交至小米應用市場,未審核通過,下圖是小米審核的結果

小米給的log比較完整,整個log文件都有28M多,下載后先直接搜索關鍵字beginning of crash或FATAL EXCEPTION: main,找到異常信息如下:

--------- beginning of crash 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: FATAL EXCEPTION: main 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: Process: com.ktt.xxx, PID: 6318 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ktt.xxx/com.ktt.smarthome.activity.MainActivityWithSlide}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.hardware.fingerprint.FingerprintManager.isHardwareDetected()' on a null object reference 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2841) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2919) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread.-wrap11(Unknown Source:0) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.os.Looper.loop(Looper.java:176) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6656) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.hardware.fingerprint.FingerprintManager.isHardwareDetected()' on a null object reference 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at com.ktt.smarthome.activity.MenuFram.isFingerPrintAvailable(MenuFram.java:105) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at com.ktt.smarthome.activity.MenuFram.onActivityCreated(MenuFram.java:74) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.Fragment.performActivityCreated(Fragment.java:2517) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1562) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1623) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentManagerImpl.dispatchMoveToState(FragmentManager.java:3032) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2984) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.FragmentController.dispatchActivityCreated(FragmentController.java:178) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7080) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7065) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2794) 07-31 00:25:17.684 10108 6318 6318 E AndroidRuntime: ... 9 more

為了發現更多問題,我有在小米云測平臺對所有的小米機型進行了兼容性測試,測試結果和審核結果log一致,竟然是所有Redmi A系列都有這個問題,測試失敗結果如下圖所示

解決

通過上面發現,具體crash異常如下:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.hardware.fingerprint.FingerprintManager.isHardwareDetected()' on a null object
通過異常信息NullPointerException,可以很容易看出這是個空指針異常,要解決這個問題到是很簡單,定位到異常所在的文件,所在的行。異常的代碼如下:

return fm.isHardwareDetected()&&fm.hasEnrolledFingerprints();

很明顯就是調用fm為null導致的,對fm加上null判斷即可解決,修改后的代碼如下:

return fm != null && fm.isHardwareDetected() && fm.hasEnrolledFingerprints();

原因

問題雖然解決了,作為一個每遇到一個問題都要追根問底的開發,當然要知道原因咯。

  • 為什么問題出在Redmi 6A、7A、8A?

通過查閱發現這幾款手機都是不帶指紋的,但是帶面部解鎖。
因為指紋解鎖、指紋支付成本較高,這就是為什么紅米A系列的手機性價比高的原因了。
既然不帶指紋,那我猜測是因為小米將沒有指紋識別機器的Rom中移除了 FingerprintManager的API

實際上這個API是在6.0才加入的。文檔:

  • 指紋識別API的演進

在 Android 6.0(Android M Api23),Android 系統開放了指紋識別的api,存在于 android.hardware.fingerprint包下,核心類是FingerprintManager,提供了基礎的指紋識別的功能。要注意的是,FingerprintManager在 Android 9.0(Android P Api28)做了 @Deprecated 標記,將被棄用。

后來,在android.support.v4.hardware.fingerprint包和 androidx.core.hardware.fingerprint包中,FingerprintManager升級為了 FingerprintManagerCompat,對功能進行了增強,也做了一些兼容性的處理,比如增加了系統版本號的判斷,對指紋支持加密處理等。實際上閱讀源碼會發現,他的核心功能還是調用 FingerprintManager 實現的。

再之后,在 Android 9.0(Android P Api 28),Google 對生物識別進行了進一步增強,開放了以 BiometricPrompt 為核心的新 Api,存在于 androidx.biometric 包和android.hardware.biometrics包下,Google 在開發者文檔中是這樣解釋的:

On devices running P and above, this will show a system-provided authentication prompt, using a device’s supported biometric (fingerprint, iris, face, etc).

大意是,在 Android P 及以上版本的系統中,BiometricPrompt 將展現一個由系統提供的驗證提示,用于支持設備提供的生物識別,包括指紋、虹膜、面部等。

目前來看,虹膜和面部等生物識別 Api 尚未開放,僅支持指紋識別,不過在指紋識別上進行了統一,比如要求使用統一的指紋識別 UI ,不允許開發者自定義了。

參考鏈接

Android開發學習—指紋識別系統的原理與使用

總結

以上是生活随笔為你收集整理的Attempt to invoke virtual method ‘boolean FingerprintManager.isHardwareDetected()‘ on a null objec的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。