设备管理接收器在几个版本中不起作用
Device Admin Receiver not working in few versions
我正在开发一个安全应用程序,它可以保护设备免受陌生人的侵害。
在我的应用程序中,我有一个功能,如果用户试图用错误的方式解锁设备,我应该从前置摄像头捕获图像 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(它的摩托罗拉设备,如果有帮助的话)。
我已经检查了以下问题:
Android 4.0 Device Admin Receiver not working
Android Device Admin not working
Having trouble receiving ACTION_PASSWORD_SUCCEEDED and ACTION_PASSWORD_FAILED intents
它们与我的 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:我测试了一些代码更改。当我在 admin.xml 中添加必要的策略时,同一设备管理员可以正确执行 lockNow() 功能。所以设备管理员设置正确。那么 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>
void onPasswordFailed(Context context, Intent intent, UserHandle user)
仅适用于 Oreo 及更高版本。
为了向后兼容,您还需要覆盖 onPasswordFailed(Context context, Intent intent)
。这将使您的代码适用于 Nougat 及以下版本。
我正在开发一个安全应用程序,它可以保护设备免受陌生人的侵害。
在我的应用程序中,我有一个功能,如果用户试图用错误的方式解锁设备,我应该从前置摄像头捕获图像 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(它的摩托罗拉设备,如果有帮助的话)。
我已经检查了以下问题:
Android 4.0 Device Admin Receiver not working
Android Device Admin not working
Having trouble receiving ACTION_PASSWORD_SUCCEEDED and ACTION_PASSWORD_FAILED intents
它们与我的 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:我测试了一些代码更改。当我在 admin.xml 中添加必要的策略时,同一设备管理员可以正确执行 lockNow() 功能。所以设备管理员设置正确。那么 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>
void onPasswordFailed(Context context, Intent intent, UserHandle user)
仅适用于 Oreo 及更高版本。
为了向后兼容,您还需要覆盖 onPasswordFailed(Context context, Intent intent)
。这将使您的代码适用于 Nougat 及以下版本。