在Android Locktask模式下执行调用

时间:2017-01-23 12:29:14

标签: android android-intent kiosk kiosk-mode cosu

TL; DR如何在使用Activity.startLockTask()时拨打电话?

我试图在Android设备上设置受限制的环境,即通常称为" Kiosk-Mode"。

官方文件可在此处找到: https://developer.android.com/work/cosu.html

这样做的正式方法建议使用Activity.startLockTask

此功能正常,直到您想要Activity startLockTask()模式下的其他应用启动。 任何启动的活动都不得在新的任务堆栈上启动,否则系统会阻止启动意图,即没有Intent.FLAG_ACTIVITY_NEW_TASK

有些应用程序可以启动,其他应用程序似乎隐式设置了这个标志,但是可以使用startActivityForResult(...)解决方法,这似乎删除了NEW_TASK标志。对于仍然无法工作的应用,我可以编写自己的替代品。

真正的问题是调用应用程序,它强制执行新的任务堆栈。触发呼叫会启动呼叫,不会显示呼叫活动,但也会在状态栏中发出呼叫通知(使用startLockTask()时无法访问该状态栏。 与其他应用程序相比,呼叫应用程序也是一个无法用自定义应用程序替换的应用程序...

DevicePolicyManager.html.setLockTaskPackages()对此行为没有影响。

2 个答案:

答案 0 :(得分:1)

我尝试在锁定模式下启动启动调用意图并弹出此行:

    system_process E/ActivityManager: Attempted Lock Task Mode violation mStartActivity=ActivityRecord{56ab302 u0 com.android.server.telecom/.components.UserCallActivity t155}

所以我添加

    setLockTaskPackages(<ComponentName>,new String[]{getPackageName(),"com.google.android.dialer","com.android.server.telecom"});

管理以拨出拨号器。当然,如果我按下主页按钮或后退按钮,则无法将拨号器返回...但最近的按钮仍然处于锁定状态。接收呼叫工作正常(所有按钮都被禁用)

答案 1 :(得分:0)

你试过这个吗?

setLockTaskPackages(new ComponentName(this, DeviceAdminReceiver.class),new String[]{getPackageName(),"com.google.android.dialer"});