2014-11-11 3 views
2

Я пытаюсь придумать некоторые способы отключения строки состояния, не скрывая ее полностью. Это попытка интроиды отключить строки состояния в сторонних приложениях. На данный момент я хочу отключить его в своем приложении, а затем создать фоновый сервис, чтобы узнать, могу ли я сделать это в других приложениях. Приложение, которое я создаю, является операционной системой для детей, и я пытаюсь разработать закрытую систему.Закрыть панель состояния при открытии: Android

Вот что я пробовал. Моя первоначальная идея состояла в том, чтобы следить за доступом к строке состояния, а затем ее закрытием.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    Log.i(TAG, "onWindowFocusChanged()"); 
    try { 
     if (!hasFocus) { 
      Log.d(TAG, "close status bar attempt"); 
      Object service = getSystemService("statusbar"); 
      Class<?> statusbarManager = Class 
        .forName("android.app.StatusBarManager"); 
      Method collapse = statusbarManager.getMethod("collapse"); 
      collapse.setAccessible(true); 
      collapse.invoke(service); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Это метод, который я использовал. Он работает для обнаружения при доступе к строке состояния, однако он не закрывает панель состояния после того, как она имеет фокус. Что мне не хватает? Заранее спасибо.

ответ

4

Я нашел ответ на свой вопрос. Во-первых, мне не было получено такого разрешения.

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

С таким разрешением теперь работает очень хорошо.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    Log.i(TAG, "onWindowFocusChanged()"); 
    try { 
     if (!hasFocus) { 
      Log.d(TAG, "close status bar attempt"); 
      //option 1 
      int currentApiVersion = android.os.Build.VERSION.SDK_INT; 
      Object service = getSystemService("statusbar"); 
      Class<?> statusbarManager = Class 
        .forName("android.app.StatusBarManager"); 

      if (currentApiVersion <= 16) { 
       Method collapse = statusbarManager.getMethod("collapse"); 
       collapse.setAccessible(true); 
       collapse.invoke(service); 
      } else { 
       Method collapse = statusbarManager.getMethod("collapsePanels"); 
       collapse.setAccessible(true); 
       collapse.invoke(service); 
      } 
      // option 2 
      Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
      mContext.sendBroadcast(it); 

     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Если вы заметили, есть и второй вариант, который, как мне показалось, работает хорошо. Вы можете прокомментировать вариант 1, если хотите использовать вариант 2 или наоборот. Оба выполняют одно и то же, хотя я считаю, что вариант 2 лучше.

Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
mContext.sendBroadcast(it); 

Единственное падение, которое я обнаружил, это то, что при закрытии он медленно (er). Однако оба метода быстро свертываются до тех пор, пока никто не сможет щелкнуть любые уведомления или параметры в строке состояния. Надеюсь, это поможет кому-то другому. Удачи, Привет!

+0

Что именно это делает? Если я правильно понял этот код, как только пользователь попытается получить доступ к строке состояния, он сразу же рухнет? – qazimusab

+0

Да, это именно то, что он делает. Теперь я могу создать фоновое обслуживание с этим кодом коллапса, и, надеюсь, строка состояния рухнет, даже если пользователь использует стороннее приложение. Помните, что мое приложение - это приложение для запуска (операционная система). Это будет большой кусочек головоломки для создания закрытой системы, в которой пользователь не может пойти туда, где им не разрешено. – portfoliobuilder

+0

Я также работаю над закрытым киоском, и я собираюсь пройти гораздо более длинный маршрут. Мое приложение также является программой запуска. Закрывает ли строка состояния достаточно быстро, чтобы пользователь не мог быть изящным и быстро нажимать настройки или что-то еще? Это тоже будет полезно для меня, и я, вероятно, включу это в свое приложение, если это будет легко. Используете ли вы этот код в службе? – qazimusab

1

Я также работаю над тем же. С Android 5.0 Lolipop они выпустили режим Screen Закрепление (который, по существу, в режиме киоска), который делает несколько вещей:

  • Строка состояния является пустым, и уведомления пользователя и информация о состоянии скрыты.
  • Кнопки Home и Recent Apps скрыты.
  • Другие приложения не могут запускать новые действия.
  • Текущее приложение может запускать новые действия, если это не создает новых задач.
  • Когда экранное нажатие вызывается владельцем устройства, пользователь остается заблокированным для вашего приложения, пока приложение не вызовет stopLockTask().
  • Если привязка экрана является действием другого приложения, которое не является владельцем устройства или пользователем напрямую, пользователь может выйти, удерживая кнопки «Назад» и «Недавние».

Вы можете прочитать об этом дальше в Android 5.0 Lolipop release documentation.

Однако, если вы ищете более управляемое решение, вы можете создать пользовательский ПЗУ. Вот краткий обзор создания приложений для киосков (которые также требуют отключения строки состояния).

Developing Kiosk Mode Applications in Android Tutorial

+0

Отличный ответ. Я рассмотрю это. Меня беспокоит то, что я должен сделать это для совместимости с API 16. На данный момент эта методология работает хорошо. Это просто непоследовательно, иногда оно быстро закрывается, в других случаях оно происходит медленно. – portfoliobuilder

0

Вот обновленный ответ, если кто-то до сих пор ищет решение что-то вроде этого: https://developer.android.com/training/system-ui/immersive.html

Для меня, я добавил следующее в моем onResume методе():

View decorView = getWindow().getDecorView(); 
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
    decorView.setSystemUiVisibility(uiOptions); 

Это позволяет панели состояния оставаться скрытой, но пользователь может получить к ней доступ, прокручивая край экрана. Затем, после нескольких секунд бездействия, он снова рухнет и снова исчезнет!