返回

ForegroundApp Checker 一小时后返回空值疑难杂症解决

java

解决 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 及以上版本的设备兼容。