Android — показать/скрыть системную панель в версии 4.2.2 (Nexus 10)

У меня проблема с Nexus 10 - 4.2.2. Я тестировал приведенный ниже код на Galaxy Tab 10.1 с 4.0.4, и он работал нормально:

try 
{
    Process proc = Runtime.getRuntime().exec(new String[]{"sh","startservice","-n","com.android.systemui/.SystemUIService"});
    proc.waitFor();
} 
catch (Exception e) 
{
    e.printStackTrace();
}

try
{
    //REQUIRES ROOT
    Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 42 s16 com.android.systemui"}); //WAS 79
    proc.waitFor();
}
catch(Exception ex)
{
    //Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
}

Но на Nexus 10 системная панель после этого не будет отображаться, просто скроется.


person goodm    schedule 26.02.2013    source источник
comment
Я не понимаю, что вы говорите: S, пожалуйста, поработайте над грамматикой (кто-нибудь?)   -  person Warpzit    schedule 27.02.2013
comment
неважно, я просто нашел решение.   -  person goodm    schedule 27.02.2013
comment
@goodm Я столкнулся с той же проблемой, можете ли вы обновить код, как решить эту проблему ..   -  person kumar Sudheer    schedule 02.04.2013
comment
@kumarsu мой код ниже   -  person goodm    schedule 10.04.2013


Ответы (3)


Чтобы показать и скрыть системную панель и панель уведомлений на 4.2.2 и других:

Скрывать:

    try
    {
        String command;
        command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
        proc.waitFor();
    }
    catch(Exception ex)
    {
        Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
    }

Показывать:

    try 
    {
         String command;
         command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService";
         Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
         proc.waitFor();
    } 
    catch (Exception e) 
    {
          e.printStackTrace();
    }
person goodm    schedule 27.02.2013
comment
Для этого требуется рут? - person yosh m; 21.07.2013
comment
Как инициализируется envp? Можно ли использовать версию без envp? - person Aharon Manne; 21.07.2013
comment
Есть ли какие-либо разрешения, которые нам нужно добавить в манифест? Также нам нужно установить этот APK в системный каталог для работы? Я пробую этот код на kitkat на корневом устройстве, и, похоже, он не работает. Я просто получаю IOException - person Punit Raizada; 15.08.2014
comment
Да, для этого нужен рут. - person Neromancer; 30.04.2015

Я думаю, что вы не должны использовать системные вызовы через Runtime.exec() для получения такого результата. Вы должны посмотреть код в шаблоне FullscreenActivity (исходники размещены в <android-sdk-folder>/tools/templates/activities/FullscreenActivity/root): это полный рабочий пример, показывающий, как отображать/скрывать системные панели (как верхнюю, так и нижнюю) программно, и он даже поддерживает анимацию для API 13+.

person a.bertucci    schedule 27.02.2013
comment
После обновления, если вы используете Eclipse+ADT, вы можете использовать мастер шаблонов для создания этого образца действия в своем проекте Android: меню File>New>Android>Android Object>Fullscreen Activity - person a.bertucci; 27.02.2013
comment
Не волнуйтесь, с этим шагом я справлюсь ;) - person goodm; 27.02.2013
comment
Извините, может быть, немного перестарался, я знаю :) - person a.bertucci; 27.02.2013
comment
Единственным недостатком использования храма является то, что вам нужно переопределить кнопки громкости, потому что после каждого щелчка нижняя системная полоса возвращается, и что бы вы ни делали, после длительного нажатия на кнопку питания нижняя полоса возвращалась. Так что, в конце концов, вероятно, мне придется использовать свой метод, потому что это будет киоск-приложение, поэтому мне нужно максимально ограничить пользователя. - person goodm; 27.02.2013

Ответ от goodm работает нормально, но большинство из нас не знают о envp

Итак, вот полный код:

СКРЫТЬ

try
{
    String command;
    command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";

    ArrayList<String> envlist = new ArrayList<String>();
    Map<String, String> env = System.getenv();
    for (String envName : env.keySet()) {
        envlist.add(envName + "=" + env.get(envName));
    }
    String[] envp = (String[]) envlist.toArray(new String[0]);
    Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
    proc.waitFor();
}
catch(Exception ex)
{
    Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
}

Вы можете использовать подобные для шоу.

person Bhupinder    schedule 22.03.2015