webentwicklung-frage-antwort-db.com.de

Statusleiste für die Anzeige von Android verhindern (geändert)

Ich implementiere eine Kioskmodusanwendung, und ich habe die Anwendung im Vollbildmodus ohne Statusleiste nach 4.3 erstellt. Die Statusleiste kann jedoch nicht in 4.3 und 4.4 ausgeblendet werden, da die Statusleiste angezeigt wird, wenn wir oben am Bildschirm nach unten streichen.

Ich habe versucht, es auf dem ganzen Bildschirm zu machen

  • festlegen des Vollbild-Themas im Manifest
  • einstellungsfenster Flags dh SetFlags
  • setSystemUiVisibility

Mögliches Duplikat, aber keine konkrete Lösung gefunden

Android Statusleiste dauerhaft ausblenden

Schließlich möchte ich die Statusleiste in einer Aktivität dauerhaft ausblenden? in Android 4.3.4.4,5,6versionen 

25
Abhimaan

Wir konnten nicht verhindern, dass der Status im Vollbildmodus in KitKat-Geräten angezeigt wird. Daher wurde ein Hack erstellt, der der Anforderung entspricht, dh die Statusleiste kann nicht erweitert werden.

Damit dies funktioniert, wurde die App nicht im Vollbildmodus erstellt. Wir überlagerten eine Statusleiste und nahmen alle Eingabeereignisse auf. Der Status konnte nicht erweitert werden.

Hinweis:

  • customViewGroup ist eine benutzerdefinierte Klasse, die jedes Layout (Frame, relatives Layout usw.) erweitert und das Berührungsereignis beansprucht. 
  • um das berührungsereignis zu nutzen, überschreiben Sie die onInterceptTouchEvent-Methode der Ansichtsgruppe und geben Sie true zurück

Aktualisierte

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/> 

customViewGroup-Implementierung

Code:

WindowManager manager = ((WindowManager) getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));

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

    customViewGroup view = new customViewGroup(this);

    manager.addView(view, localLayoutParams);
85
Abhimaan

In Android M müssen Sie eine zusätzliche Berechtigung zum Erstellen von Überlagerungen erhalten. Android.permission.SYSTEM_ALERT_WINDOW reicht nicht aus! Also habe ich den Code aus der Antwort von Abhimaan innerhalb von disableStatusBar() verwendet und musste den richtigen Einstellungsdialog öffnen. Ich habe auch die Ansicht zum Entfernen in onDestroy() hinzugefügt, um die Statusleiste zu aktivieren, wenn die App beendet wird. Ich habe auch die Überlagerungshöhe auf 40 reduziert, da es genug scheint. Code funktioniert hier mit 5.1 und 6.0.

public static final int OVERLAY_PERMISSION_REQ_CODE = 4545;
protected CustomViewGroup blockingView = null;

@Override
protected void onDestroy() {

    super.onDestroy();

    if (blockingView!=null) {
        WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
        manager.removeView(blockingView);
    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {

        if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            if (!Settings.canDrawOverlays(this)) {
                Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
            } else {
                disableStatusBar();
            }
        }
        else {
            disableStatusBar();
        }
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            Toast.makeText(this, "User can access system settings without this permission!", Toast.LENGTH_SHORT).show();
        }
        else
        { disableStatusBar();
        }
    }
}

protected void disableStatusBar() {

    WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));

    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) (40 * getResources().getDisplayMetrics().scaledDensity);
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    blockingView = new CustomViewGroup(this);
    manager.addView(blockingView, localLayoutParams);
}
17
Alexey Ozerov

Für ein Projekt, an dem ich arbeitete, hatte ich eine Lösung dafür gefunden, aber es dauerte lange. Verschiedene Threads in Stackoverflow und anderswo haben mir dabei geholfen. Es war eine Arbeit an Android M, aber es hat perfekt funktioniert. Da jemand danach gefragt hat, dachte ich, ich sollte es hier posten, wenn es jemandem nützen kann.

Jetzt, da es eine Weile her ist, kann ich mich nicht an alle Details erinnern, aber die CustomViewGroup ist die Klasse, die die Haupt-ViewGroup überschreibt und erkennt, dass ein Benutzer von oben nach oben gezogen hat, um die Statusleiste anzuzeigen. Wir wollten es jedoch nicht zeigen, also wurde der Abbruch des Benutzers erkannt und alle weiteren Aktionen ignoriert, d. H. Das Android-Betriebssystem erhält kein Signal, um die verborgene Statusleiste zu öffnen.

Außerdem sind die Methoden zum Anzeigen und Ausblenden der Statusleiste enthalten, die Sie wie in Ihrem Code kopieren/einfügen können, wo Sie die Statusleiste anzeigen oder ausblenden möchten.

/**
 * This class creates the overlay on the status bar which stops it from expanding.
 */
public static 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) {
        Log.v("customViewGroup", "********** Status bar swipe intercepted");
        return true;
    }
}

public static void allowStatusBarExpansion(Context context) {
    CustomViewGroup view = new CustomViewGroup(context);
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));
    manager.removeView(view);
}

// Stop expansion of the status bar on swipe down.
public static void preventStatusBarExpansion(Context context) {
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));

    Activity activity = (Activity) context;
    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;
    //http://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels
    int resId = activity.getResources().getIdentifier("status_bar_height", "dimen", "Android");
    int result = 0;
    if (resId > 0) {
        result = activity.getResources().getDimensionPixelSize(resId);
    }

    localLayoutParams.height = result;

    localLayoutParams.format = PixelFormat.TRANSPARENT;

    CustomViewGroup view = new CustomViewGroup(context);

    manager.addView(view, localLayoutParams);
}
0
zeeshan