我有一个信息亭模式的Android非Playstore平板电脑应用程序(我们已经使用adb shell install在设备上安装了该应用程序)。通过组合使用多个DevicePolicyManager方法,设置用户限制并最终通过使用以下shell命令将其设置为设备所有者来实现信息亭模式:
shell dpm set-device-owner com.dps.myapp/.DeviceAdminReceiver
这很有效,可以很好地满足我客户的需求,以使用户除了使用我们的应用执行工作外,还可以在平板电脑上进行任何操作。当我使用设备所有者创建此信息亭版本时,我“假设”我能够像过去一样将将来的更新推送到应用程序中(因此避免了在每次后续更新之前都必须恢复出厂设置)。 shell命令来停止应用程序,将其卸载,然后安装新版本:
shell am force-stop com.dps.myapp
shell pm uninstall com.dps.myapp
install -r C:\\dpsworkspace\\application\\
不幸的是,我现在了解到,您不能简单地卸载设备所有者应用程序,也不能在现有版本顶部安装新版本,而无需在应用程序中出现多个项目。因此,经过多番努力,我设法编写了一个解决方案,以在我的新版本中实现该方案,希望该方案将来能够成功工作,尽管它需要恢复出厂设置才能部署到设备上。我很好奇我是否错过了一种更简单的方法来实现此目标,因为在安装此“新的和改进的”版本之前必须强制恢复出厂设置无法很好地满足用户需求。
我的解决方案包括以下各项的组合:
1-向清单添加android:testOnly =“ true”,以便在安装更新之前可以关闭设备所有者
2-将新的活动(DeactivateDeviceOwnerActivity)添加到应用程序中,该活动可以通过adb shell命令启动,该命令可以反转某些DevicePolicyManager设置并执行
DevicePolicyManager.clearDeviceOwnerApp(getApplicationContext().getPackageName());
3-将我的stop / uninstall / reinstall shell命令更改为以下内容:
shell am force-stop com.dps.myapp
shell am start -n com.dps.myapp/.DeactivateDeviceOwnerActivity
shell pm uninstall com.dps.myapp
install -t C:\\dpsworkspace\\application\\
这一切都很好,并且我已经测试过将进一步的更新推送到此版本的应用程序,而没有任何问题。我的问题是,这一切都是过大的吗?有没有更简单的方法可以做到这一点?我最大的担心是,我可能忽略了一些可以帮助我避免不得不强制恢复出厂设置的事情。
我在这里找到的所有解决方案基本上都指出,由于缺少android:testOnly =“ true”清单属性,并且缺少已嵌入的活动,因此无法将应用程序的当前版本降级为非设备所有者状态完成新的DeactivateDeviceOwnerActivity将要执行的工作。
我已经看到了dpm命令“ remove-active-admin”,但是该命令似乎在我所安装的任何Android安装中都不存在...此外,它需要按顺序显示manifest属性反正工作。此命令是否已从adb命令集中删除?提到它的帖子已经很老了。
感谢您提供的任何见解。对我的情况进行“我现在几乎完全被搞砸了”评估的确认也将有所帮助。我讨厌那种想念树林的烦人的感觉。
答案 0 :(得分:1)
我想知道您为什么要在安装较新版本之前卸载该应用程序。根据我对我们自己的设备所有者应用程序的了解,如果没有 root 访问权限和手动删除一些 xml 文件,根本不可能卸载它。
但是当满足以下先决条件时,您应该能够更新当前设备所有者:
然后,您应该能够通过正常的应用安装操作来安装新版本(将 APK 下载到设备并通过设备上的文件直接安装它,从 adb shell,...)。