2

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

我正在尝试在 Android 设备上设置受限环境,即通常称为“Kiosk 模式”的环境。

官方文档可以在这里找到: https ://developer.android.com/work/cosu.html

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

这可以正常工作,直到您想从您Activity处于startLockTask()模式中的其他应用程序中启动其他应用程序。启动的任何活动都不得在新的任务堆栈上启动,否则系统会阻止启动意图,即 no Intent.FLAG_ACTIVITY_NEW_TASK

一些应用程序可以刚刚启动,其他应用程序似乎隐式设置此标志,但可以通过使用startActivityForResult(...)which似乎删除NEW_TASK标志来解决。对于仍然无法运行的应用程序,我可以编写自己的替换代码。

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

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

4

2 回答 2

3

我试图在锁定模式下启动呼叫意图,并弹出此行:

    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"});

设法让拨号器退出。当然,如果我按下主页按钮或返回按钮,就无法让拨号器恢复正常……不过,最近的按钮仍然被锁定。接听电话工作正常(所有按钮都被禁用)

于 2017-04-23T15:50:22.133 回答
0

你试过这个吗?

setLockTaskPackages(new ComponentName(this, DeviceAdminReceiver.class),new String[]{getPackageName(),"com.google.android.dialer"});
于 2017-04-23T10:58:21.657 回答