【问题标题】:Android Studio - showing new activity over other apps results in a blackscreenAndroid Studio - 在其他应用程序上显示新活动会导致黑屏
【发布时间】:2021-11-20 15:14:29
【问题描述】:

我正在尝试为 SDK 版本 30 开发一个 android 应用程序,该应用程序(当单击按钮时)开始监听手机上打开了哪些应用程序。如果它检测到用户打开 Whatsapp,它应该在 Whatsapp 上显示 LockScreen 活动,让您在能够使用 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,然后应该在顶部显示 Lockscreen 活动:

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(虽然我不确定我什至需要这个)

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

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

我也尝试使用屏幕覆盖而不是活动来做到这一点(使用this 源),但这甚至不会给我一个黑屏 - 只是什么都不做......

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

【问题讨论】:

    标签: android android-studio android-activity


    【解决方案1】:

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

    目前,您需要授予两个单独的权限,以便在其他应用上显示屏幕:

    1. 显示在其他应用程序之上,也称为显示弹出窗口。这是我不确定是否需要的 android.permission.ACTION_MANAGE_OVERLAY_PERMISSION。所以强调一下,我确实确实需要这个权限。
    2. 在后台运行时显示弹出窗口。这是我缺少的权限。

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

    为了将用户直接引导到他们可以允许这些权限的设置菜单,我使用了来自 this 堆栈溢出答案的代码。这也是我得到信息的地方,这是一个特定于小米的“问题”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 2012-12-28
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多