J'essaie de masquer la barre d'état du système sur un appareil Android 4.4. Ceci est pour un mode kiosque où mon application sera la seule application jamais exécutée sur l'appareil. L’appareil cible pour l’instant est un Nexus 7 2013.
L'appareil est enraciné et j'ai pu supprimer complètement la barre de navigation inférieure avec certaines informations de this post .
Pour la barre d'état supérieure, tout ce que j'ai essayé cache uniquement temporairement la barre. Si mes utilisateurs se déplacent en haut de l'écran, la barre d'état réapparaît. Je ne veux pas leur permettre de voir l'heure, d'obtenir les paramètres ou même de voir les notifications.
Messages que j'ai trouvés et déjà essayés:
Aucune suggestion?
Idéalement, j'aimerais pouvoir éditer build.prop pour le faire, car je le fais déjà pour la barre de navigation et je pourrais le faire en même temps. J'essaie de ne pas avoir à créer ma propre image Android.
Mettre à jour:
Après un peu plus de travail, cela semble dépendre un peu de la version exacte d’Android ou du périphérique sur lequel il tourne.
Certains périphériques, tels que la série Nexus sur laquelle je travaille, permettent à l'utilisateur de faire glisser le curseur pour faire réapparaître la barre.
Cependant, j'ai récemment essayé ceci sur un Verizon Eclipse, et la barre ne réapparaît pas, c'est ce que je recherchais.
Je cherche toujours une meilleure solution pour cibler tous les appareils, mais ce sera probablement créer ma propre version d'Android.
Nous n'avons pas pu empêcher le statut d'apparaître en mode plein écran sur les périphériques KitKat. Nous avons donc créé un hack qui convient toujours, c.-à-d. Que la barre d'état ne se développe pas.
Pour que cela fonctionne, l'application n'a pas été rendue en plein écran. Nous plaçons une superposition sur la barre d'état et utilisons tous les événements en entrée. Cela empêchait l'expansion du statut.
Remarque:
Mis à jour
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
implémentation customViewGroup 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);
J'espère que cela vous aide
Je sais que c'est une vieille question, mais j'espère que cela aidera quelqu'un. Voici deux appels très simples pour désactiver et activer la barre d’état que j’avais utilisée auparavant. Peut être utilisé à partir de la ligne de commande ou exécuté par une application Java:
Désactiver:
service call activity 42 s16 com.Android.systemui
Activer:
am startservice -n com.Android.systemui/.SystemUIService
I did try the workaround provided by @gonglong, but I wasn't happy with the result because of a flash in the UI as the workaround kicked in.
Instead, I was able to do this as root:
settings put secure user_setup_complete 0
I think on a normal device, this would cause the initial device setup to start, but on my devices, I've removed that APK from system so that doesn't happen.
This isn't documented anywhere I can find, but has a nice effect, where the top settings UI can't be dragged down. The notifications area can still be dragged down.
Another setting that I found useful was:
settings put global device_provisioned 0
This hides the Airplane Mode and Silent Mode options from the Power menu, which is an added bonus for my application.
There might be more side effects, but I've yet to find any that matter to me.
This list was taken from a Nexus 7 2013 LTE running brand new Android 4.4.3 (KTU84L). The number in square brackets is the value when I pulled the db file, which was after basic setup device setup and enabling developer/USB, but before making any other changes in settings
This file was found at data/data/com.android.providers.settings/databases/settings.db
Note: Some URLS required adding an extra space character to bypass SO filters
system
namespaceglobal
namespacesecure
namespaceJ'ai utilisé cette réponse pour masquer les touches programmables: https://stackoverflow.com/a/27003890/1525867
Et pour désactiver la StatusBar (cela pourrait endommager votre appareil, alors faites-le avec précaution. J'ai ruiné mon appareil plusieurs fois avant de le faire) Testé sur Asus Tinker Board, Android 6:
path
de votre façon préféréeextraire SystemUI.apk
de votre appareil: adb pull /system/priv-app/SystemUI/SystemUI.apk
le chemin d'accès à SystemUI.apk
peut être différent
extraire framework-res.apk
de votre appareil adb pull /system/framework/framework-res.apk
le chemin d'accès à framework-res.apk
peut être différent
exécuter apktool if framework-res.apk
exécuter apktool if SystemUI.apk
exécuter apktool d SystemUI.apk
Ouvrez SystemUI\res\layout\status_bar.xml
et ajoutez Android:visibility="gone"
au dernier élément xml (pour moi, c'était com.Android.systemui.statusbar.phone.PhoneStatusBarView
)
exécuter apktool b SystemUI
Allez à SystemUI\original
et copiez AndroidManifest.xml
et META-INF
dans SystemUI\build\apk\
relancez apktool b SystemUI
Allez à SystemUI\dist\
et remplacez le SystemUI.apk
d'origine du périphérique par celui qui est à SystemUI\dist\SystemUI.apk
par adb Push SystemUI\dist\SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
.
Redémarrer l'appareil
Basé sur ce fil de discussion https://forum.xda-developers.com/showthread.php?t=2203166
Une excellente solution que j'ai trouvée pour ce problème, attribuant à chaque activité theme
& windowSoftInputMode
les valeurs suivantes:
<activity Android:name=".MyActivity"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
Android:windowSoftInputMode="adjustResize"> <!-- theme : to set the activity to a full screen mode without a status bar(like in some games) -->
</activity> <!-- windowSoftInputMode : to resize the activity so that it fits the condition of displaying a softkeyboard -->
pour plus d'informations référez-vous ici .
Je n'ai pas de solution parfaite mais une solution de contournement ici. L'idée de base est d'écouter les changements d'état du système et de forcer la navigation/la barre d'état comme étant invisibles. Son effet est similaire à celui défini pour le mode IMMERSIVE_STICKY mais la barre de navigation/statut disparaît plus rapidement que IMMERSIVE_STICKY.
c'est ici:
définir le style de l'interface utilisateur dans onCreate () et sur la fonction onResume, et définir le système d'écoute du changement d'écoute
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
mDecroView.setOnSystemUiVisibilityChangeListener(this);
force la barre système comme invisible dans onSystemUiVisibilityChange, définissant le système quelques secondes plus tard, sinon cela prend effet (ne sait pas exactement pourquoi, le système ignore simplement la demande de configuration du système lorsque la barre système n'a pas encore été complétée)
public void onSystemUiVisibilityChange(int visibility) {
// TODO Auto-generated method stub
Log.d(TAG, "onSystemUiVisibilityChange called with visibility " + visibility);
if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0){
if(null == mHandler){
mHandler = new MyHandler();
}
if(null != mHandler){
mHandler.removeMessages(MSG_HIDE_SYSTEM_BAR);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_BAR, 50);
}
//the deccro view is not in full screen
Log.d(TAG, "setSystemUiVisibility");
Log.d(TAG, "current system ui is " + mDecroView.getSystemUiVisibility());
}
}
alors vous pouvez configurer le système comme ceci:
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case MSG_HIDE_SYSTEM_BAR:
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
break;
}
}
ajoutez ceci avant: setContentView (R.layout.x);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.x);