Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Поскольку это невозможно сделать с использованием общедоступного 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 для наших киосковских таблеток.

Ответ 3

Если у вас есть доступ к системному файлу, вы можете сделать это (мой разблокирован и укоренен, поэтому я не уверен, что вам нужно, я не пробовал с помощью factory new 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

Изменить:

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

Ответ 4

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

Ответ 5

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

Некоторые псевдокоды:

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" или выше.

Ответ 6

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

Ответ 7

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

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

Я случайно оставил свою целевуюSdkVersion в 8. Сбив ее до 16, сразу же вызвала эффект setSystemUIVisiblity, чтобы добиться желаемого эффекта.

Ответ 8

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

        }
    }


}

Ответ 10

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

> <Application
> android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
> other parameters of application tag-->
> >

Ответ 11

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

или

mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE)

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