设备所有者Android应用程序的OTA更新(信息亭模式)
如前所述,我可以通过NFC制作我的应用程序,即设备所有者应用程序。现在我想通过“空中传送”更新我的应用程序,但我找不到一个没有根的方法 如前所述,谷歌为企业开发应用程序提供了许多选择,但没有提供通过OTA更新应用程序的方法设备所有者Android应用程序的OTA更新(信息亭模式),android,nfc,updates,kiosk-mode,device-owner,Android,Nfc,Updates,Kiosk Mode,Device Owner,如前所述,我可以通过NFC制作我的应用程序,即设备所有者应用程序。现在我想通过“空中传送”更新我的应用程序,但我找不到一个没有根的方法 如前所述,谷歌为企业开发应用程序提供了许多选择,但没有提供通过OTA更新应用程序的方法 正在寻找解决方案。创建一个用于后台检查更新的服务。如果更新可用,下载apk文件并将其写在SD卡上。等待几秒钟以完全刷新写入。然后调用以下代码安装新的apk Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDa
正在寻找解决方案。创建一个用于后台检查更新的服务。如果更新可用,下载apk文件并将其写在SD卡上。等待几秒钟以完全刷新写入。然后调用以下代码安装新的apk
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);
fileName
是sd卡上新apk文件的路径。您可以使用Play Store为应用程序提供更新:
这对于资源调配阶段来说是一项相当大的工作,但是设备将来应该会自动接收更新。这纯粹是猜测,因为我自己从来没有尝试过使用软件包安装程序API: 您可以尝试为设备所有者应用设置安装程序包(使用
PackageManager.setInstallerPackageName()
)。此安装程序包需要是一个单独的APK,并使用与设备所有者APK相同的证书签名
getPackageManager().setInstallerPackage("<device.owner.package.name>", "<installer.package.name>");
我不确定这是否会以静默方式安装您的更新(或者是否以我预期的方式工作).我想你可能想成为EMM/MDM合作伙伴应用程序。它类似于设备所有者应用程序,但具有增强的权限和api。通常,三星/HTC等原始设备制造商为MDM合作伙伴应用程序提供隐藏的api以升级应用程序。我不确定Android for Work是否也提供此api
例如:OEM提供了一个名为updatePackage(String packageName)的api,设备上的MDM客户端可以使用该api更新包。您也可以使用该api更新设备所有者应用程序。Evolve()可能会有帮助。我已经看到了,但无法使用它,而且它处于alpha阶段,这可能会导致我们的应用程序崩溃。它似乎在运行时更改代码,所以看起来有点复杂。@Shubham,你让它工作了吗?@Maragues 2年前,没有支持,我不是abe做的。@Shubham非常感谢,这就是为什么我想的原因。不幸的是,我的client仍然有很多4.4.2设备:(我希望以静默方式进行安装。您的方法不会以静默方式安装apk。这将打开安装UI,并且必须签入设置“允许从未知源进行安装”谢谢你的回答。我也想到了同样的问题,但这需要在我避免使用的设备上设置gmail帐户,因为该应用程序是针对KIOSK模式的。@Shubham如果你尝试这种方法,我非常乐意得到反馈,如果这能如我所料(或者如果不是你遇到的问题)。我无法尝试您的答案,但对Package Installer进行了更多的研究,发现提交会话需要root权限。我仍将很快尝试并向您提供反馈。
PackageInstaller pi = getPackageManager().getPackageInstaller();
int sessId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
PackageInstaller.Session session = pi.openSession(sessId);
OutputStream out = session.openWrite("app");
// .. write updated APK file to out
session.fsync(out);
session.commit(...);
session.close();