android - SecurityException: Permission Denial: isUidActive from pid=XXXX, uid=XXXX requires android.permission.PACKAGE_USAGE_STATS
问题描述
我在尝试调用enableReaderMode()
NfcAdapter 类的 crashlytics 日志中遇到了这个(对我而言)未知崩溃:
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 设备中
提前致谢!
解决方案
推荐阅读
- ios - ARKit 使用 SCNTechnique 在其他对象后面时渲染对象轮廓
- html - 导航栏上的徽标未显示
- php - Laravel eloquent 中的嵌套数据结构
- c++ - 使用 gcc 在 vscode 中构建和运行 C++ 代码时出错。任务.json 文件
- wordpress - 永久链接添加不需要的问号
- python - $ cdk synth 'python' 不是内部或外部命令、可运行程序或批处理文件
- javascript - 从 Firefox 上的 AJAX 响应下载的文本文件中忽略换行符,与 Chrome 一起工作正常
- tomcat - 当应用程序部署在 Tomcat 根目录时更改 tomcat favicon
- r - 将字符串作为参数传递给粘贴函数
- node.js - 如何在 react-js 中获取 MAC 地址和操作系统名称