9

是否可以在 Android Flutter 应用程序上启用“显示在其他应用程序上”?

是否可以桥接到原生 Android API 以在 Flutter 应用程序上启用此功能?有人可以详细说明一下吗?

4

2 回答 2

8

您描述的功能由应用程序权限处理

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

文档指出此权限

允许应用使用类型 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY 创建窗口,显示在所有其他应用之上。

是不是有点模糊的解释?让我们找出是什么TYPE_APPLICATION_OVERLAY意思。

应用程序覆盖窗口显示在所有活动窗口(FIRST_APPLICATION_WINDOW 和 LAST_APPLICATION_WINDOW 之间的类型)上方,但在状态栏或 IME 等关键系统窗口下方。

为什么我提到了这两行?

好吧,要回答您的问题,我们需要了解如何在普通的 android 中实现这一目标。我们确实知道它有效。问题是这种方法只适用于带有 UI 的 android 组件 - 活动、服务、对话框(后两者需要一些额外的工作)。

这对 Flutter 意味着什么?这意味着在 clean Flutter 中没有设置来启用这种行为,只有底层平台提供的工具。

在 android 上下文中,使用此权限将允许您将此功能用于 android UI 容器(需要通过这样的权限管理屏幕明确请求)

if(!Settings.canDrawOverlays(this)){
    // ask for setting 
     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
     Uri.parse("package:" + getPackageName()));
     startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_OVERLAY_PERMISSION) {
        if (Settings.canDrawOverlays(this)) {
            // permission granted...
        }else{
            // permission not granted...
        }
    }
}

而且我还不确定是否有 Flutter 模拟。

进一步探索发现,Flutter 在特殊的 android 容器FlutterActivityFlutterFragment.

对于这两个,您可以在获得相关许可的情况下强制执行预期的行为。整个 Flutter UI 将有可能被绘制为覆盖。但是,如果您只想将 Flutter UI 的某些部分绘制为叠加层,例如某些 Flutter 对话框或导航路线的一部分 - 您将无法轻松实现它(仅创建一个单独的 Android 原生 UI 容器和通道你的颤振 UI - AFAIK 不推荐,因为有多个颤振 UI 容器可能会导致问题)

于 2020-10-26T14:56:47.343 回答
0

已经有一个插件可用,声称“在所有其他应用程序上显示 Truecaller 之类的覆盖窗口以及回调事件”,

请查看插件system_alert_window网址:https ://pub.flutter-io.cn/packages/system_alert_window

system_alert_window

一个颤振插件,用于在所有其他应用程序以及回调事件上显示 Truecaller 之类的覆盖窗口。Android Go 或 Android 11 及更高版本,此插件显示通知气泡,在其他 android 版本中,它显示一个覆盖窗口。

于 2020-11-01T16:36:56.250 回答