2015-11-06 2 views
6

Я видел приложения Kioware и SureLock. Они просто блокируют каждый элемент управления в планшете. Я знаю об обратной кнопке возврата и обработке домашних и недавних параметров задачи. Но я не уверен, как им удалось управлять настройкой на системной панели. Настройки отображаются в течение нескольких секунд, а затем исчезают. Точно так же должна быть блокирована панель состояния мобильного телефона, которая появляется при ударе.Block/Disable Statusbar в Android-планшете/мобильном телефоне

Если у кого-нибудь есть идея, поделитесь им. Любые рекомендации/помощь приветствуются.

See the attached image selected portion which I need to block/disable

+0

Были ли у вас недавние задания на леденец? Поскольку это будет проблемой для вас, я уже пережил этот тип ситуации. – Androider

+0

@ Аndroid это не проблема. Я ищу параметр настройки. Это полностью отключено в приложении surelock. У вас есть представление об этом? –

+0

добавить вид на системный бар – Androider

ответ

0

Наконец-то я нашел решение вышеуказанной проблемы. onWindowFocus change Я только что закрыл диалоговые окна, созданные системой, и моя проблема была решена. ниже приведен пример кода.

@Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     if(!hasFocus) 
     {// Close every kind of system dialog 
      Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
      sendBroadcast(closeDialog); 

     } 

    } 

Update:

В Mobile, чтобы заблокировать строку состояния, которые появляются на взмахе вниз на использовании экрана ниже способом.

private Handler collapseNotificationHandler; 
      @Override 
      public void onWindowFocusChanged(boolean hasFocus) { 
       boolean currentFocus = hasFocus; 
       if (!hasFocus) { 
        collapseNow(true,currentFocus); 

       } 

      } 


    public void collapseNow(final boolean shouldCollapse, final boolean currentFocus) { 

       // Initialize 'collapseNotificationHandler' 
       if (collapseNotificationHandler == null) { 
        collapseNotificationHandler = new Handler(); 
       } 

       // If window focus has been lost && activity is not in a paused state 
       // Its a valid check because showing of notification panel 
       // steals the focus from current activity's window, but does not 
       // 'pause' the activity 
       if (!currentFocus && !isPaused) { 

        // Post a Runnable with some delay - currently set to 50 ms 
        collapseNotificationHandler.postDelayed(new Runnable() { 

         @Override 
         public void run() { 

          // Use reflection to trigger a method from 'StatusBarManager'     

          Object statusBarService = getSystemService("statusbar"); 
          Class<?> statusBarManager = null; 

          try { 
           statusBarManager = Class.forName("android.app.StatusBarManager"); 
          } catch (ClassNotFoundException e) { 
           e.printStackTrace(); 
          } 

          Method collapseStatusBar = null; 

          try { 

           // Prior to API 17, the method to call is 'collapse()' 
           // API 17 onwards, the method to call is `collapsePanels()` 

           if (Build.VERSION.SDK_INT > 16) { 
            collapseStatusBar = statusBarManager.getMethod("collapsePanels"); 
           } else { 
            collapseStatusBar = statusBarManager.getMethod("collapse"); 
           } 
          } catch (NoSuchMethodException e) { 
           e.printStackTrace(); 
          } 

          collapseStatusBar.setAccessible(shouldCollapse); 

          try { 
           collapseStatusBar.invoke(statusBarService); 
          } catch (IllegalArgumentException e) { 
           e.printStackTrace(); 
          } catch (IllegalAccessException e) { 
           e.printStackTrace(); 
          } catch (InvocationTargetException e) { 
           e.printStackTrace(); 
          } 

          // Check if the window focus has been returned 
          // If it hasn't been returned, post this Runnable again 
          // Currently, the delay is 50 ms. You can change this 
          // value to suit your needs. 
          if (!currentFocus && !isPaused) { 
           collapseNotificationHandler.postDelayed(this, 50); 
          } 

         } 
        }, 0); 
       } 
      } 

"isPaused" boolean, который устанавливает true, когда приложение находится в состоянии паузы.

2

Вы можете попробовать добавить прозрачный View в desidered положении с помощью WindowManager (следуйте this пример). Таким образом, вы будете перехватить любые события события от пользователя.

Обязательно установить соответствующие флаги/тип, потому что вам нужно наложить системные бары:

WindowManager.LayoutParams dismissParams = new WindowManager.LayoutParams(
         viewWidth, 
         viewHeight, 
         WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, //you can also try with TYPE_SYSTEM_OVERLAY, TYPE_SYSTEM_ERROR 
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
         PixelFormat.TRANSPARENT); 
+0

Раньше я попытался добавить представление так, как вы описали, но этот вид не подходит к системной панели. –

+0

@NareshSharma Вы пытались использовать TYPE_SYSTEM_OVERLAY? – bonnyz

+0

Не работает с этим флагом. –

3

Хитрость заключается в том, чтобы добавить прозрачный пользовательский вид, что накладки на системной панели, что так как все пользовательские взаимодействия, такие как touch, drag, будут потребляться пользовательским представлением.

Вот рабочий код:

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

statusBarOverlay = new CustomViewGroup(this); 

final WindowManager.LayoutParams localLayoutParams = 
     new WindowManager.LayoutParams(); 

localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 
localLayoutParams.gravity = Gravity.TOP; 
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 

     // this is to enable the notification to receive touch events 
     WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 

     // Draws over status bar 
     WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 

localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; 
localLayoutParams.height = 
    (int) (50 * getResources().getDisplayMetrics().scaledDensity); 
localLayoutParams.format = PixelFormat.TRANSPARENT; 

windowManager.addView(statusBarOverlay, localLayoutParams); 

Пользовательские ViewGroup:

public class CustomViewGroup extends ViewGroup { 

     public CustomViewGroup(Context context) { 
      super(context); 
     } 

     @Override 
     protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      return true; 
     } 
    } 

Я сам сделал замок функцию мое приложение, хотя я отделил функцию стопорного в другое приложение по многим причинам , Вы можете запросить дополнительную информацию, и я положу их здесь, если это необходимо.

 Смежные вопросы

  • Нет связанных вопросов^_^