在 Android 上使用 Flutter 显示在其他应用上

Posted

技术标签:

【中文标题】在 Android 上使用 Flutter 显示在其他应用上【英文标题】:Display Over Other Apps Using Flutter on Android 【发布时间】:2021-01-20 10:38:20 【问题描述】:

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

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

【问题讨论】:

原生和颤振之间的桥接是颤振的强大套件之一,查看 methodChannels,它是原生代码和颤振之间的一种 REST api 【参考方案1】:

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

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

Documentation 声明此权限

允许应用使用类型 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 中呈现自己。

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

【讨论】:

【参考方案2】:

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

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

system_alert_window

一个 Flutter 插件,显示 Truecaller 之类的覆盖窗口,总的来说 其他应用程序以及回调事件。 Android Go 或 Android 11 & 上面,这个插件显示通知气泡,在其他 android 版本,它会显示一个覆盖窗口。

【讨论】:

以上是关于在 Android 上使用 Flutter 显示在其他应用上的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 应用程序中显示原生 Android 视图?

在 Flutter 上显示带有表情符号的文本

Android在 Flutter 中使用 WebView

Flutter - 当键盘出现在android上时文本字段不显示

Flutter Web 不显示 Firebase 存储中的 NetworkImages,但在 android 模拟器上完美运行

Flutter Firebase:抬头通知未在后台显示