(私人)Android应用的自动更新
我正在开发一个非公开的Android应用程序,即该应用程序将无法在全球Android Market中使用。 该应用程序将被安装在有限的客户端,例如通过使用apk文件。 如何在这个应用程序中启用自动更新function?
我看到了不同的潜在select(我不知道这些选项是否技术上很难甚至不可能实现,或者是否有任何可以重用的function):
- 在每次启动时,应用程序会testing是否存在新版本(通过请求服务器),如果是的话,下载新的apk并用新版本replace。
- 使用(或开发?)分离的应用程序或服务来执行更新检查和replace过程。
- 使用(或开发?)具有自动更新选项的私人市场应用程序。 这个选项类似于第二个,但更通用:市场应用程序将连接到一个存储库,即它将处理任意数量的(私人)应用程序。
我更喜欢选项一,因为自动更新function包含在需要较less开发工作的应用程序中。
janjonas,在我工作的公司,我们遇到了与Windows Mobile 6.x类似的问题,我们使用了与EboMike指出的几乎相同的解决scheme:
主应用程序检查它是否更新,对WebService。 它接收当前版本和从哪里下载新版本的URL,如有必要。 主应用程序然后启动更新程序应用程序,传递URL,然后退出。
更新程序通过HTTP下载新程序,向用户显示下载的百分比。 用户可以随时以受控方式取消下载,而Updater可以注册这个取消。
由于新应用程序已下载,更新程序将运行新应用程序并退出。
我认为选项一是工作量最less,实际上也是最干净的一个,因为它将通过使用Android的内置包安装程序的正确渠道,其中包括用户通知和用户select放弃安装如果期望。
你已经完成了所有的概述 – 检查服务器上的新版本(可以让用户selectclosures该选项),如果有新版本,可以使用APK链接到URL (这将使IIRC使用浏览器的下载pipe理器下载),或者你可以下载它与您的应用程序,然后将意图指向您的本地文件。 使用HTTP链接在技术上就不那么简单了,而且越干净越好 – 让操作系统做得越多越好 – 除非没有理由不这样做。
Google Play之外的任何应用程序仍然需要启用“安装非市场应用程序”。 如果未启用,安装过程将要求它并将用户redirect到应用程序设置,之后,用户可以安装该应用程序。
根据您的需要,您可以委托给第三方库。
我们用来完成这个工作的一些权限如下:
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
让我解释一下…最后一个,WRITE_EXTERNAL_STORAGE,是不言自明的。 通过ACCESS_SUPERUSER,我们会告诉系统我们打算使用root权限。 将来需要READ_EXTERNAL_STORAGE才能使您的应用程序读取SD卡上的文件。
假设你已经下载了这个文件,并且所有这些设备都可以被植入(限制数量的客户端,而不是在播放等),你可以这样做:
String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk"; Process installProcess = null; int installResult = -1337; try { installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath); } catch (IOException e) { // Handle IOException the way you like. } if (installProcess != null) { try { installResult = installProcess.waitFor(); } catch(InterruptedException e) { // Handle InterruptedException the way you like. } if (installResult == 0) { // Success! } else { // Failure. :-/ } } else { // Failure 2. :-( }
这可能是一个非常蹩脚的方法,但对于一些公司来说,如果你相信它是适用的,这可能很容易实现。
- 创build一个密码屏幕(passwordActivity),要求input密码才能访问该应用程序。
- input密码后,引发一个标志(使用sharedpreferences将一个布尔值从false设置为true)
- 将.apk文件放在Google Store上。
- 每个人都安装应用程序后更改密码,然后在Google Play商店上发布新的更新。
由于软件要caching标志值,因此即使密码改变,密码画面也不会出现。 它只会显示新的安装,所以可能需要重复该过程。
注意:如果没有数百个用户使用该应用程序,则此方法可能更适合。 而且不要忘记这个方法也不安全。 总之,如果你正在寻找一种方法来保持应用程序的私密性,并没有安全问题,这就是我所推荐的。
更新应用程序确保您已经有位置上的新的apk下载
void installNewVersion(String location) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }