问题描述
Google 一直告诉我我的应用正在后台访问该位置。我的目标是 SDK 29,但我没有 ACCESS_BACKGROUND_LOCATION
权限。我有ACCESS_FINE_LOCATION
。
我开始认为广告网络可能正在后台执行此操作,但我想通过查看日志来确认这一点。有没有办法做到这一点?
编辑:下面关于 AppOps
的答案非常有用,但是我已经提交了一个更新,解决了以这种方式发现的每个问题,但我仍然遇到 Play 商店由于后台位置而拒绝更新的问题.那么有没有其他方法可以解决这个问题?也许在旧版本的 Android 上有什么东西?
解决方法
如果您有权访问 Android 11 设备,则可以利用 new data access APIs 来了解您的应用中的哪些内容使用了这样的 dangerous
权限。
在 this sample project(在 this book 中分析)中,我有一些代码来记录所有 dangerous
权限使用的堆栈跟踪:
getSystemService(AppOpsManager::class.java)
?.setOnOpNotedCallback(executor,object : AppOpsManager.OnOpNotedCallback() {
override fun onNoted(op: SyncNotedAppOp) {
Log.d(TAG,"onNoted: ${op.toDebugString()}")
RuntimeException().printStackTrace(System.out)
}
override fun onSelfNoted(op: SyncNotedAppOp) {
Log.d(TAG,"onSelfNoted: ${op.toDebugString()}")
RuntimeException().printStackTrace(System.out)
}
override fun onAsyncNoted(op: AsyncNotedAppOp) {
Log.d(TAG,"onAsyncNoted: ${op.toDebugString()}")
RuntimeException().printStackTrace(System.out)
}
})
(作为自定义 Application
子类中其他代码的一部分)
在该示例的上下文中,它将记录应用程序正在从其视图模型获取位置的事实。但是,这只是基于示例——在更大的应用中,它会记录任何东西的权限使用,包括您的广告网络库。