Родной экран блокировки Android ICS

Я последние 2 дня ищу по ув, гуглю и тд. Я ищу способ реализовать действие, которое поставляется с собственным экраном блокировки Android ICS, как показано на экранах ниже. Эти экраны взяты из Player Pro, но я заметил, что и другие игроки ( PlayerPro для instance ) имеют одну и ту же функцию, которая выглядит точно так же, поэтому я думаю, что это что-то нативное или, по крайней мере, есть общий способ ее реализации.

Пока мне удалось получить и Activity, которые заменяют экран блокировки, используя эти флаги:

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
  • WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

с BroadCaseReciever для этих событий:

  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_USER_PRESENT

Моя проблема в том, что я хочу, чтобы моя активность отображалась на экране блокировки, а не заменяла его. Ребята, вы знаете, как этого добиться?

есть ли собственный скрытый API для этого?

Можете ли вы, ребята, дать мне ссылку на какой-нибудь образец, который реализует эту конкретную функцию?

заранее спасибо ;)

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


person Mario Lenci    schedule 29.05.2012    source источник
comment
См. этот пост: stackoverflow.com/questions/4065201/ Но, возможно, с версии 4.0 это возможно, иначе Player Pro использует свой собственный API   -  person Guillaume    schedule 29.05.2012
comment
что вы имеете в виду под собственным API? кстати, и другие плееры имеют ту же функцию (например, PowerAmp), так что я думаю, что это не что-то, разработанное ребятами из PlayerPro.   -  person Mario Lenci    schedule 29.05.2012
comment
Возможно, это фрагмент диалога, использующий флаг показа при блокировке? РЕДАКТИРОВАТЬ: также появляется FLAG_SPLIT_TOUCH, который позволяет передавать прикосновения за пределами окна в это окно, если на нем установлен флаг... Похоже, что комбинация этих двух может позволить это   -  person Drake Clarris    schedule 30.05.2012
comment
ну, я пытался, и я не могу заставить его работать, потому что я не могу показать диалог из BroadCastReciever, он выдает эту ошибку BadTokenException: невозможно добавить окно - нулевой токен не для приложения. Вы знаете, как получить токен блокировки экрана? это было бы решением.   -  person Mario Lenci    schedule 30.05.2012
comment
Я также пытался использовать FLAG_SPLIT_TOUCH в своей деятельности, используя стиль диалога, но все равно это не работает, потому что, как только я устанавливаю для android:windowIsFloating значение true, активность отображается после экрана блокировки. А без него не отображается в оверлее экрана блокировки. другие идеи?   -  person Mario Lenci    schedule 30.05.2012


Ответы (2)


Я думаю, вы, возможно, ищете API «удаленного просмотра» (RemoteControlClient) управления звуком, добавленный в Android 4.0 (уровень API 14). В документации для разработчиков Android я нашел RemoteControlClient API, который:

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

(Он был связан с этой страницы.)

Примечание. Я никогда не использовал этот API сам, поэтому приношу извинения, если это не сработает для вас.

person scorpiodawg    schedule 08.06.2012
comment
+1 Это определенно то, что он ищет, и то, что он должен использовать для встроенной интеграции с экраном блокировки. - person Kevin Coppock; 08.06.2012
comment
yeee ... наконец, ответ, который я искал. +1 и награда. Я знал, что есть API, но не мог его найти. Большое спасибо, я так счастлив, что наконец-то могу реализовать этот экран блокировки: D. - person Mario Lenci; 11.06.2012
comment
Примечание. Образец больше недоступен на портале разработчика. - person radley; 26.07.2014

Ты почти все делаешь правильно. Продолжайте делать то, что вы делаете с BroadcastReceiver. Это путь. Для окна вам нужно использовать следующие флаги:

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
  • WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL

не используйте FLAG_DISMISS_KEYGAURD

Что делают эти флаги: SHOW_WHEN_LOCKED позволяет отображать вашу активность поверх экрана блокировки. FLAG_NOT_TOUCH_MODAL позволяет сенсорным событиям, которые не относятся к вашей активности, переходить к другим действиям, т. е. позволяет пользователю разблокировать экран. FLAG_DISMISS_KEYGUARD избавляет от экрана блокировки, поэтому мы им не пользуемся.

Определите этот стиль в файле res/values/styles.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.FloatingTranslucent" parent="android:Theme.Translucent.NoTitleBar">
    <item name="android:windowIsFloating">true</item>
  </style>
</resources>

В своем манифесте определите стиль своей деятельности

<activity android:name=".SampleActivity" android:theme="@style/Theme.FloatingTranslucent">
...
</activity>

Это делает вашу активность полностью видимой и оборачивает контент.

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

Ваше здоровье.

person Zaid Daghestani    schedule 05.06.2012
comment
вы уже реализовали это таким образом? потому что я пытался, и как только я установил для android:windowIsFloating значение true, я не могу заставить Activity отображаться поверх keyguard, даже если я установил FLAG_SHOW_WHEN_LOCKED - person Mario Lenci; 05.06.2012
comment
я также пытался поставить TYPE_KEYGUARD_DIALOG в качестве типа окна, но ничего не изменилось. - person Mario Lenci; 06.06.2012
comment
Привет @ Zaid-Dagestani, у тебя есть решение для этого? stackoverflow.com/questions/33466950 / - person Rafael Ruiz Muñoz; 02.11.2015