簡體   English   中英

在Android中按下Back或Home按鈕時,是否可以使用WindowManager移除覆蓋圖?

[英]Is possible remove an overlay with WindowManager when press back or home button in android?

我正在嘗試在網站上找到我的問題的答案,但是我什么也沒找到,並且我不確定在按返回或主頁按鈕時是否可以使用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);
    }

只需將windowmanager類型設置為APPLICATION,這樣windowmanager將僅在打開應用程序時附加視圖,而無需覆蓋主頁或后退按鈕,請在此處檢查文檔

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

刪除視圖很容易。 我注意到您已將其設置為不可見,這是可以接受的解決方案。 您也可以保留對其的引用並執行以下操作:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM