Я работаю над приложением безопасности, которое защищает устройство от посторонних.
В моем приложении есть функция, которая должна захватывать изображение с фронтальной камеры, если пользователь пытается разблокировать устройство с неправильным PIN / Pattern / Password.
У меня есть что-то вроде этого.
public class MyAdminReceiver extends DeviceAdminReceiver {
@Override
public void onPasswordFailed(Context context, Intent intent, UserHandle user) {
Log.d("MyTag", "onPasswordFailed called");
//Code for starting a service for image capture goes here
.
.
.
}
....
....
}
Почти во всех версиях изображение получается правильно, и приложение работает нормально.
Проблема: в некоторых устройствах функция onPasswordFailed
не работает. Админ устройства активирован правильно. Я попытался отключить его снова и снова активировать. Я попытался перезагрузить устройство. Но ничего не сработало. Я вижу этот журнал в моей трассировке стека.
03-09 12:04:48.078 18491-18491/com.my.pkgname D/ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.ACTION_PASSWORD_FAILED flg=0x10 cmp=com.my.pkgname/.receivers.MyAdminReceiver }, receiver=com.my.pkgname.receivers.MyAdminReceiver@30c2044b
03-09 12:04:48.079 18491-18491/com.my.pkgname D/ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.ACTION_PASSWORD_FAILED flg=0x10 cmp=com.my.pkgname/.receivers.MyAdminReceiver } packageName=com.my.pkgname resultCode=-1 resultData=null resultExtras=null}
Эта проблема до сих пор видна во всех устройствах, которые я видел в Android 6.0 (версия Marshmallow) и Android 7.1.1 (его устройство Motorola, если это помогает).
Я уже проверил ниже вопросы:
Они не относятся к моему файлу admin.xml, и декларация Manifest в порядке, и она работает на всех других устройствах с версией Android 7, 8, 9.
И я проверил, используя шаблон, действительный PIN-код которого превышает минимальную длину. Я вообще не устанавливал другие ограничения пароля.
Тем не менее, я показываю часть манифеста admin.xml для проверки.
Манифест декларации:
....
<application>
....
<receiver
android:name=".receivers.MyAdminReceiver"
android:exported="true"
android:enabled="true"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" />
</intent-filter>
</receiver>
....
</application>
Файл admin.xml:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<watch-login />
</uses-policies>
</device-admin>
Может кто-нибудь помочь с этим вопросом?
Дайте мне знать, если требуется какое-либо специальное разрешение / или обязательная настройка.
P.S .: Я тестировал с некоторыми изменениями в коде. Администратор того же устройства может выполнять функцию lockNow () правильно, когда я добавил необходимую политику в admin.xml. Таким образом, администратор устройства настроен правильно. Так в чем же проблема, которую onPasswordFailed
нельзя назвать?
Я также попытался добавить фильтр намерений для ACTION_PASSWORD_FAILED
в манифесте. Без разницы.
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.ACTION_PASSWORD_FAILED" />
<action android:name="android.app.action.ACTION_PASSWORD_SUCCEEDED"/>
</intent-filter>