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

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

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

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

11 ответов

Решение

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

Поскольку это невозможно сделать с помощью общедоступного 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-доступа, но вам не нужно менять плотность ЖК-дисплея, сохраняя то же самое, что и оригинал, и вы можете получить панель навигации UI очень быстро и легко без перезагрузки каждый раз.

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

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

$ service call activity 79 s16 com.android.systemui

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

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

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

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

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

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

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

Вот связанный код с моим предыдущим ответом. Он автоматически скрывает строку состояния и снова показывает ее после завершения. Важно: чтобы снова его показать, код должен перезапустить 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();
    }
}

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

setSystemUiVisibility (View.SYSTEM_UI_FLAG_IMMERSIVE)

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

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

Да, это можно сделать, если у вас есть 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;

        }
    }


}

Хотя это не отвечает на вопрос о "блокировке" экрана, вы можете скрыть строку состояния, не будучи root, с помощью API setSystemUiVisibillity (уровень API 11).

Какой-то псевдокод:

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

Это будет скрывать строку состояния до тех пор, пока пользователь не щелкнет по нижнему краю экрана, и в этом случае строка состояния отобразится (она снова будет скрыта через несколько секунд).

Убедитесь, что вы указали targetSdkVersion="11" или выше в манифесте.

Для тех, у кого была эта проблема:

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

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

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

или же

mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE)

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

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

> <Application
> android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
> other parameters of application tag-->
> >
Другие вопросы по тегам