32 votes

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 inférieur, vous pouvez créer une application en plein écran, puis "détourner" les boutons de menu/retour/recherche en renvoyant simplement false onKeyDown()... et en enregistrant l'application comme application de lancement 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 (System Bar) sont toujours présents, je voudrais les cacher. Est-ce possible ?

Pour votre information, je ne publie pas cette application sur l'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.

31voto

velazcod Points 759

Comme il n'est pas possible de le 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 l'utilisateur864555 l'a indiqué ci-dessous, voici 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 menu. Avec cette modification, vous gagnerez également l'espace de cette barre système. Mais assurez-vous d'avoir un bouton retour ou quelque chose pour sortir."

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


Mise à jour : Voici une troisième méthode. Un moyen de le faire par programme ou en utilisant la ligne de commande. Trouvée ici : http://Android.serverbox.ch/?p=306

Cette méthode nécessite un accès Root, mais vous n'avez pas besoin de changer la densité LCD, 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.

El article de blog montre également comment l'implémenter dans votre application Android, rappelez-vous qu'il faut être Root, et que ce n'est pas une bonne idée de le faire, sauf si votre application fonctionne sur un kiosque ou sur votre propre appareil. Veuillez ne pas implémenter cette méthode dans une application publiée sur le marché Android ou dans tout autre endroit public.

Pour arrêter/supprimer/désactiver la barre système (il faut être su avant de lancer cette commande) :

$ service call activity 79 s16 com.android.systemui

Pour restaurer la barre du système, il suffit de lancer cette commande :

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

C'est aussi simple que ça. Espérons que ICS sera bientôt publié avec le code source afin que tout le monde puisse créer Android pour nos tablettes Kiosk.

11voto

Romain Guy Points 57114

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

7voto

darkzagnel Points 542

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 xoom frais 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 menu. Avec cette modification, vous gagnerez également l'espace de cette barre de système, mais assurez-vous que vous avez un bouton de retour ou quelque chose pour sortir de votre application.

Editar:

Si vous avez des problèmes avec les fichiers en lecture seule, vous devez monter le fichier /system en lecture-écriture. Pour ce faire, utilisez cette commande dans le shell adb (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 en utilisant cette commande :

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

Editar:

Ces méthodes permettent d'afficher le clavier logiciel normalement lorsque cela est nécessaire.

1voto

darkzagnel Points 542

Voici le code associé à ma réponse précédente. Il cache automatiquement la barre d'état et la réaffiche une fois terminé. Important : pour la réafficher, 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 du nid d'abeille. C'est la seule solution que j'ai trouvée pour l'instant pour afficher à nouveau la barre d'état. Redémarrer SystemUI n'est pas suffisant. Et à cause de cela, votre application sera arrêtée lors du redémarrage de System_server.

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

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

0voto

AlexS Points 11

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 (niveau 11 de l'API).

Un peu de pseudocode :

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

La barre d'état sera masquée jusqu'à ce que l'utilisateur clique sur le 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 d'avoir spécifié targetSdkVersion="11" ou plus dans votre manifeste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X