Ответ 1
Вы не можете скрыть системную панель на Android 3.0.
В Android 2.3 и ниже вы можете сделать приложение полноэкранным, а затем "захватить" кнопки меню/назад/поиска, просто вернув false onKeyDown()... и зарегистрировав приложение как стандартное приложение для запуска дома, Таким образом, нет возможности выйти из приложения.
В Android 3.0 (Honeycomb) всегда присутствуют кнопки навигации (системная панель), я бы хотел скрыть это. Возможно ли это?
FYI, я не публикую это приложение на Android Market. Это внутреннее приложение для устройств, которые будут использоваться внутри, мне нужно защитить устройство.
Вы не можете скрыть системную панель на 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 для наших киосковских таблеток.
Если у вас есть доступ к системному файлу, вы можете сделать это (мой разблокирован и укоренен, поэтому я не уверен, что вам нужно, я не пробовал с помощью 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
Эти методы позволяют мягкой клавиатуре нормально отображаться при необходимости.
Вот связанный код с моим предыдущим ответом. Он автоматически скроет строку состояния и покажет ее снова, когда закончите. Важно: чтобы показать его снова, код должен перезапустить системный_сервер, который занимает некоторое время, чтобы снова загрузиться, и за это время вы увидите анимацию загрузки сотовой памяти. Это единственное, что я нахожу сейчас, чтобы снова показать панель состояния. Перезапустить 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();
}
}
Хотя это не отвечает на вопрос о "блокировке" экрана, вы можете скрыть строку состояния, не будучи 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" или выше.
Приложение HideBar можно использовать, чтобы скрыть системную панель на планшетах Android (HC, ICS, JB). Он содержит дополнительный режим киоска, который можно использовать для полной блокировки планшетов, а также других параметров, таких как скрытая кнопка возврата. Это программное обеспечение GPL. Свяжитесь с разработчиком (см. Электронную почту на веб-сайте приложений), если это приложение должно быть установлено в больших объемах.
Для других, у кого была эта проблема:
Если вы не установили андроид: targetSdkVersion должным образом в файл AndroidManaifest.xml, setSystemUiVisibility не имеет никакого эффекта (в отличие от других продвинутых API, которые работают независимо от того, установлена или нет TargetSDKVersion).
Я случайно оставил свою целевуюSdkVersion в 8. Сбив ее до 16, сразу же вызвала эффект setSystemUIVisiblity, чтобы добиться желаемого эффекта.
Да можно сделать, если у вас есть 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;
}
}
}
Начиная с 4.4 вы можете это сделать (этот вопрос очень старый, но всегда появляется в этой теме):
setSystemUiVisibility (View.SYSTEM_UI_FLAG_IMMERSIVE)
https://developer.android.com/training/system-ui/immersive.html
если вы хотите скрыть панель навигации через приложение, то вот самый простой способ. просто напишите этот код в теге приложения в файле манифеста
> <Application
> android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
> other parameters of application tag-->
> >
Android: тема = "@андроид: стиль /Theme.Black.NoTitleBar.Fullscreen
или
mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE)
Нет, панель задач все еще существует, с тремя серыми точками вместо классических значков