导航:
论坛 -> 文档资料
斑竹:liumazi,ruralboy
作者:
2014/8/18 21:30:53
标题:
XE5/XE6下Android手机应用程序自动升级的实现
浏览:3912
加入我的收藏
楼主:
一、方法概述 通过使用Intent和URI可以调用Android系统功能,同样适合打开APK包以实现软件安装,所以,实现Android应用程序的版本检测和自动下载升级,也就简单了。关键的函数如下: {$IFDEF ANDROID} function OpenApkFile(const aFile: string): Boolean; var Intent: JIntent; begin Intent:=TJIntent.Create; Intent.AddFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); Intent.SetAction(TJIntent.JavaClass.ACTION_VIEW); Intent.SetDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(aFile)), StringToJString('application/vnd.android.package-archive')); try SharedActivity.startActivity(Intent); result:=true; except result:=false; end; end; {$ENDIF} 此函数解决了APK的安装问题,剩下要解决的是App程序的版本对比、新版本APK包的下载。为了应用程序更简单地实现自动升级,我们将这些思路结合QuickBurro的文件传输控件,专门封装成功了“Android应用程序自动升级控件——TMBAndroidUpgrade”,集成在了QuickBurro的移动开发包中。 二、控件属性、事件与方法 1、属性 Connection: 所依赖的QuickBurro移动连接控件 ApkPublishFile: 应用服务器上的Apk版本号配置文件名 ApkFileId: 所发布的新版Apk文件标识 LocalVersion: 应用程序当前版本号 这些属性在应用开发时,根据应用服务器APK包发布情况及当前版本号来设置,与实际情况要相符。 2、事件: OnNewVersionFound: 新版本发现时激发的事件 OnDownloadProgress:新版本Apk包下载进度事件 BeforeInstallApk:下载完成新版本Apk,即将开始安装时激发的事件 OnUpgradeFail: 升级失败时激发的事件 OnUpgradeComplete:升级过程全部完成时(无论成败)所激发的事件 以上事件会视实际升级处理情况选择性地激发,使用控件的应用程序可以在事件里显示提示窗、控制是否进行升级等等。 3、方法: StartUpgrade:开始升级方法 AbortUpgrade:异常终止升级方法 LastError:取最后失败错误信息 整个升级过程由StartUpgrade方法开始,若中途想停止,可以调用AbortUpgrade方法,出现失败时,则可以用LastError方法取失败原因。
此帖子包含附件: 大小: 105.0K
----------------------------------------------
樵夫的大马甲
作者:
2014/8/18 21:34:42
1楼:
三、测试程序的编写 新建一个Android移动应用工程,搭建一个测试程序界面。拖进TMBConnection和TMBAndroidUpgrade两个控件。再编写测试代码如下: unit main; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Layouts, FMX.Memo, MBConnection, MBAndroidUpgrade; type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Memo1: TMemo; Label1: TLabel; Button1: TButton; Line1: TLine; Line2: TLine; ProgressBar1: TProgressBar; Button2: TButton; Button3: TButton; Button4: TButton; MBConn: TMBConnection; Upgrade: TMBAndroidUpgrade; Button5: TButton; procedure Button5Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure UpgradeUpgradeFail(Sender: TObject; Error: string); procedure UpgradeNewVersionFound(Sender: TObject; NewVersion: string; var toContinue: Boolean); procedure UpgradeDownloadProgress(Sender: TObject; AllBlocks, OkBlocks: Integer); procedure UpgradeBeforeInstallApk(Sender: TObject; var toContinue: Boolean); procedure UpgradeUpgradeComplete(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} // // 准备... procedure TForm1.Button5Click(Sender: TObject); begin if mbconn.connect then memo1.lines.add('连接服务器成功,可继续测试!') else memo1.lines.add('***连接服务器失败,无法继续测试!'); end; // // 退出... procedure TForm1.Button1Click(Sender: TObject); begin if mbconn.connected then mbconn.disconnect; halt; end; // // 检查版本... procedure TForm1.Button4Click(Sender: TObject); begin memo1.Lines.Add('本App的当前版本号='+upgrade.LocalVersion); end; // // 开始升级处理... procedure TForm1.Button2Click(Sender: TObject); begin memo1.Lines.Add('升级处理开始...'); upgrade.StartUpgrade; end; // // 中断升级... procedure TForm1.Button3Click(Sender: TObject); begin memo1.Lines.Add('中断升级处理!'); upgrade.AbortUpgrade; end; // // 升级处理失败... procedure TForm1.UpgradeUpgradeFail(Sender: TObject; Error: string); begin memo1.Lines.Add('升级失败!Error='+error); end; // // 发现新版本... procedure TForm1.UpgradeNewVersionFound(Sender: TObject; NewVersion: string; var toContinue: Boolean); begin memo1.Lines.Add('发现有新版本!NewVersion='+NewVersion); toContinue:=true; end; // // 文件下载进度... procedure TForm1.UpgradeDownloadProgress(Sender: TObject; AllBlocks, OkBlocks: Integer); begin ProgressBar1.Max:=AllBlocks; ProgressBar1.Value:=OkBlocks; end; // // 准备安装apk... procedure TForm1.UpgradeBeforeInstallApk(Sender: TObject; var toContinue: Boolean); begin ShowMessage('新版本下载完成,点确定开始安装!'); toContinue:=true; end; // // 升级完成... procedure TForm1.UpgradeUpgradeComplete(Sender: TObject); begin memo1.Lines.Add('升级处理完成!'); end; end.
此帖子包含附件: 大小: 99.0K
----------------------------------------------
樵夫的大马甲
作者:
2014/8/18 21:37:16
2楼:
四、升级版本APK包的发布 我们制作一个V2.0.0.0的新版本apk包,发布到中间件,并设置好版本配置文件的内容如下,以便升级检测版本: { "ModuleCount": 1, "ModuleList": [{ "FileId": "testapk", "FileName": "upgradefiles\\androidupgrade.apk", "FileDesc": "测试用的apk", "FileType": 1, "FileVersion": "2.0.0.0" }] } 五、运行测试程序,看效果
此帖子包含附件: 大小: 41.0K
----------------------------------------------
樵夫的大马甲
作者:
2014/8/18 21:39:09
3楼:
点击ok后开始安装,系统会自动提示老版本关闭、新版本安装过程、以及最后是完成还是打开新版程序:
此帖子包含附件: 大小: 30.1K
----------------------------------------------
樵夫的大马甲
作者:
2014/8/18 21:40:36
4楼:
然后,手机上的程序,就和服务器上的apk包的程序版本保持一致了,然后,再次运行和升级处理时,就不再需要升级处理了:
此帖子包含附件: 大小: 36.8K
----------------------------------------------
樵夫的大马甲
作者:
heql (heql)
★☆☆☆☆
-
普通会员
2014/8/18 23:17:08
5楼:
厉害!
----------------------------------------------
-
作者:
2014/8/18 23:37:16
6楼:
好。
----------------------------------------------
-
作者:
2014/8/19 8:15:44
7楼:
谢谢分享
----------------------------------------------
-delphi1,2,3,4(正版4.5wrmb),6,7。。。xe6
作者:
axfx (axfx)
▲▲▲▲▲
-
普通会员
2014/8/19 9:22:48
8楼:
很强大。
----------------------------------------------
超低价出售pos/进销存/收银软件源码 https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.4fee645eC26dvB&ft=t&id=671027238807
作者:
2014/8/19 12:25:29
9楼:
好
----------------------------------------------
-
作者:
lqgvt (lqgvt)
★☆☆☆☆
-
盒子活跃会员
2014/8/19 13:10:06
10楼:
灰常感谢
----------------------------------------------
人世间,无所谓爱,无所谓情!只是人们叫得多了才有了爱情!
作者:
2015/3/18 21:54:37
11楼:
控件呢?
----------------------------------------------
共同努力,超过美国老.....
作者:
2015/3/19 3:24:56
12楼:
在quickburro的移动开发包中已经包含 (fmxsdk或apmsdk下)
----------------------------------------------
樵夫的大马甲
作者:
2015/9/16 8:32:00
13楼:
此控件最近新增了一个不需要升级事件OnDonotNeedUpgrade,以更易于主程序在程序启动时编写升级处理过程。 以下是实际项目中的升级处理代码和效果截图: 1、升级处理代码: // // 登录成功,开始升级处理... Upgrade.Connection:=mainform.MBConn; Upgrade.StartUpgrade; ... // // 不需要升级时,直接打开主界面... procedure TLoginForm.UpgradeDonotNeedUpgrade(Sender: TObject); begin mainform.Show; end; // // 发现新版本时,打开升级进度窗... procedure TLoginForm.UpgradeNewVersionFound(Sender: TObject; NewVersion: string; var toContinue: Boolean); begin PopupManager.ShowProgress('自动更新','正在下载新版本,请稍候...',99); toContinue:=true; end; // // 下载完成开始安装APK前,关闭进度窗... procedure TLoginForm.UpgradeBeforeInstallApk(Sender: TObject; var toContinue: Boolean); begin PopupManager.CloseProgress(99); end; // // 下载进度... procedure TLoginForm.UpgradeDownloadProgress(Sender: TObject; AllBlocks, OkBlocks: Integer); begin PopupManager.SetProgress(99,AllBlocks,OkBlocks); end; // // 升级失败时,关闭进度窗并进入主界面... procedure TLoginForm.UpgradeUpgradeFail(Sender: TObject; Error: string); begin PopupManager.CloseProgress(99); mainform.Show; end; 2、运行效果截图:
此帖子包含附件: 大小: 151.0K
----------------------------------------------
樵夫的大马甲