最近在做一个大局悬浮窗基于ChatGPT使用快Ai,需要悬浮于在其他使用上面,便利从悬浮窗中,和ChatGPT对话后,对ChatGPT返回的内容拖拽到其他使用内部。快Ai使用本身通明,经过WindowManger添加悬浮窗。相似现在很多使用跳转到其他使用,会悬浮一个小按钮,便利用户点击调回本身一样。只不过快Ai窗口比较大,但不全屏。

碰到以下几个问题:

1、悬浮窗中EditText无法获得弹出键盘

主要是没有明白下面两个特点的作用,在网上查找之后直接设置了。

  • WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

设置FLAG_NOT_FOCUSABLE,悬浮窗外的点击才有用,会把事情分发给悬浮窗底层的其他使用Activity。但设置了FLAG_NOT_FOCUSABLE,屏幕上除悬浮窗之外的当地也能够点击、可是悬浮窗上的EditText会掉不起键盘。

此刻悬浮窗外的事情是不会触发悬浮窗内ViewonToucheEvent函数,能够经过添加WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH标志位,但无法阻拦事情。

  • WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL

    屏幕上除了悬浮窗外能够点击、弹窗上的EditText也能够输入、键盘能够弹出来。

所以依据业务需要,我只需要添加WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL标志位即可。

2、悬浮窗无法录音

经过Activity调起Service,然后在Service经过WindowManager添加悬浮窗。在没有进行任何操作,正常情况下,能够调起科大讯飞进行录音转成文字发给ChatGPT。

问题点一:搭档为了解决我还没来得及修正的windowManger.removeView改成exitProcess问题,强行进行各种修正,终究还调用了activityfinish函数,把activity干掉。终究导致无法调起科大讯飞的语音辨认。总是报录音权限问题,找不到任何的问题点,网上资料都说没有给录音权限,其实是有的。最后经过代码回退,定位到是Activity被干掉了,搭档也承认他的愚蠢行为。

问题点二:在进行一些操作,例如授权跳转到设置之后,退出设置回到原先界面,科大讯飞调不起录音,还是报权限问题。在有了问题点一的经验后,在Activity的各个生命周期打印日志,发现但onResume函数没有被回调到,也就是使用在后台运转时,该问题必现。

所以就一顿顿顿查找后,找到官方文档: Android 9 对后台运转的使用添加了权限约束。

Android悬浮窗自己踩的2个小坑

解决方法:

  1. 声明为系统使用,没问题。但咱们想做通用软件
  2. 添加前台服务。实测没作用。
  3. 在2的基础上,再添加一个特点:android:foregroundServiceType="microphone"。完美。
<service android:name=".ui.service.AiService"
    android:foregroundServiceType="microphone"
    />

Android悬浮窗自己踩的2个小坑

期望本文对君有用!