安卓APP调用安卓的自由窗口

第三方应用调用安卓的自由窗口功能,将自身运行在自由窗口中,这个应该怎么做

如果您是在chatgpt搜索的就不要发了,我早就搜过了 有没有真正懂的同学

该回答引用GPT:
要实现调用安卓的自由窗口功能,需要在AndroidManifest.xml文件中添加如下代码:

<activity
    android:name=".FreeWindowActivity"
    android:theme="@style/Theme.AppCompat.NoActionBar"
    android:excludeFromRecents="true"
    android:resizeableActivity="true"
    android:launchMode="singleTask"
    android:windowSoftInputMode="adjustResize"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:screenOrientation="portrait"
    android:showForAllUsers="true"
    android:taskAffinity="com.example.freeWindow"
    android:allowEmbedded="true"
    android:supportsPictureInPicture="true"
    android:resizeableActivity="true"
    android:windowLayoutInDisplayCutoutMode="shortEdges"
    android:windowIsFloating="true"
    android:windowIsTranslucent="true"
    android:windowAnimationStyle="@android:style/Animation.Activity"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

然后在Activity中实现自由窗口的功能,可以使用如下代码:

//设置窗口属性
Window window = getWindow();
window.setGravity(Gravity.TOP | Gravity.LEFT);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = 0;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(params);

最后,在Activity的onCreate()方法中调用setContentView()方法,将布局文件设置为自由窗口的内容即可。
如还有疑问,可以私信帮助解决。

参考GPT和自己的思路:安卓系统的自由窗口(Freeform Window)是指可以在桌面上创建一个自由的、可拖动、可调整大小的窗口,类似于PC上的窗口化界面。从安卓 7.0(API Level 24)开始,安卓系统内置了自由窗口功能。
如果第三方应用要调用安卓的自由窗口功能,需要满足以下两个条件:

1 设备支持自由窗口功能。安卓 7.0 以上版本的系统才支持自由窗口功能。

2 第三方应用必须拥有 SYSTEM_ALERT_WINDOW 权限。这个权限是安卓的一个敏感权限,需要在应用的 manifest 文件中声明,并且用户必须授予应用这个权限才能使用自由窗口功能。

下面是一个简单的示例代码,演示了如何在第三方应用中使用自由窗口功能:

// 定义一个 Intent,用于启动自由窗口
Intent freeformIntent = new Intent();
freeformIntent.setClassName("com.android.settings", "com.android.settings.Settings$FreeformWindowSettingsActivity");
freeformIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
 
// 检查当前设备是否支持自由窗口
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    // 如果设备支持自由窗口,则启动自由窗口
    startActivity(freeformIntent);
} else {
    // 如果设备不支持自由窗口,则提示用户设备不支持
    Toast.makeText(this, "Your device does not support freeform window mode.", Toast.LENGTH_SHORT).show();
}


在这个示例代码中,我们首先定义了一个 Intent 对象,这个 Intent 用于启动安卓系统内置的自由窗口设置界面。然后,我们使用 startActivity() 方法来启动这个 Intent。

需要注意的是,如果设备不支持自由窗口功能,则启动 Intent 会失败。因此,在启动 Intent 之前,我们需要使用 Build.VERSION.SDK_INT 属性检查当前设备的安卓版本,判断是否支持自由窗口功能。如果设备不支持自由窗口功能,则需要给用户一个提示,说明设备不支持自由窗口功能。

当第三方应用启动了自由窗口之后,应用的界面就会出现在自由窗口中,用户可以通过拖动和调整窗口大小来改变应用的显示区域。同时,用户也可以在自由窗口中运行其他应用,实现多窗口同时显示的效果。

参考GPT和自己的思路,要让第三方应用在 Android 自由窗口中运行,可以通过以下步骤实现:

1.在 AndroidManifest.xml 文件中添加以下权限:

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

2.这个权限允许应用创建一个顶层窗口,从而在自由窗口中运行。

在应用代码中,创建一个新的 WindowManager.LayoutParams 对象,并设置其类型为 TYPE_APPLICATION_OVERLAY:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT);

这个参数告诉 Android,我们想要创建一个应用层面的窗口,允许它浮在其它应用之上。

3.创建一个新的 View,并将其添加到 WindowManager 中:

View view = LayoutInflater.from(context).inflate(R.layout.my_layout, null);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.addView(view, params);

这个 View 可以是任何自定义视图,它将会在自由窗口中显示。

需要注意的是,使用自由窗口需要谨慎,因为它可以覆盖其它应用程序的内容。建议只有在必要的情况下才使用自由窗口,并尽量不要干扰用户的体验。

参考GPT和自己的思路:

要实现第三方应用调用安卓的自由窗口功能,需要使用Android的WindowManager类,该类提供了创建和控制窗口的方法。具体步骤如下:

  1. 获取WindowManager对象。在Activity中,可以通过getWindowManager()方法获取;在Service中,可以通过Context.getSystemService(Context.WINDOW_SERVICE)获取。

  2. 创建窗口View,并设置布局和属性。创建控件时,需要指定宽度、高度和出现位置等属性。

  3. 将窗口View添加到WindowManager。使用addView()方法将控件添加到WindowManager中,并设置WindowManager.LayoutParams参数,如设置TYPE_APPLICATION_OVERLAY可使窗口在应用程序之上显示,设置FLAG_NOT_FOCUSABLE可让窗口不具备焦点。

  4. 在需要关闭窗口时,调用removeView()方法将窗口从WindowManager中移除即可。

需要注意的是,使用自由窗口功能需要声明SYSTEM_ALERT_WINDOW权限。同时,在Android 8.0及以上版本中,还需要申请悬浮窗权限。

该回答引用ChatGPT,希望能对你有帮助,你试试看看能不能解决问题
Android 的自由窗口功能,也称为“自由形式模式”,允许某些应用程序在可调整大小的窗口中运行,就像在台式计算机上一样。要使您的第三方应用程序能够在自由窗口中运行,请执行以下步骤:
1.在应用的 AndroidManifest.xml 文件中声明对自由格式模式的支持。将以下属性添加到要在自由窗口中运行的活动的元素:

android:resizeableActivity="true"

例如:

<activity
    android:name=".MainActivity"
    android:resizeableActivity="true">
    ...
</activity>

2.为您的应用启用多窗口支持。这通常在活动的 onCreate() 方法中完成。例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setMultiWindow();
    }
}

3.创建一个调用setMultiWindow()以启用多窗口支持的函数:

@RequiresApi(api = Build.VERSION_CODES.N)
private void setMultiWindow() {
    final WindowManager.LayoutParams attrs = getWindow().getAttributes();
    attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    attrs.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    getWindow().setAttributes(attrs);
}

4.确保您已在 Android 设备上启用开发者选项。为此,请转到“设置”>“关于手机”>“软件信息”> 点击“内部版本号”7 次。
5.在开发人员选项中,启用“强制活动可调整大小”选项。
6.启动您的设备。
7.启动您的应用程序,它现在应该能够在自由窗口中运行。

请记住,并非所有 Android 设备都支持 Freeform 模式,用户体验可能因设备制造商和安装的 Android 版本而异。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
Android平台允许应用程序使用自由窗口来创建多窗口界面,允许在同一屏幕上同时运行多个应用程序。

要实现一个应用程序调用安卓的自由窗口功能,需要以下步骤:

  1. 确认自由窗口是否可用

在应用程序中,可以通过PackageManager.queryIntentActivities()方法,检测是否存在可以处理自由窗口的Activity。

  1. 请求自由窗口权限

应用程序需要在AndroidManifest.xml中声明使用自由窗口权限:

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

同时,应该在应用程序中请求权限:

if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
          Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 101);
}
  1. 创建自由窗口
//获取窗口管理器
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
//设置窗口参数
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
  WindowManager.LayoutParams.MATCH_PARENT,
  WindowManager.LayoutParams.MATCH_PARENT,
  WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
  WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
  PixelFormat.TRANSLUCENT
);
//创建窗口
View view = LayoutInflater.from(this).inflate(R.layout.layout_window, null);
windowManager.addView(view, params);

以上代码创建了一个覆盖整个屏幕的自由窗口。

  1. 将应用程序运行在自由窗口中

实现这一步需要将应用程序的界面布局修改,适应自由窗口的大小。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#000000">
  
  <!-- 在这里放置应用程序的界面组件 -->
  
</RelativeLayout>

实现以上步骤后,应用程序就可以在自由窗口中运行了。

附加说明:

  1. 此处的示例代码假定已经具有SYSTEM_ALERT_WINDOW权限,实际应用中必须先请求权限。

  2. 应用程序运行在自由窗口中时,可能需要处理布局、事件等方面的细节问题,以确保应用程序在不同大小的窗口中能够正常运行。

  3. 应用程序在自由窗口中运行时,需要注意与其他应用程序的交互。比如说,当用户在桌面上打开别的应用程序时,应该将自己的窗口最小化,避免对用户产生困扰。

  4. 此功能在Android 11及以上版本的限制较多,需要在manifest中加上<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>权限,同时需要特定的权限申请,如果申请不当在谷歌审核时会被要求删除此功能。

参考:

  1. Android文档: https://developer.android.com/guide/topics/ui/multi-window
  2. 《Android编程权威指南》
    如果我的回答解决了您的问题