设备管理员接收器在某些版本中无法正常工作。

5

我正在开发一款安全应用程序,可以保护设备免受陌生人的侵害。

在我的应用程序中,有一个功能,如果用户使用错误的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 文件和清单声明无关,并且在 Android 7、8、9 版本的所有其他设备上都可以正常工作。

我已经使用模式和有效的 PIN 进行测试,该 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>

管理员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>

请问您能否提供已测试的设备名称或型号?包括工作正常和不正常的。 - Vasudev Vyas
在Moto E4 (7.1.1)中无法工作。在红米Note 5 (8.1.0)中工作。@VasudevVyas - Ana
嗨,安娜,你能分享一下用设备管理员锁定的工作代码吗?我正在开发一个锁屏应用,遇到了一些问题,我的应用无法锁定,也无法正常工作,所以我想看看并与你的代码进行比较。 - undefined
1个回答

4

void onPasswordFailed(Context context, Intent intent, UserHandle user) 只适用于 Android Oreo 及以上版本。

为了向后兼容,您还需要覆盖 onPasswordFailed(Context context, Intent intent)。这将使您的代码在 Nougat 及以下版本上工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接