Android Studio - 在其他应用程序上方显示新 activity 导致黑屏

Android Studio - showing new activity over other apps results in a blackscreen

我正在尝试为 SDK 版本 30 开发一个 android 应用程序,该应用程序(单击按钮时)开始监听 phone 上打开的应用程序。如果它检测到用户打开了 Whatsapp,它应该会在 Whatsapp 上显示一个 LockScreen activity,让你在能够使用 Whatsapp 之前回答一个数学问题。

我知道这是可以做到的,因为他们的应用程序如 QualityTime 或 Forest 具有类似的功能来限制您使用某些应用程序,但我是编程方面的新手(从我的代码中可能很明显)并且感觉完全卡住了。

我已经想出如何使用堆栈溢出的代码检测用户在最后一秒打开的应用程序:

public String getCurrentApp() {
    String topPackageName = "None";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService("usagestats");
        long time = System.currentTimeMillis();
        List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1, time);
        // Sort the stats by the last time used
        if (stats != null) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : stats) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (!mySortedMap.isEmpty())
            {
                topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    }
    return topPackageName;
}

我有另一个功能,当用户单击我的应用程序中的按钮以“激活”收听过程时,它会启动。此函数不断检查用户是否打开 Whatsapp,然后应该在顶部显示锁屏 activity:

public void startListening(View view)
{
    System.out.println("Lock activated.");
    while (activated) {
        String currentlyRunningApp;
        currentlyRunningApp = getCurrentApp();
        if (currentlyRunningApp.equals("com.whatsapp"))
        {
            System.out.println("Whatsapp detected. Showing Lockscreen...");
            Intent i = new Intent(this,LockScreen.class);
            startActivity(i);
        }

        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

(顺便说一句,我展示的所有代码都在我的 MainActivity 中。)

我的应用获得了以下权限:

  1. android.permission.PACKAGE_USAGE_STATS(对于 getCurrentApp() 函数)
  2. android.permission.SYSTEM_ALERT_WINDOW(建议here
  3. android.permission.ACTION_MANAGE_OVERLAY_PERMISSION(虽然我不确定我是否需要这个)

我的问题是,它没有显示我创建的锁屏 activity,它只为用户显示黑屏。如果我让用户通过 mainActivity 上的按钮打开它,锁屏 activity 本身工作正常,所以问题似乎真的是我无法正确显示 activity 如果我的应用程序是 运行 在后台,我想在 Whatsapp 上显示它。

我试图查看类似的问题,但这里所有具有类似用例的帖子似乎都非常陈旧和过时(即 this or this),因为较新的版本似乎更严格安全限制。

我还尝试使用屏幕覆盖而不是 activity(使用 this 来源),但这甚至没有给我黑屏 - 什么都不做......

我也知道可能有更好的方法来对整个“监听和检查 whatsapp”部分进行编程 - 即使用服务而不是 while 循环或其他东西,但我只是在研究时才发现服务这个问题,我想先解决黑屏问题。

经过多次试验和错误后,我发现问题确实是由缺少权限引起的,但我在与黑屏问题相关的任何堆栈溢出答案中都找不到。最重要的是,我认为这是一个只发生的问题因为我使用小米设备进行测试。

目前有两个单独的权限用于在其他应用程序上显示屏幕,您需要授予这些权限:

  1. 在其他应用上显示,也称为显示 pop-up window。这是我什至不确定是否需要的 android.permission.ACTION_MANAGE_OVERLAY_PERMISSION。所以强调一下,我绝对确实需要这个许可。
  2. 显示 pop-up windows 而 运行 在后台。这是我缺少的权限。

在我同时允许它们之后(您可以在“设置”>“应用”>“管理应用”>“您的应用”>“其他权限”下执行此操作)一切正常。

为了将用户直接引导到允许这些权限的设置菜单,我使用了 stack overflow answer 中的代码。这也是我得到信息的地方,它是一个 xiaomi-specific“问题”。