以编程方式固定第 3 方应用程序的屏幕

Screen pinning 3rd party apps programmatically

获得设备所有权后,我正在尝试实现一种方法来指示设备将任何给定应用程序锁定为信息亭模式(或屏幕固定模式)。由于我拥有设备所有权,因此不需要用户这样做的权限。

来自开发者网站的简短描述告诉我可以做我正在尝试的事情:

http://developer.android.com/about/versions/android-5.0.html#ScreenPinning

Programmatically: To activate screen pinning programmatically, call startLockTask() from your app. If the requesting app is not a device owner, the user is prompted for confirmation. A device owner app can call the setLockTaskPackages() method to enable apps to be pinnable without the user confirmation step.

这表明作为设备所有者应用程序,我可以在没有用户确认的情况下固定其他应用程序...但我不知道该怎么做。

我已经能够将我自己的应用程序置于固定模式。

如有任何帮助,我们将不胜感激。

下面是一段代码片段,可以帮助您继续:

DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);

if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {
    // Device owner
    String[] packages = {this.getPackageName()};
    myDevicePolicyManager.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
    // Not a device owner - prompt user or show error
}

if (myDevicePolicyManager.isLockTaskPermitted(this.getPackageName())) {
    // Lock allowed
    startLockTask();
} else {
    // Lock not allowed - show error or something useful here
}

setLockTaskPackages() 用于指定哪些应用程序(通过它们的包名称)将能够以编程方式固定 而无需用户确认 setLockTaskPackages() 是从您的 设备所有者应用程序 调用的(很可能在您的 DeviceAdminReceiveronEnabled() 方法中)。

因此,在您的所有者设备应用程序中,您将拥有类似的内容:

mDPM.setLockTaskPackages("com.foo.myapp");

然后,在您的 "com.foo.myapp" 应用程序中,您将被自动调用:

startLockTask(); 

您的应用程序将立即进入 Pinning 模式,无需任何用户确认。

如果您不先 register 您的应用 setLockTaskPackages,该应用将被固定,但用户必须先确认。

另请注意,当应用 registeredsetLockTaskPackages() 时,它的行为与 手动 pin:

有一些不同
  • 用户无法通过长按 返回 + 最近使用的应用程序 手动取消固定应用程序。您必须使用 stopLockTask();
  • 以编程方式取消固定您的应用
  • "Home" 和 "Recent Apps" 按钮不可见(不显示)
  • 当应用程序被取消固定时(通过 stopLockTask()),用户将直接返回主页:不显示屏幕锁定,即使设置了键盘锁(图案、代码或任何键盘锁屏幕)。

我没有足够的声誉来发表评论,只是想指出对于带有物理按钮的设备(比如@chairman 提到的三星 Galaxy Tab A),一种管理应用程序强制取消固定的方法是实现在您的 DeviceAdminReceiver class 中:

@Override public void onLockTaskModeExiting(Context context, Intent intent)

因此,如果您的用户想要取消固定,您可以随时重新固定您的应用 ;)