Все просто: нажмите на иконку и переведите телефон в режим ожидания. Разочаровывающая часть исходит от телефона: иногда, случайно, вместо того, чтобы оставаться в режиме ожидания, экран просыпается и отображается экран блокировки. Я еще не нашел никаких условий, чтобы вызвать такое поведение, где-то одна из 3-5 попыток. Приложение имеет разрешение администратора и, как ни странно, на пользовательском ПЗУ работало нормально, а на стоковой версии JellyBean 4.1.1 — нет.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
deviceManger = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
compName = new ComponentName(this, MyAdmin.class);
boolean active = deviceManger.isAdminActive(compName);
if (active) {
finish();
deviceManger.lockNow();
}
}
У меня есть файл политик xml, например
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
<uses-policies>
<force-lock>
</force-lock>
</uses-policies>
</device-admin>
Манифест Android кажется в порядке
<receiver
android:name=".MyAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@layout/policies" >
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" >
</action>
</intent-filter>
</meta-data>
</receiver>
Дело в том, что я не могу понять, почему это происходит. Это происходит на Galaxy Nexus со стоковой, чистой установленной версией 4.1.1. Как видите, код очень прост. Я мог бы попытаться создать обработчик с postDelayed 500 мс и снова запустить lockNow()... но что, если 500 мс недостаточно на некоторых устройствах?
Когда появляется экран блокировки, логкэт имеет:
07-26 20:45:27.446: I/ActivityManager(300): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.alinberce.standbytouch/.StandByActivity bnds=[168,1040][296,1168] u=0} from pid 524
07-26 20:45:27.634: D/dalvikvm(300): GC_FOR_ALLOC freed 1695K, 21% free 20113K/25351K, paused 69ms, total 69ms
07-26 20:45:27.650: D/SurfaceFlinger(124): About to give-up screen, flinger = 0x41b48af0
07-26 20:45:27.665: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:27.790: V/TransportControlView(300): Create TCV com.android.internal.widget.TransportControlView@419f9b08
07-26 20:45:27.861: D/dalvikvm(300): GC_CONCURRENT freed 528K, 16% free 21541K/25351K, paused 15ms+7ms, total 89ms
07-26 20:45:28.204: W/BufferQueue(124): [com.android.launcher/com.android.launcher2.Launcher] cancelBuffer: BufferQueue has been abandoned!
07-26 20:45:28.228: V/KeyguardViewManager(300): KGVM: Set visibility on com.android.internal.policy.impl.KeyguardViewManager$KeyguardViewHost@41d2ef48 to 6291456
07-26 20:45:28.236: D/PhoneStatusBar(399): disable: < expand icons alerts ticker system_info back home RECENT* clock >
07-26 20:45:28.243: I/Choreographer(300): Skipped 35 frames! The application may be doing too much work on its main thread.
07-26 20:45:28.329: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.329: D/PhoneStatusBar(399): disable: < expand icons alerts ticker system_info BACK* HOME* RECENT CLOCK* >
07-26 20:45:28.407: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.423: V/TransportControlView(300): Create TCV com.android.internal.widget.TransportControlView@41e953f8
07-26 20:45:28.431: I/WindowManager(300): Lock screen displayed!
07-26 20:45:28.446: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.501: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.704: D/SurfaceFlinger(124): Screen about to return, flinger = 0x41b48af0
07-26 20:45:28.704: E/PowerManagerService(300): Excessive delay setting brightness: 271ms, mask=2
Поделитесь, пожалуйста, идеями...