SecurityException:权限拒绝:来自 pid=XXXX 的 isUidActive,uid=XXXX 需要 android.permission.PACKAGE_USAGE_STATS

2024-01-18

我在尝试调用的 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 设备上

提前致谢!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SecurityException:权限拒绝:来自 pid=XXXX 的 isUidActive,uid=XXXX 需要 android.permission.PACKAGE_USAGE_STATS 的相关文章

随机推荐