我在尝试调用的 crashlytics 日志中遇到了这个(对我而言)未知的崩溃enableReaderMode()
在 NfcAdapter 类中:
Caused by java.lang.SecurityException: Permission Denial: isUidActive from pid=XXXX, uid=XXXX requires android.permission.PACKAGE_USAGE_STATS
at android.os.Parcel.createExceptionOrNull(Parcel.java:2387)
at android.os.Parcel.createException(Parcel.java:2371)
at android.os.Parcel.readException(Parcel.java:2354)
at android.os.Parcel.readException(Parcel.java:2296)
at android.nfc.INfcAdapter$Stub$Proxy.setReaderMode(INfcAdapter.java:1027)
at android.nfc.NfcActivityManager.setReaderMode(NfcActivityManager.java:242)
at android.nfc.NfcActivityManager.enableReaderMode(NfcActivityManager.java:218)
at android.nfc.NfcAdapter.enableReaderMode(NfcAdapter.java:1580)
at com.my.package.enableNfc(MyClass.kt:23)
at java.lang.reflect.Method.invoke(Method.java)
at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:216)
at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:194)
at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:185)
at androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:37)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
at androidx.lifecycle.ReportFragment.dispatch(ReportFragment.java:68)
at androidx.lifecycle.ReportFragment$LifecycleCallbacks.onActivityPostResumed(ReportFragment.java:188)
at android.app.Activity.dispatchActivityPostResumed(Activity.java:1469)
at android.app.Activity.performResume(Activity.java:8265)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4714)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4756)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2296)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:239)
at android.app.ActivityThread.main(ActivityThread.java:8071)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1015)
我正在通过惰性初始化我的 NfcAdapter,如下所示:
private val nfcAdapter: NfcAdapter? by lazy {
NfcAdapter.getDefaultAdapter(activity)
}
并以这种方式处理它:
fun enableNfc() {
nfcAdapter?.enableReaderMode(
activity, callback,
NfcAdapter.FLAG_READER_NFC_A or
NfcAdapter.FLAG_READER_NFC_B or
NfcAdapter.FLAG_READER_NFC_F or
NfcAdapter.FLAG_READER_NFC_V or
NfcAdapter.FLAG_READER_NFC_BARCODE,
Bundle().apply {
putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250)
}
)
}
我测试过的所有设备都可以成功运行,即使是那些没有可用 NFC 的设备(该功能永远不会被触发)。
我的问题是:除了<uses-permission android:name="android.permission.NFC" />
在清单文件中?它是运行时权限吗?为什么触发这个异常与统计????♂️有关?它发生在 Android 11 设备上
提前致谢!