DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jaytang
今日帖子: 0
在线用户: 2
导航: 论坛 -> 文档资料 斑竹:liumazi,ruralboy  
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
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方法取失败原因。
此帖子包含附件:
JPEG 图像
大小:105.0K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
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.
此帖子包含附件:
JPEG 图像
大小:99.0K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
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"
      }]
   }


五、运行测试程序,看效果
此帖子包含附件:
JPEG 图像
大小:41.0K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/8/18 21:39:09
3楼: 点击ok后开始安装,系统会自动提示老版本关闭、新版本安装过程、以及最后是完成还是打开新版程序:
此帖子包含附件:
JPEG 图像
大小:30.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/8/18 21:40:36
4楼: 然后,手机上的程序,就和服务器上的apk包的程序版本保持一致了,然后,再次运行和升级处理时,就不再需要升级处理了:
此帖子包含附件:
JPEG 图像
大小:36.8K
----------------------------------------------
樵夫的大马甲
作者:
男 heql (heql) ★☆☆☆☆ -
普通会员
2014/8/18 23:17:08
5楼: 厉害!
----------------------------------------------
-
作者:
男 chscheese (chscheese) ★☆☆☆☆ -
盒子活跃会员
2014/8/18 23:37:16
6楼: 好。
----------------------------------------------
-
作者:
男 fenglijun (delphicdwww) ★☆☆☆☆ -
普通会员
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
作者:
男 qjh0142008 (qjh0142008) ▲▲▲▲▲ -
普通会员
2014/8/19 12:25:29
9楼:
----------------------------------------------
-
作者:
男 lqgvt (lqgvt) ★☆☆☆☆ -
盒子活跃会员
2014/8/19 13:10:06
10楼: 灰常感谢
----------------------------------------------
人世间,无所谓爱,无所谓情!只是人们叫得多了才有了爱情!
作者:
男 defo_xyf (王坤) ★☆☆☆☆ -
普通会员
2015/3/18 21:54:37
11楼: 控件呢?
----------------------------------------------
共同努力,超过美国老.....
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/3/19 3:24:56
12楼: 在quickburro的移动开发包中已经包含
(fmxsdk或apmsdk下)
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
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、运行效果截图:
此帖子包含附件:
PNG 图像
大小:151.0K
----------------------------------------------
樵夫的大马甲
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行150.3906毫秒 RSS