Мы не смогли предотвратить появление статуса в полноэкранном режиме на устройствах kitkat, поэтому сделали взломать, который по-прежнему соответствует требованию, т.е. блокировка строки состояния от расширения.
Для этого приложение не было сделано в полноэкранном режиме. Мы помещаем оверлей поверх строки состояния и потребляем все входные события. Это предотвратило расширение статуса.
примечание:
- customViewGroup это пользовательский класс, который расширяет любой макет (кадр, относительный макет и т.д.) и потребляет сенсорное событие.
- потреблять сенсорное событие переопределить onInterceptTouchEvent метода представления группы и вернуть истинный
Кроме того, необходимо установить андроид разрешения
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Вам нужен расширенный класс ViewGroup для обработки сенсорного события
public class customViewGroup extends ViewGroup {
public customViewGroup(Context context) {
super(context);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.v("customViewGroup", "**********Intercepted");
return true;
}
}
В том случае, если вы хотите отключить панель уведомлений, вам необходимо добавить эту функцию (не забудьте переменная дд поле CustomViewGroup blockingView)
private void disableNotificationBar(){
WindowManager manager = ((WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 * getResources()
.getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
blockingView = new CustomViewGroup(this);
manager.addView(blockingView, localLayoutParams);
}
, а затем в вас OnCreate вам нужно позвонить
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
....
disableNotificationBar();
}
Вы должны удалить его на OnDestroy(), чтобы иметь возможность закрыть приложение
@Override
protected void onDestroy() {
super.onDestroy();
if (blockingView!=null) {
WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
manager.removeView(blockingView);
}
}
Вы также должны отрегулировать размер наложения, в соответствии с предыдущим ответом 40 достаточно, но вы не хотите, чтобы пользователь не выполнял действие в своем собственном приложении, если наложение на высоту будет в tercept на вашей деятельности тоже.
Также в андроиде версии> 5.1 вам необходимо дополнительное разрешение от пользователя, добавьте это на OnCreate функции InstEd вызова функции
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
} else {
disableNotificationBar();
}
}
else {
disableNotificationBar();
}
Я не знаю, если это то, что вы ищете, но Я делаю это как http://stackoverflow.com/questions/25284233/prevent-status-bar-for-appearing-android-modified?answertab=active#tab-top – Leze