Есть ли способ скрыть системную панель в Android 3.0? Это внутреннее устройство, и я управляю навигацией
В Android 2.3 и ниже, вы можете сделать приложение в полноэкранном режиме, а затем "перехватить" кнопки меню / назад / поиска, просто вернув false onKeyDown()... и зарегистрировав приложение как домашнее приложение запуска по умолчанию, таким образом, нет возможности выйти из приложения.
В Android 3.0 (Honeycomb) кнопки навигации (системная панель) присутствуют всегда, я бы хотел это скрыть. Является ли это возможным?
К вашему сведению, я не публикую это приложение на Android Market. Это внутреннее приложение для устройств, которые будут использоваться внутри, мне нужно защитить устройство.
11 ответов
Поскольку это невозможно сделать с помощью общедоступного 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-->
> >