Есть ли способ скрыть системную панель в Android 3.0?Это внутреннее устройство, и я управляю навигацией - PullRequest
32 голосов
/ 24 февраля 2011

В Android 2.3 и ниже вы можете сделать приложение в полноэкранном режиме, а затем «взломать» кнопки меню / назад / поиска, просто вернув false onKeyDown () ... и зарегистрировав приложение в качестве домашней программы запуска по умолчанию,таким образом, нет выхода из приложения.

В Android 3.0 (Honeycomb) кнопки навигации (системная панель) всегда присутствуют, я бы хотел их скрыть.Возможно ли это?

К вашему сведению, я не публикую это приложение на Android Market.Это внутреннее приложение для устройств, которые будут использоваться внутри, мне нужно защитить устройство.

Ответы [ 11 ]

31 голосов
/ 11 мая 2011

Поскольку это невозможно сделать с помощью общедоступного API, я нашел способ сделать это очень «взломанным» способом, требующим рутированного устройства.

Обновление: , как указано пользователем user864555, это другое решение

$ 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

"Этот код отключает приложение SystemUI, которое фактически является строкой меню. В этой модификации вы также получите место на этой системной панели. Но убедитесь, что у вас есть кнопка возврата или что-то для выхода."

Это также прекрасно работает. Пожалуйста, проголосуйте за его ответ. Я постараюсь постоянно обновлять этот файл.


Обновление: Вот третий способ. Способ сделать это программно или используя командную строку. Найдено здесь: http://android.serverbox.ch/?p=306

Этот метод требует root-доступа, но вам не нужно изменять плотность ЖК-дисплея, сохраняя то же самое, что и оригинал, и вы можете вернуть панель навигации интерфейса очень быстро и легко, без необходимости каждый раз перезагружаться.

В блоге также показано, как реализовать его в вашем Android-приложении, помните, что для него требуется root, и это может быть не очень хорошей идеей, если ваше приложение не запущено в киоске или в вашем собственном Не используйте этот метод в приложении, опубликованном на Android-маркете или в любом другом месте.

Чтобы остановить / удалить / отключить системную панель (необходимо ввести su перед выполнением этой команды):

$ service call activity 79 s16 com.android.systemui

Чтобы восстановить системную панель, просто введите следующую команду:

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

Это так просто. Надеемся, что скоро выйдет ICS вместе с исходным кодом, так что любой сможет собрать Android для наших планшетов Kiosk.

11 голосов
/ 25 февраля 2011

Вы не можете скрыть системную панель на Android 3.0.

7 голосов
/ 29 июля 2011

Если у вас есть доступ к системному файлу, вы можете сделать это (мой разблокирован и укоренен, так что я не уверен, что вам нужно, я не пробовал с фабричным свежим увеличением):

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

Этот код отключает приложение SystemUI, которое фактически является строкой меню.С этой модификацией вы также получите место на этой системной панели, но убедитесь, что в вашем приложении есть кнопка «Назад» или что-то для выхода.

Редактировать:

Если у вас есть проблемыс файлом, доступным только для чтения, вам нужно смонтировать каталог /system для чтения и записи.Для этого используйте эту команду в оболочке adb (Источник: http://forum.xda -developers.com / showthread.php? T = 1159495 & page = 5 )

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

Вы можете перемонтировать еетолько для чтения с использованием этой команды:

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

Редактировать:

Эти методы позволяют программной клавиатуре нормально отображаться при необходимости.

1 голос
/ 30 июля 2011

Вот связанный код с моим предыдущим ответом. Он автоматически скрывает строку состояния и снова показывает ее после завершения. Важно: чтобы снова его увидеть, код должен перезапустить system_server, который займет некоторое время для повторной загрузки, и в течение этого времени вы увидите анимацию загрузки сота. Это единственное, что я сейчас вижу, чтобы снова показать строку состояния. Перезапуск SystemUI не достаточно. И из-за этого, оно перезапустит ваше приложение при перезапуске system_server.

Для этого кода требуется рут ОС с установленным суперпользователем.

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();
    }
}
0 голосов
/ 03 февраля 2015

Начиная с 4.4 вы можете сделать это (этот вопрос очень старый, но всегда поднимается по этой теме):

setSystemUiVisibility (View.SYSTEM_UI_FLAG_IMMERSIVE)

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

0 голосов
/ 10 декабря 2014

Да можно сделать , если у вас есть root-доступ на устройстве.

Этот код может скрывать и отображать StatusBar, убивая его процесс и вызывая его снова.

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 голосов
/ 30 марта 2013

Android: тема = "@ андроид: стиль / Theme.Black.NoTitleBar.Fullscreen

или

mainView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE)

Нет, панель задач все еще там, с тремя серыми точками вместо классических значков

0 голосов
/ 26 марта 2013

если вы хотите скрыть панель навигации в приложении, то здесь самый простой способ. просто напишите этот код в теге приложения в файле манифеста

> <Application
> android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
> other parameters of application tag-->
> >
0 голосов
/ 09 октября 2012

Для тех, у кого возникла эта проблема:

Если вы не правильно установили android: targetSdkVersion в своем файле AndroidManaifest.xml, setSystemUiVisibility не действует (в отличие от других расширенных API, которые работают вне зависимости от того, работают они или нет).targetSDKVersion был установлен правильно или нет).

Я случайно оставил свой targetSdkVersion на 8. Повышение его до 16 немедленно привело к желаемому эффекту setSystemUIVisiblity.

0 голосов
/ 31 июля 2012

Приложение HideBar можно использовать для скрытия системной панели на планшетах Android (HC, ICS, JB). Он содержит дополнительный режим киоска, который можно использовать для полной блокировки планшетов, а также другие параметры, такие как скрытая кнопка возврата. Это программное обеспечение GPL. Свяжитесь с разработчиком (я, см. Электронную почту на веб-сайте приложений), если это приложение должно быть установлено в больших объемах.

...