在android中按后退或主页按钮时可以使用WindowManager删除覆盖吗?

问题描述 投票:0回答:3

我试图在网站上找到我的问题的一些答案,但我没有找到任何东西,并且我不确定当按后退或主页按钮时是否可以使用 windowManager 删除或隐藏覆盖层。

这就是我现在拥有的。当用户进入我的应用程序的设置屏幕时,我使用辅助功能服务放置了一个覆盖层,该覆盖层覆盖了所有屏幕。 WindowManager 显示叠加层,但是当我尝试按后退按钮或主页按钮时它不起作用。好像被屏蔽了。仅当应用程序进程停止时才会消失叠加层。

请注意,我没有使用活动来显示叠加层。我正在使用 accessitibilyService 来执行此从 AccessibilityService 扩展的任务。

我想做的是用户按下后退或主页按钮,删除覆盖。

这是我显示叠加层的代码:

private String checkOverlay = "hide"

 WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                    0,
                    PixelFormat.TRANSLUCENT);
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

            overlayRunning.setBackgroundColor(Color.parseColor("#1C1C1C"));
            wm.addView(overlayRunning, params);
checkOverlay = "show";

我已将此方法添加到类中:

 @Override
    public boolean onKeyEvent(KeyEvent event) {
        int keyCode = event.getKeyCode();

        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Log.e(TAG, "Back button??");
                    Log.e(TAG, "Back button??");
                    overlayRunning.setVisibility(View.INVISIBLE);

            case KeyEvent.KEYCODE_HOME:
                Log.e(TAG, "Home button??");

                if(checkOverlay.equals("show")) {
                    WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                    wm.removeViewImmediate(overlayRunning);
                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
                    checkOverlay = "hide";
                }
                return false;
        }
        return super.onKeyEvent(event);
    }
android window-managers android-windowmanager accessibilityservice
3个回答
2
投票

您只需将 windowmanager 类型设置为 APPLICATION,这样 windowmanager 将仅在应用程序打开时附加视图,而无需覆盖主页或后退按钮,请查看文档here

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION,
                    0,
                    PixelFormat.TRANSLUCENT);

1
投票

删除视图很容易。我注意到您已将其设置为不可见,这是一个可接受的解决方案。您还可以保留对它的引用并执行以下操作:

windowManager.removeView(mYourView);

问题在于检测后退按钮按下情况。你无法可靠地做到这一点。您依赖于硬件期望,即按下后退按钮会发送带有 KEYCODE_BACK 的按键事件,并且操作系统不提供此保证。然而,在我的 Droid Turbo 上,以下功能有效:

首先,您需要一个单独的 xml 文件来配置您的辅助功能服务。

service_config.xml 的内容:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:canRequestFilterKeyEvents="true"
    android:accessibilityFlags="flagDefault|flagRequestFilterKeyEvents"
    ...
    />

AndroidManifest.xml的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
    <application ...>
        <service ...>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/service_config" />
        </service>
    </application>
</manifest>

0
投票
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            binding.cameraCardView.addOnUnhandledKeyEventListener { _, event ->
                if (event.action == KeyEvent.ACTION_UP) {
                    if (event.keyCode == KeyEvent.KEYCODE_BACK) {
                        closePage()
                    }
                }
                return@addOnUnhandledKeyEventListener true
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.