gpt4 book ai didi

Android 系统叠加层未显示在我的应用程序外部

转载 作者:太空狗 更新时间:2023-10-29 16:17:21 25 4
gpt4 key购买 nike

我需要在任何正在运行的应用程序之上显示一个系统覆盖窗口。它工作正常,但只有当我的应用程序的 Activity 在前台时。这是我使用的代码:

params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
PixelFormat.TRANSLUCENT);

params.gravity = Gravity.CENTER | Gravity.TOP;
params.dimAmount = 0.3f;
wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);

mainAlertView = View.inflate(ctx, R.layout.system_alert_view, null);

wm.addView(mainAlertView, params);

添加到 WindowManager 的 View 包含空的 LinearLayout,我在运行时向其添加 subview :

    mainAlertLayout.addView(childView);

list xml 定义了 SYSTEM_ALERT_WINDOW 权限:

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

当我的 Activity 在前台运行时,一切都非常顺利。一旦我切换到任何其他应用程序或主屏幕,就不会显示叠加层。我调试了代码,它确实在运行 wm.addView(),并且没有抛出任何异常。我也玩过 LayoutParams 标志(删除了 KEEP_SCREEN_ON 和相关等),但没有任何区别。

Android 4.4.2 初起

最佳答案

您需要创建一个服务来保持系统覆盖(警报)即使在您的应用程序关闭时也能显示。

创建一个简单的服务,我将调用 FloatingService,它会在调用 onStartCommand 时显示 overlay(alert)。返回 START_STICKY 以保持服务在后台运行。

    public class FloatingService extends Service {
private WindowManager windowManager;
private View floatingView;

WindowManager.LayoutParams params;
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flag, int startId){
// show the alert her
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// use your custom view here
floatingView = View.inflate(getBaseContext(),R.layout.floating_layout,null); //floatingView.setOnTouchListener(mOnTouchListener);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.CENTER | Gravity.CENTER;
// add the view to window manger
windowManager.addView(floatingView, params);
return START_STICKY;
}
}

向 View 添加一个监听器,以便您可以在需要时关闭覆盖(警报)

      floatingView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
windowManager.removeView(floatingView);
floatingView = null;
}
});

最后,在 list 中注册服务

 <service android:name="com.example.app.services.FloatingService" />

系统警报权限

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

关于Android 系统叠加层未显示在我的应用程序外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com