当应用程序在后台尝试访问位置时,是否可以获取日志?
Is it possible to get logs for when an app is trying to access location while in the background?
Google 一直告诉我我的应用正在后台访问该位置。我的目标是 SDK 29,我没有 ACCESS_BACKGROUND_LOCATION
权限。我有 ACCESS_FINE_LOCATION
.
我开始认为可能是广告网络在后台执行此操作,但我想通过查看日志来确认这一点。有办法吗?
编辑:下面关于 AppOps
的回答非常有用,但是我已经提交了一个更新来解决所有发现的问题,但我仍然遇到 Play 商店拒绝更新的问题,原因是背景位置。那么还有其他方法可以解决这个问题吗?也许旧版本 Android?
如果您可以访问 Android 11 设备,则可以使用 new data access APIs 可用的设备,您可以利用这些设备来了解您的应用程序中有什么正在使用这样的 dangerous
权限。
在 this sample project (profiled in 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
子类中其他代码的一部分)
在该示例的上下文中,它将记录应用正在从其视图模型获取位置的事实。但是,这只是基于示例 — 在更大的应用程序中,它会记录来自任何地方的权限使用,包括您的广告网络库。
Google 一直告诉我我的应用正在后台访问该位置。我的目标是 SDK 29,我没有 ACCESS_BACKGROUND_LOCATION
权限。我有 ACCESS_FINE_LOCATION
.
我开始认为可能是广告网络在后台执行此操作,但我想通过查看日志来确认这一点。有办法吗?
编辑:下面关于 AppOps
的回答非常有用,但是我已经提交了一个更新来解决所有发现的问题,但我仍然遇到 Play 商店拒绝更新的问题,原因是背景位置。那么还有其他方法可以解决这个问题吗?也许旧版本 Android?
如果您可以访问 Android 11 设备,则可以使用 new data access APIs 可用的设备,您可以利用这些设备来了解您的应用程序中有什么正在使用这样的 dangerous
权限。
在 this sample project (profiled in 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
子类中其他代码的一部分)
在该示例的上下文中,它将记录应用正在从其视图模型获取位置的事实。但是,这只是基于示例 — 在更大的应用程序中,它会记录来自任何地方的权限使用,包括您的广告网络库。