Программное закрепление сторонних приложений на экране

После получения права владения устройством я пытаюсь реализовать метод, чтобы дать устройству команду заблокировать любое данное приложение в режиме киоска (или режиме закрепления экрана). Поскольку я являюсь владельцем устройства, у пользователя не спрашивают разрешения на это.

Краткое описание с веб-сайта разработчика говорит мне, что можно делать то, что я пытаюсь:

http://developer.android.com/about/versions/android-5.0.html#ScreenPinning

Программно: чтобы программно активировать закрепление экрана, вызовите startLockTask () из своего приложения. Если запрашивающее приложение не является владельцем устройства, пользователю предлагается подтвердить. Приложение владельца устройства может вызвать метод setLockTaskPackages (), чтобы разрешить закрепление приложений без шага подтверждения пользователя.

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

Мне удалось перевести собственное приложение в закрепленный режим.

Любая помощь будет оценена.


comment
Какие приложения вы хотите заблокировать: ваши или сторонние?   -  person Hartok    schedule 29.01.2015
comment
@Hartok, приложение, которое я хочу заблокировать, - это сторонние приложения.   -  person kash    schedule 02.02.2015


Ответы (3)


setLockTaskPackages() используется для указания, какие приложения (через их имена пакетов) смогут программно закрепляться без подтверждения пользователя. setLockTaskPackages() вызывается из вашего приложения владельца устройства (скорее всего, в вашем DeviceAdminReceiver методе onEnabled()).

Итак, в приложении вашего владельца устройства у вас будет что-то вроде:

mDPM.setLockTaskPackages("com.foo.myapp");

а затем в вашем приложении "com.foo.myapp" вы будете авторизованы для вызова:

startLockTask(); 

Ваше приложение немедленно перейдет в режим закрепления без какого-либо подтверждения со стороны пользователя.

Если вы сначала не register ваше приложение с setLockTaskPackages, приложение будет закреплено, но пользователь должен будет сначала подтвердить.

Также обратите внимание, что когда приложение registered с setLockTaskPackages(), его поведение отличается от поведения ручного закрепления:

  • пользователь не может вручную открепить приложение, удерживая Назад + Недавние приложения. Вам нужно будет программно открепить ваше приложение с помощью stopLockTask();
  • Кнопки «Домой» и «Недавние приложения» невидимы (не отображаются)
  • Когда приложение откреплено (через stopLockTask ()), пользователь сразу вернется на главную страницу: блокировка экрана не отображается, даже если установлен Keyguard (шаблон, код или любой другой экран Keyguard).
person Florent Dupont    schedule 29.01.2015
comment
можем ли мы закрепить другое приложение с помощью метода setLockTaskPackages? - person sunil jain; 01.02.2015
comment
@FlorentDupont, должно ли приложение, которое вы дали, например com.foo.myapp, быть опубликованным вами приложением, которое должно разрешать закрепление экрана? Неужели я могу запереться, скажем, злые птицы ... com.rovio.angrybirds? - person kash; 02.02.2015
comment
@suniljain: нет, вы не можете закрепить другое приложение с помощью setLockTaskPackages. Для этого вам нужно будет использовать Activity.startLockTask() другого приложения. @kash да, в этом примере com.foo.myapp должен быть опубликован мной. Вы не можете программно заблокировать другое приложение, которым вы не владеете. - person Florent Dupont; 02.02.2015
comment
@FlorentDupont в соответствии с этим: public void setLockTaskPackages (ComponentName admin, String [] packages). Любым пакетам, которые разделяют uid с разрешенным пакетом, также будет разрешено активировать задачу блокировки. Похоже, что логика создания api закрепления экрана заключалась в том, чтобы позволить владельцу устройства блокировать другие приложения. Но я думаю, что нам не хватает какого-то метода. - person kash; 05.02.2015
comment
Я написал полную статью на эту тему. доступно здесь: florent-dupont.blogspot.fr/2015 / 02 /. Надеюсь, он ответит на ваши вопросы. - person Florent Dupont; 06.02.2015
comment
@FlorentDupont, это действительно хорошая статья ... очень исчерпывающая. Спасибо за вашу помощь. - person kash; 06.02.2015
comment
@FlorentDupont Я написал приложение, которое является владельцем и администратором, я могу успешно закрепить приложение без подтверждения пользователя, но пользователь все еще может открепить приложение, долгое нажатие Back + Recent Apps, кнопки все еще там, потому что они являются физическими кнопками, Мое устройство - Samsung Galaxy Tab A. Возможно неправильная реализация Самсунгом. - person chairam; 03.12.2015
comment
да, я знаю, что некоторые поставщики неправильно это реализуют. Рекомендуется использовать официальные телефоны / столы Google. Я тестировал на них, и все работает нормально. - person Florent Dupont; 08.12.2015
comment
@jogrimst У меня есть приложение как владелец устройства. Задача этого вопроса заключалась в попытке программно заблокировать сторонние приложения, не показывая им всплывающее уведомление. - person kash; 24.04.2016
comment
Могу ли я использовать этот метод, чтобы исправить отсутствие закрепления экрана на моем huawei p9 lite? например Я хочу закрепить YouTube или хром - person vault; 26.08.2016
comment
Привет всем, пожалуйста, помогите мне .. как я могу создать приложение владельца устройства, я пробовал много способов, но мне это не удалось .. спасибо .. - person saraman; 16.11.2017
comment
Вроде есть и другие способы закрепления экрана. Такое приложение, как Touch Lock Lite, достигло этого без DeviceArministrator. Может кто-нибудь подскажет? - person Duna; 13.06.2020
comment
@FlorentDupont Спасибо за статью! Я не могу получить намерение onLockTaskModeEntering. Я добавил фильтр намерений к моему получателю в манифесте. В документации говорится, что приложение должно быть владельцем устройства. Это новое? Возможно ли еще получить это намерение? - person Flyview; 09.07.2021

У меня недостаточно репутации для комментария, просто хотел бы указать, что для устройств с физическими кнопками (например, Samsung Galaxy Tab A, упомянутого @chairman) одним из способов управления принудительным откреплением вашего приложения является реализация в вашем классе DeviceAdminReceiver следующий:

@Override public void onLockTaskModeExiting (контекст контекста, намерение намерения)

Так что, если ваш пользователь хочет открепить, вы всегда можете повторно закрепить свое приложение;)

person Paolo Moschini    schedule 17.02.2016

Вот фрагмент кода, который должен вас заинтересовать:

DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);

if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {
    // Device owner
    String[] packages = {this.getPackageName()};
    myDevicePolicyManager.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
    // Not a device owner - prompt user or show error
}

if (myDevicePolicyManager.isLockTaskPermitted(this.getPackageName())) {
    // Lock allowed
    startLockTask();
} else {
    // Lock not allowed - show error or something useful here
}
person CzarMatt    schedule 29.01.2015
comment
благодаря этому мы можем закрепить только собственное приложение, но, как объяснил Каш, он хочет закрепить другое приложение, возможно ли использование DevicePolicyManager с привилегиями владельца устройства? - person sunil jain; 29.01.2015
comment
Любым способом закрепить другие приложения из нашего приложения. Как мы знаем, кнопки «Домой» и «Недавние» будут невидимы. Тогда как можно подключиться к какому-либо другому приложению, чтобы закрепить его. Обычно требуется возможность использовать устройство в режиме киоска / закрепления для более чем одного приложения. - person khubaib; 15.07.2015
comment
@khubaib Вам в основном нужно добавить имя пакета вашего приложения в владельце устройства. Затем из своего приложения вы вызываете startLockTask (). Это единственный метод, который я нашел до сих пор. - person kash; 19.08.2015
comment
где найти DeviceAdminSample.class? - person Kalpesh Kulye; 14.04.2021