0

Я пытаюсь найти какой-то ответ на свой вопрос на сайте, но ничего не нашел, и я не уверен, возможно ли удалить или скрыть наложение с помощью окнаManager при нажатии кнопки возврата или дома.Возможно ли удалить наложение с помощью 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); 
    } 

ответ

2

Просто вам необходимо установить тип WindowManager к применению, этот способ WindowManager приложит взгляды в то время как приложение открыто, и нет необходимости накладывать домашние или обратные кнопки, проверить документы here

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

Удаление вид легко. Я заметил, что вы сделали его невидимым, это приемлемое решение. Вы также можете сохранить ссылку на него вокруг и сделайте следующее:

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> 
Смежные вопросы