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

Как создать постоянную полноэкранную активность наложения в Android

Я хотел бы иметь возможность создавать Activity, который всегда находится на передней панели Android. Он не должен принимать входные данные, просто передайте его вниз, как показано ниже. Что-то вроде HUD.

Я смог исследовать, что мне нужно установить базовый тип окна в TYPE_SYSTEM_ALERT, но похоже, что Android игнорирует мой код - никакое исключение не выбрасывается, даже если я удалю андроид .permission.SYSTEM_ALERT_WINDOW из манифеста. (требуется использовать этот тип окна). Когда я пытался использовать диалог ALERT в диалоговом окне, он работал нормально, но я не могу сделать диалог в полноэкранном прозрачном объекте. Вот мой код, возможно, что-то просто отсутствует.

public void onCreate(Bundle savedInstanceState) {       
     super.onCreate(savedInstanceState);        

     requestWindowFeature(Window.FEATURE_NO_TITLE);
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);             
     getWindow().setBackgroundDrawableResource(android.R.color.transparent);
     getWindow().setFormat(PixelFormat.TRANSLUCENT);
     setContentView(R.layout.main);
}

Прозрачный параметр должен быть включен снаружи в манифесте xml, иначе он также не работал.

 <item name="android:windowIsTranslucent">true</item>
4b9b3361

Ответ 1

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);

WindowManager wm = (WindowManager) getApplicationContext()
    .getSystemService(Context.WINDOW_SERVICE);

ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null);
getWindow().setAttributes(params);
wm.addView(mTopView, params);

Ответ 2

Я обнаружил, что принятый ответ (tmouse) не совсем сработал у меня. Может быть, он работал на более высоком уровне API? Я использую API-уровень 24.

Этот конкретный ответ рекомендовал:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT
);

Проблема с этим. Конструкторы, которые существуют для WindowManager.LayoutParams, следующие:

введите описание изображения здесь

Поэтому флаг WindowManager.LayoutParams.FLAG_FULLSCREEN используется как явное значение для int w и int h. Это не годится! Размеры вашего вида устанавливаются на 1024 * 1024 - поэтому он не заполняет экран. И даже если вы явно задали ширину и высоту макета в соответствии с размерами устройства: при изменении ориентации экрана они будут не. Нам нужен другой подход...


Я обнаружил, что правильная конструкция для полноэкранного наложения выглядит так:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN,
    PixelFormat.TRANSLUCENT
);

Это означает, что мы больше не указываем ширину и высоту. Макет полностью основывается на наших флагах.

Да, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - обязательный флаг; это необходимо, если вы хотите нарисовать декорации, такие как строка состояния.

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY следует использовать вместо TYPE_SYSTEM_ALERT в уровне API >= 19. Это записка, которую я написал некоторое время назад, к сожалению, мне не удалось найти цитату, чтобы подтвердить, почему я так думал, поэтому возьмите это с щепоткой соли.


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

Ваш манифест будет нуждаться в этих разрешениях (объяснение здесь):

<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Я понимаю, что SYSTEM_ALERT_WINDOW - это фактическое разрешение, но требуется также ACTION_MANAGE_OVERLAY_PERMISSION: он позволяет запрашивать во время выполнения, что пользователь предоставляет привилегии SYSTEM_ALERT_WINDOW.

Я предоставляю здесь исходный код для моего рабочего API уровня 24, создающего полноэкранный накладной.

Ответ 3

Проверьте это

укажите его в файле AndroidManifest.xml

<activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

если вы хотите сделать свою активность полноэкранным и прозрачным.

ознакомьтесь с этим

<activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />