2015-11-06 17 views
6

Ich habe Kioware und SureLock-Anwendungen gesehen. Sie blockieren einfach jede Kontrolle in Tabletten. Ich bin mir bewusst über die Zurück-Schaltfläche und die Handhabung der Home-und letzten Task-Optionen. Aber ich bin mir nicht sicher, wie sie die Einstellungsoption in der Systemleiste steuern konnten. Einstellungen werden für einen Bruchteil von Sekunden angezeigt und verschwinden dann. In gleicher Weise muss die Statusleiste von Mobile, die beim Wischen angezeigt wird, blockiert werden.Blockieren/Deaktivieren Statusleiste in Android Tablet/Handy

Wenn jemand eine Idee dazu haben, teilen Sie es bitte. Jede Anleitung/Hilfe wird geschätzt.

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

+0

Haben Sie kürzlich Aufgaben in Lollipop bekommen? Weil das auch ein Problem für dich sein wird, habe ich diese Art von Situation bereits durchgemacht. – Androider

+0

@Androider das ist kein Problem. Ich suche nach der Einstellungsoption. Das ist in der Surelock App komplett deaktiviert. Hast du eine Ahnung davon? –

+0

Ansicht über Systemleiste hinzufügen – Androider

Antwort

0

Endlich fand ich die Lösung des obigen Problems. onWindowFocus change Ich habe gerade die systemgenerierten Dialoge geschlossen und mein Problem wurde gelöst. Unten ist der Beispielcode.

@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:

im Bereich Mobile die Statusleiste zu blockieren, die auf Swipe nach unten auf dem Bildschirm Verwendung unten Art und Weise angezeigt werden.

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 die wahr gesetzt, wenn app im Pause-Zustand ist.

2

Sie können versuchen, eine transparente View bei desidered Position hinzufügen mit dem WindowManager (folgen this Beispiel). Auf diese Weise werden Sie alle Tipp-Ereignisse vom Benutzer abfangen.

Achten Sie darauf, stellen Sie die richtigen Flags/Typ, weil Sie die System Bars zu überlagern müssen:

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

Früher habe ich versucht, die Ansicht so hinzuzufügen, wie Sie es beschrieben haben, aber diese Ansicht wird nicht über die Systemleiste angezeigt. –

+0

@NareshSharma Hast du es mit TYPE_SYSTEM_OVERLAY versucht? – bonnyz

+0

Funktioniert auch nicht mit dieser Flagge. –

3

Der Trick, um ist transparent benutzerdefinierte Ansicht hinzufügen, die auf der Systemleiste Overlays, dass So wie alle Benutzerinteraktionen wie Berühren, Ziehen wird von der benutzerdefinierten Ansicht konsumiert werden.

ist hier ein Arbeitscode:

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); 

Individuelle 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; 
     } 
    } 

Ich selbst habe Hemmung zu meiner app getan, obwohl ich die Sperrfunktion in eine andere App aus vielen Gründen getrennt haben . Sie können nach mehr Informationen fragen und ich werde sie hierhin mitnehmen.

Verwandte Themen