5 votes

Activer la navigation à l'écran dans CM12 (Lollipop) en utilisant le shell ?

Dispositif : OnePlus One (OPO) ; fonctionne avec CM12, est enraciné, et a Xposed Framework installé.


Je dois activer Navigation à l'écran (il désactive les touches matérielles (HW) et affiche les touches programmables à l'écran ; comme par exemple este ) dans OPO. Je suis capable de le faire via Paramètres mais mon objectif nécessite une solution en ligne de commande via le shell.

(Notez que ce n'est pas une question de développement/programmation, simplement une question sur Android).

  • Objectif : Pour désactiver la touche Back(HW) lorsque l'activité principale d'une app (aléatoire) est au premier plan, mais sans redémarrage.

  • J'ai trouvé que la navigation à l'écran était un bon choix qui ne nécessite pas de redémarrage. Je vais utiliser une application d'automatisation pour déclencher l'action de désactivation.

  • Il existe des moyens manuels de désactiver les touches HW (en éditant .kl et d'activer les touches programmables (en modifiant les fichiers build.prop ), ou en utilisant des outils comme les modules Xposed pour désactiver ou échanger les touches HW. Mais ils nécessitent tous un redémarrage (soft/hard) au moins une fois. que je ne peux pas me permettre.

  • J'ai expérimenté et constaté que lorsque la navigation à l'écran est activée, la valeur de l'option dev_force_show_navbar les changements apportés à 1 de 0 . De même. button_brightness les changements apportés à 0 de 255 . Les deux noms sont sous Settings.db (Tableau : secure )

  • De plus, il n'y a pas d'activité spéciale assignée pour Réglages → Boutons (il active la navigation à l'écran). J'ai utilisé dumpsys activity | grep mFocusedActivity pour voir l'activité liée à Boutons . Le résultat a été :

    com.android.settings/.SubSettings
  • dumpsys activity activities o dumpsys activity recents n'a également rien de plus à dire ici.

  • J'ai enregistré mes actions en utilisant logcat lors de l'activation de la navigation à l'écran et ici est le fichier journal.

Donc, comment activer la navigation à l'écran via la ligne de commande, qu'elle nécessite ou non un accès super utilisateur ?

Editar : Y a-t-il un autre la manière dont je peux atteindre l'objectif avec précision ?


La seule chose qui me vient à l'esprit est d'utiliser <code>input <keyevent></code> mais c'est contre-productif pour moi. L'autre moyen est de déclencher un module Xposed comme <strong>Ajouts Xposed </strong>mais je ne parviens pas à l'utiliser avec le shell.

0 votes

Je sais qu'il est possible de l'activer dans le build.prop, mais il suffit d'ajouter ceci à la fin : qemu.hw.mainkeys=0

0 votes

@SuperThomasLab Merci de le mentionner explicitement, mais comme je l'ai déjà mentionné dans la question, il faut le redémarrer pour qu'il prenne effet que je ne peux pas me permettre.

0 votes

Désolé, je ne l'avais pas remarqué, vous pouvez peut-être le décompiler. settings et de voir comment ils procédaient à l'époque.

4voto

J'ai expérimenté et constaté que lorsque la navigation à l'écran est activée, la valeur de l'option dev_force_show_navbar les changements apportés à 1 de 0 ... Les deux noms sont sous Settings.db (Tableau : secure ).

Vous avez en fait mentionné la clé de la réponse mais, d'une manière ou d'une autre (je suppose), vous n'avez pas su comment l'utiliser. Merci beaucoup à Andrew T. y DavisNT pour cette réponse puisque cela mènerait à une solution pour votre problème.

Je suis moi-même propriétaire d'un OnePlus One fonctionnant sous CM12, vous pouvez donc vous attendre à une réponse fonctionnelle.

De la coquille, que ce soit adb ou un Application Terminal ou Tasker's Dans l'action "Run Shell", entrez la commande suivante avec les privilèges de Root :

settings put secure dev_force_show_navbar 1

Vous verrez alors que la barre de navigation à l'écran est activée, comme sur la photo que vous avez postée. ici .

Ne vous inquiétez pas pour button_brightness puisque les changements de sa valeur seraient reflétés automatiquement par la commande ci-dessus.

J'ai testé cette commande dans Tasker en exécutant manuellement l'action "Code -> Run Shell -> commande "avec "Use Root", et ça marche bien.

Les modifications sont exactement les mêmes que celles effectuées à partir de "Paramètres -> Boutons", donc rien à craindre. seules les touches logicielles sont visibles et les touches matérielles sont désactivées. . La partie la plus cool pas de redémarrage nécessaire.

Vous pouvez revenir en arrière en utilisant 0 à la place de 1 dans le commandement susmentionné.

0 votes

Est-ce que cela fonctionne uniquement sur CyanogenMod, ou également sur les ROMs stock ?

0 votes

@SuperThomasLab Pour l'instant, j'ai essayé uniquement la version CM12 (Cyanogen OS 12, ROM stockée pour le OnePlus One). Cela dépend de settings.db . Si les caractéristiques de la ROM de stock diffèrent, la solution risque de ne pas fonctionner.

0 votes

J'aimerais que les lecteurs notent que dans d'autres ROMs personnalisées, le tableau system possède cette valeur clé, la commande serait donc settings put system dev_force_show_navbar 1

0voto

Thomas Vos Points 3772

Il n'y a pas de solution à votre question. Toutes les façons de faire nécessitent un redémarrage, à l'exception de la méthode Settings pour Cyanogenmod. J'ai jeté un coup d'oeil à la code source de Cyanogenmod comment ils ont réussi à le faire fonctionner, et j'ai trouvé ça :

C'est la méthode qui permet d'activer/désactiver la barre de navigation :

(Désolé si c'est hors sujet, je voulais ajouter ceci au cas où d'autres personnes seraient intéressées)

private static void writeDisableNavkeysOption(Context context, boolean enabled) {
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    final int defaultBrightness = context.getResources().getInteger(
            com.android.internal.R.integer.config_buttonBrightnessSettingDefault);

    Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.DEV_FORCE_SHOW_NAVBAR, enabled ? 1 : 0);
    CmHardwareManager cmHardwareManager = (CmHardwareManager) context.getSystemService(Context.CMHW_SERVICE);
    cmHardwareManager.set(CmHardwareManager.FEATURE_KEY_DISABLE, enabled);

    /* Save/restore button timeouts to disable them in softkey mode */
    SharedPreferences.Editor editor = prefs.edit();

    if (enabled) {
        int currentBrightness = Settings.Secure.getInt(context.getContentResolver(),
                Settings.Secure.BUTTON_BRIGHTNESS, defaultBrightness);
        if (!prefs.contains("pre_navbar_button_backlight")) {
            editor.putInt("pre_navbar_button_backlight", currentBrightness);
        }
        Settings.Secure.putInt(context.getContentResolver(),
                Settings.Secure.BUTTON_BRIGHTNESS, 0);
    } else {
        int oldBright = prefs.getInt("pre_navbar_button_backlight", -1);
        if (oldBright != -1) {
            Settings.Secure.putInt(context.getContentResolver(),
                    Settings.Secure.BUTTON_BRIGHTNESS, oldBright);
            editor.remove("pre_navbar_button_backlight");
        }
    }
    editor.commit();
}

Comme vous pouvez le voir, il utilise android.hardware.CmHardwareManager et ces trucs sont codés en dur dans la ROM et il n'est pas possible de les faire soi-même.

Edit : Il existe une solution à cette question. Regardez la réponse acceptée. Je l'avais déjà dans ma réponse :

Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.DEV_FORCE_SHOW_NAVBAR, enabled ? 1 : 0);

0 votes

Bonjour SuperThomasLab , cette réponse semble suffire à ce que j'avais l'intention de savoir. Nous pensions tous les deux que l'objectif ne serait peut-être pas possible à atteindre, mais c'est possible. Jetez-y un coup d'œil :)

1 votes

@Firelord tu l'avais dans ta réponse, et je l'avais dans ma réponse... Pourquoi ne l'avons-nous pas vu :)

-2voto

Aniket Lamba Points 1

Ce que je peux suggérer, c'est d'installer Boîte de gravité et activez la barre de navigation à partir de là.

0 votes

En quoi Gravitybox est-il utile, d'autant plus que le développeur a précisé qu'il n'était pas destiné aux ROMs de type CM ?

0 votes

Gravitybox fonctionne bien sur ma ROM basée sur CM12.1.

0 votes

GravityBox est un module Xposed et l'appareil doit toujours être redémarré au moins une fois. D'ailleurs, comment l'utiliser avec le shell ?

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X