web-dev-qa-db-fra.com

Existe-t-il un moyen de masquer la barre système dans Android 3.0? C'est un appareil interne et je gère la navigation

Dans Android 2.3 et ci-dessous, vous pouvez créer une application en plein écran, puis "détourner" les boutons de menu/retour/recherche en retournant simplement false onKeyDown () ... et en enregistrant l'application en tant que une application de lancement domestique par défaut, de cette façon, il n'y a aucun moyen de quitter l'application.

Dans Android 3.0 (Honeycomb) les boutons de navigation (Barre système) sont toujours présents, je voudrais le cacher. Est-ce possible?

Pour info, je ne publie pas cette application sur le Android Market. Il s'agit d'une application interne pour les appareils qui vont être utilisés en interne, j'ai besoin de sécuriser l'appareil.

32
velazcod

Vous ne pouvez pas masquer la barre système sur Android 3.0.

11
Romain Guy

Comme ce n'est pas possible de faire en utilisant une API publique, j'ai trouvé un moyen de le faire d'une manière très "hack-ish" qui nécessite un appareil rooté.

Mise à jour: comme indiqué par user864555 ci-dessous, c'est une autre solution

$ adb remount
$ adb Shell mv /system/app/SystemUI.odex /system/app/SystemUI.odexold
$ adb Shell mv /system/app/SystemUI.apk /system/app/SystemUI.apkold
$ adb reboot

"Ce code désactive l'application SystemUI qui est en fait la barre de menus. Avec cette modification, vous gagnerez également l'espace de cette barre système. Mais assurez-vous d'avoir un bouton de retour ou quelque chose pour quitter."

Cela fonctionne aussi très bien. Veuillez voter pour sa réponse. J'essaierai de garder celui-ci à jour autant que possible.


Mise à jour: Voici une troisième méthode. Une façon de le faire par programmation ou en utilisant la ligne de commande. Trouvé ici: http://Android.serverbox.ch/?p=306

Cette méthode nécessite un accès root, mais vous n'avez pas besoin de modifier la LCD densité, en gardant la même que l'original, et vous pouvez récupérer la barre de navigation de l'interface utilisateur très rapidement et facilement sans avoir à redémarrer à chaque fois.

Le article de blog montre également comment l'implémenter sur votre Android, rappelez-vous qu'il nécessite la racine, et ce n'est peut-être pas une bonne idée de le faire à moins que votre application ne soit fonctionnant sur un kiosque ou sur votre propre appareil, veuillez ne pas implémenter cette méthode sur une application publiée sur le marché Android ou publique).

Pour arrêter/supprimer/désactiver la barre système (vous devez être su avant d'émettre cette commande):

$ service call activity 79 s16 com.Android.systemui

Pour restaurer la barre système, exécutez simplement cette commande:

$ am startservice -n com.Android.systemui/.SystemUIService

C'est si facile. Espérons que ICS sera bientôt publié avec le code source afin que tout le monde puisse construire Android pour nos tablettes Kiosk.

31
velazcod

Si vous avez accès au fichier système, vous pouvez le faire (le mien est déverrouillé et enraciné, donc je ne suis pas sûr de ce dont vous avez besoin, je n'ai pas essayé avec un nouveau xoom d'usine):

adb Shell
cd /system/app/
mv SystemUI.odex SystemUI.odexold
mv SystemUI.apk SystemUI.apkold
exit
adb reboot

Ce code désactive l'application SystemUI qui est en fait la barre de menus. Avec cette modification, vous gagnerez également l'espace de cette barre système, mais assurez-vous que vous avez un bouton de retour ou quelque chose à quitter dans votre application.

Éditer:

Si vous rencontrez des problèmes avec le fichier en lecture seule, vous devez impérativement monter le /system répertoire en lecture-écriture. Pour ce faire, utilisez cette commande dans adb Shell (Source: http://forum.xda-developers.com/showthread.php?t=1159495&page=5 )

mount -o remount,rw /dev/block/stl6 /system

Vous pouvez le remonter en lecture seule à l'aide de cette commande:

mount -o remount,ro /dev/block/stl6 /system

Éditer:

Ces méthodes permettent au clavier logiciel d'être affiché normalement en cas de besoin.

7
darkzangel

Voici le code associé à ma réponse précédente. Il masque automatiquement la barre d'état et l'affiche à nouveau lorsque vous avez terminé. Important: pour l'afficher à nouveau, le code doit redémarrer system_server qui prend un certain temps pour redémarrer et pendant ce temps, vous verrez l'animation de démarrage en nid d'abeille. C'est le seul que je trouve pour l'instant à afficher à nouveau la barre d'état. Le redémarrage de SystemUI n'est pas suffisant. Et à cause de cela, il fermera votre application lors du redémarrage de system_server.

Ce code nécessite un système d'exploitation enraciné avec un superutilisateur installé sur.

package com.projects;

import Java.io.BufferedReader;
import Java.io.ByteArrayOutputStream;
import Java.io.DataOutputStream;
import Java.io.InputStreamReader;
import Java.io.PrintStream;

import Android.app.Activity;
import Android.app.AlertDialog;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TableLayout.LayoutParams;

// http://www.stealthcopter.com/blog/2010/01/Android-requesting-root-access-in-your-app/
public class FullScreenTestActivity extends Activity implements Button.OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try
        {
            Process p;
            p = Runtime.getRuntime().exec("su"); 

            // Attempt to write a file to a root-only
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n");
            os.writeBytes("mv /system/app/SystemUI.odex /system/app/SystemUI_Old.odex\n");
            os.writeBytes("mv /system/app/SystemUI.apk /system/app/SystemUI_Old.apk\n");
            os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n");

            // Close the terminal
            os.writeBytes("exit\n");
            os.flush();
            p.waitFor();

            new AlertDialog.Builder(this)
                .setIconAttribute(Android.R.attr.alertDialogIcon)
                .setMessage("Android Honeycomb StatusBar removed successfully!")
                .show();

            // Set action for exiting.
            Button cmdExit = new Button(this);
            cmdExit.setText("Exit");
            cmdExit.setOnClickListener(this);
            this.addContentView(cmdExit, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        }
        catch (Exception e)
        {
            ShowErrorGlobal(e);
        }
    }

    public void onClick(View v) {
        try
        {
            Process p;
            p = Runtime.getRuntime().exec("su"); 

            // Attempt to write a file to a root-only
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n");
            os.writeBytes("mv /system/app/SystemUI_Old.odex /system/app/SystemUI.odex\n");
            os.writeBytes("mv /system/app/SystemUI_Old.apk /system/app/SystemUI.apk\n");
            os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n");
            String systemServerPID = GetSystemServerPID();
            if (systemServerPID != null)
                os.writeBytes("kill " + systemServerPID + "\n");
            // else ... manual reboot is required if systemServerPID fail.

            // Close the terminal
            os.writeBytes("exit\n");
            os.flush();
            p.waitFor();
        }
        catch (Exception e)
        {
            ShowErrorGlobal(e);
        }
    }

    public String GetSystemServerPID()
    {
        try
        {
            Process p = Runtime.getRuntime().exec("ps -n system_server"); 
            p.waitFor();

            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            reader.readLine(); // Skip header.
            return reader.readLine().substring(10, 16).trim();
        }
        catch (Exception e)
        {
            return null;
        }
    }

    protected void ShowErrorGlobal(Exception e)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintStream stream = new PrintStream( baos );
        e.printStackTrace(stream);
        stream.flush();

        new AlertDialog.Builder(this)
            .setIconAttribute(Android.R.attr.alertDialogIcon)
            .setTitle("Epic fail")
            .setMessage("Error: " + new String( baos.toByteArray() ))
            .show();
    }
}
1
darkzangel

L'application HideBar peut être utilisée pour masquer la barre système sur les tablettes Android (HC, ICS, JB). Elle contient un mode kiosque optionnel qui peut être utilisé pour verrouiller descendez complètement les tablettes et aussi d'autres options comme un bouton de retour caché. C'est un logiciel GPL. Contactez le développeur (moi, voir email sur le site des applications) si cette application doit être installée en gros volumes.

0
ppareit

Pour ceux qui ont eu ce problème:

Si vous n'avez pas défini correctement Android: targetSdkVersion dans votre fichier AndroidManaifest.xml, setSystemUiVisibility n'a aucun effet (contrairement à d'autres API avancées qui fonctionnent, que la cibleSDKVersion ait été définie correctement ou non).

J'avais accidentellement laissé mon targetSdkVersion à 8. Le fait de le monter jusqu'à 16 a immédiatement causé à setSystemUIVisiblity l'effet désiré.

0
Robin Davies

Oui il est possible de le faire si vous avez un accès root sur l'appareil.

Ce code peut masquer et afficher la barre d'état en tuant son processus et en le rappelant.

package com.example.statusbar;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.Window;
import Android.view.WindowManager;
import Android.widget.Button;

public class MainActivity extends Activity {

    String commandToExecute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);

        commandToExecute = "/system/xbin/su";
        executeShellCommand(commandToExecute);

        Button btHideStatusBar = (Button) findViewById(R.id.buttonHide);
        Button btShowStatusBar = (Button) findViewById(R.id.buttonShow);


        btHideStatusBar.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                commandToExecute = "/system/xbin/su -c /system/bin/service call activity 42 s16 com.Android.systemui";
                executeShellCommand(commandToExecute);

            }
        });

    btShowStatusBar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            commandToExecute = "/system/xbin/su -c /system/bin/am startservice -n com.Android.systemui/.SystemUIService";
            executeShellCommand(commandToExecute);

        }
    });

    }

    private boolean executeShellCommand(String command) {
        try {

            Runtime.getRuntime().exec(command);

            return true;
        } catch (Exception e) {
            return false;

        }
    }


}
0
Machado

Bien que cela ne réponde pas à la question du "verrouillage" de l'écran, vous pouvez masquer la barre d'état sans être root en utilisant l'api setSystemUiVisibillity (API niveau 11).

Quelques pseudocodes:

public MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstance) {
        //...
        final View mainView = findViewById(R.id.you_main_view_id);
        mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);

        //Register a listener for when the status bar is shown/hidden:
        final Context context = getApplicationContext();
        mainView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener () {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility == View.SYSTEM_UI_FLAG_VISIBLE)) {
                    //Do stuff here...pause the video/game?
                } else {
                    //Do other stuff here..resume the video/game?
                }
            }
        });
    }
}

Cela masquera la barre d'état jusqu'à ce que l'utilisateur clique le long du bord inférieur de l'écran, auquel cas la barre d'état s'affichera (elle sera de nouveau masquée après quelques secondes).

Assurez-vous que vous avez spécifié targetSdkVersion = "11" ou supérieur dans votre manifeste.

0
AlexS

À partir de 4.4, vous pouvez le faire (cette question est très ancienne, mais revient toujours sur ce sujet):

setSystemUiVisibility (View.SYSTEM_UI_FLAG_IMMERSIVE)

https://developer.Android.com/training/system-ui/immersive.html

0
Dominic Cerisano