Віджет екрана блокування Android


76

Кілька користувачів запитують у мене віджети блокованого екрану Android для мого додатка - я вважаю, що вони хочуть віджет, який залишається на їхніх екранах блокування та дозволяє їм взаємодіяти з додатком.

Я не зміг знайти жодної офіційної документації для цього - єдине, що я знайшов, це програми, які будуть брати віджети домашнього екрану та розміщувати їх на екрані блокування для вас.

Будь-які підказки про те, де я дізнаюся більше про створення справжніх віджетів із блокованим екраном?


3
Офіційна підтримка зміни екрана блокування відсутня. Насправді, я був би здивований, якби можна було придумати хак, який працював на всіх пристроях.
CommonsWare

@Commonsware: Справді, є. Перевірте MixZing, у них є можливість його ввімкнути, і цей віджет залишається вгорі на екрані блокування. Одного разу він доступний у безкоштовній версії, і він працює в моєму бажанні, без вкорінення.
xandy

1
@xandy: MixZing може мати можливість блокування екрана, але як це має допомогти запитувачу створити його?
Мелінда Грін

@MelindaGreen: З прикладом MixZing принаймні ми знаємо, що це можливо
Йогеш Махешварі

3
Віджети блокування екрану представлені лише з Android 4.2. Тож, можливо, ви захочете поглянути на нього ще раз.
Мартін

Відповіді:


56

Взаємодія з блокованим екраном утруднена. Android дозволяє виконувати основні операції з двома прапорами вікон (FLAG_SHOW_WHEN_LOCKED та FLAG_DISMISS_KEYGUARD). FLAG_SHOW_WHEN_LOCKED працює досить послідовно, оскільки відображатиметься у верхній частині екрана блокування, навіть коли безпека ввімкнена (безпека не обійдена, ви не можете переключитися на інше вікно, що не є FLAG_SHOW_WHEN_LOCKED).

Якщо ви просто робите щось тимчасове, наприклад, під час відтворення музики або подібного, з вами, мабуть, все буде добре. Якщо ви намагаєтеся створити власний екран блокування, то на багатьох різних платформах Android існує безліч незвичних взаємодій. ("Довідка! Я не можу вимкнути будильник, не перезавантаживши телефон HTC").

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

FLAG_SHOW_WHEN_LOCKED

Прапор вікна: спеціальний прапорець, що дозволяє відображати вікна, коли екран заблокований.

FLAG_DISMISS_KEYGUARD

Прапор вікна: якщо встановлено, вікно призведе до відхилення блокування клавіатури, лише якщо це не захищена блокування. Оскільки така захисна клавіатура не потрібна для безпеки, вона ніколи не з’явиться повторно, якщо користувач перейде в інше вікно (на відміну від FLAG_SHOW_WHEN_LOCKED, яке лише тимчасово приховує як захищені, так і незахищені блокування, але гарантує, що вони знову з’являться, коли користувач перейде до інший інтерфейс, який їх не приховує). Якщо в даний час захисна клавіатура активна і захищена (вимагає шаблон розблокування), користувачеві все одно доведеться підтвердити це, перш ніж побачити це вікно, якщо також не встановлено FLAG_SHOW_WHEN_LOCKED. Постійне значення: 4194304 (0x00400000)


1
Дякую, але чи можу я використовувати це для віджетів? З документації, яка є мізерною, це виглядає як щось, що може використовуватися видом діяльності, але я не впевнений, як встановити це для віджета, оскільки ОС відображає віджет, а програма просто надсилає дані для нього.
психотик

6
Ні, це можна використовувати лише для діяльності. Єдиний спосіб відобразити фактичний Android-віджет програми ( developer.android.com/guide/topics/appwidgets/index.html ) на екрані блокування - це програма за допомогою типу (відмова від відповідальності, моя програма) WidgetLocker. "Віджет блокованого екрану" MixZing - це діяльність, а не "Віджет програми".
Kevin TeslaCoil

1
То як MixZing робить їх діяльність схожою на віджет?
психотик

2
Дякую @Kevin. Це було дуже корисно. Однак одне питання: що ви робите, щоб активність запускалася, коли ввімкнено екран блокування, а не просто продовжувати показувати, чи екран заблокований, коли активність уже активна?
Ендрю Хаббс,

11
Ви можете зареєструвати трансляційний приймач для SCREEN_OFF та / або SCREEN_ON. Перевага SCREEN_OFF полягає в тому, що користувач не обов'язково бачить екран блокування запасів, оскільки це вже встановлено на час, коли користувач вмикає екран. Перевагою SCREEN_ON є те, що ви можете перевірити inKeyguardRestrictedInputMode, щоб ви знали, що екран блокування запасів активний. Іноді екран вимикається з інших причин, таких як датчик наближення.
Kevin TeslaCoil 02.03.11

28

Офіційний документ віджета екрана блокування тут


2
+1: на жаль, для цього потрібен android 4.2 і новіші версії, а у мене є лише android 2.2 :-(
k3b

1
Також їх ми видалили з 5.0
FindOut_Quran

купити новий пристрій ОС
famfamfam

11

Мені довелося застосувати віджет екрана блокування для свого проекту. У процесі я накопичив пару ресурсів.

  1. Якщо у вас є програма, яку ви хочете поставити на екран блокування, спочатку зробіть її віджетом програми . Ви можете використовувати AppWidgetклас для цього.
  2. Тепер використовуйте AppWidgetHostклас з Android API, щоб зробити ваш екран блокування хостом віджетів. Я не знаю, як зробити цю частину, але є деякі існуючі реалізації, такі як mylockandroid (посилання нижче).

Ресурси

http://code.google.com/p/mylockforandroid/ (Примітка. Цей код призначений для старих версій Android. Android 4.2 і новіших версій має вбудовану підтримку віджетів на екрані блокування)

http://mylockandroid.blogspot.com/2010/03/widget-lockscreen-beta-11-r2.html


Звичайно, якщо ви хочете відобразити віджет на заблокованому екрані, вам доведеться створити Activity на SCREEN_ON, і в рамках цієї Activity ви можете використовувати AppWidgetHost. Тому що те, як воно стоїть у відповіді, є дещо неоднозначним.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.