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

Jay*_*iyk 9 java android android-studio flutter

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

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

Pav*_*sha 7

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

<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 意味着什么?这意味着在干净的 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...
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

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

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

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