【问题标题】:Screen pinning 3rd party apps programmatically以编程方式固定第 3 方应用程序的屏幕
【发布时间】:2015-01-29 00:06:59
【问题描述】:

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

来自开发者网站,简要说明告诉我可以做我正在尝试的事情:

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

以编程方式:要以编程方式激活屏幕固定,请调用 startLockTask() 从您的应用程序。如果请求的应用程序不是设备 所有者,提示用户确认。 设备所有者应用可以 调用 setLockTaskPackages() 方法以使应用程序可固定 无需用户确认步骤。

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 是您要锁定的应用还是第三方应用?
  • @Hartok ,我要锁定的应用是第 3 方应用。

标签: android android-5.0-lollipop device-policy-manager device-owner android-screen-pinning


【解决方案1】:

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

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

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

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

startLockTask(); 

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

如果您不首先使用setLockTaskPackages register 您的应用程序,则应用程序将被固定,但用户必须先确认。

另外请注意,当一个应用是registeredsetLockTaskPackages() 时,它与手动pin有一些不同的行为:

  • 用户无法通过长按Back + Recent Apps 手动取消固定应用程序。您必须以编程方式使用 stopLockTask() 取消固定您的应用;
  • “主页”和“最近的应用程序”按钮不可见(不显示)
  • 取消固定应用时(通过 stopLockTask()),用户将直接返回主页:即使设置了 Keyguard(模式、代码或任何 Keyguard 屏幕),也不会显示屏幕锁定。

【讨论】:

  • 我们可以使用 setLockTaskPackages 方法固定其他应用吗?
  • @FlorentDupont,您提供的应用程序(例如 com.foo.myapp)是否必须是您发布的必须授权屏幕固定的应用程序?难道我可以锁定,比如说愤怒的小鸟... com.rovio.angrybirds?
  • @suniljain :不,您不能使用 setLockTaskPackages 固定另一个应用程序。您必须使用其他应用程序的 Activity.startLockTask() 来执行此操作。 @kash 是的,在这个例子中,com.foo.myapp 必须由我发布。您不能以编程方式锁定不属于您的其他应用。
  • 我写了一篇关于这个主题的完整文章。可在此处获取:florent-dupont.blogspot.fr/2015/02/…。我希望它能回答你的问题。
  • @FlorentDupont 我写了一个所有者和管理员的应用程序,我可以在没有用户确认的情况下成功固定应用程序,但用户仍然可以长按返回 + 最近的应用程序取消固定应用程序,按钮是仍然存在,因为它们是物理按钮,我的设备是三星 Galaxy Tab。可能是三星的错误实现。
【解决方案2】:

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

@Override public void onLockTaskModeExiting(Context context, Intent 意图)

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

【讨论】:

    【解决方案3】:

    这里有一段代码 sn-p 应该可以帮助您:

    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
    }
    

    【讨论】:

    • 这样我们只能固定自己的应用程序,但正如 kash 解释的那样,他想固定其他应用程序,是否可以使用具有设备所有者权限的 DevicePolicyManager?
    • 从我们的应用程序中固定其他应用程序的任何方式。正如我们所知,主页和最近按钮将是不可见的。那么如何才能让其他应用程序对其进行固定。基本上,要求是能够在信息亭/固定模式下将设备用于多个应用程序。
    • @khubaib 您基本上需要在设备所有者中添加您的应用程序的包名称。然后从您的应用程序中调用 startLockTask()。这是我目前发现的唯一方法。
    • 在哪里可以找到 DeviceAdminSample.class ?
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多