ForegroundApp Checker 一小时后返回空值疑难杂症解决
2024-03-21 02:42:12
解决 ForegroundApp Checker 一小时后返回空值的疑难杂症
问题
使用 ForegroundApp Checker 库检查前台应用程序时,在运行一小时后返回空值。
成因分析
从 Android 11 开始,获取前台应用程序信息的机制发生了变化,不再需要 android.permission.GET_TASKS
权限。
解决方案步骤
1. 升级库版本
升级库版本至 1.1.2 或以上。
2. 请求使用情况访问权限
在 onCreate
方法中,添加如下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val usageStatsManager = packageManager.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val appList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, System.currentTimeMillis() - 1000 * 3600 * 24, System.currentTimeMillis())
val foregroundApp = appList.firstOrNull()
}
3. 检查运行时权限
在 Android 6.0 及以上版本,需要检查是否授予了 Manifest.permission.PACKAGE_USAGE_STATS
权限。添加如下代码:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.PACKAGE_USAGE_STATS) != PackageManager.PERMISSION_GRANTED) {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
startActivity(intent)
}
4. 重新运行库
执行上述步骤后,重新运行库即可获取前台应用程序包名。
代码示例
class MainActivity : Activity() {
private val appChecker = AppChecker()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
requestUsageStatsPermission()
val foregroundAppPackageName = appChecker.getForegroundApp(this)
// Do something with the foreground app package name
}
private fun requestUsageStatsPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.PACKAGE_USAGE_STATS) != PackageManager.PERMISSION_GRANTED) {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
startActivity(intent)
}
}
}
其他注意事项
- 确保设备上已启用使用情况访问权限。
- 如果问题仍然存在,尝试清理并重建项目。
常见问题解答
1. 为什么从 Android 11 开始需要使用情况访问权限?
因为 Android 11 引入了新的隐私措施,限制了对前台应用程序信息的访问。
2. 为什么 ForegroundApp Checker 在一小时后返回空值?
因为库使用了旧的机制,需要 android.permission.GET_TASKS
权限,该权限在 Android 11 中已不再可用。
3. 如果用户拒绝使用情况访问权限怎么办?
在这种情况下,ForegroundApp Checker 将无法获取前台应用程序信息。建议在适当的情况下提示用户授权使用权限。
4. 如何检查 ForegroundApp Checker 的版本?
在 build.gradle
文件中,检查 implementation 'com.github.ricvalerio:foregroundappchecker:'
行,版本号紧随其后。
5. ForegroundApp Checker 是否与所有 Android 设备兼容?
ForegroundApp Checker 与运行 Android 5.0 及以上版本的设备兼容。