本章主要记录关于安卓APP自动更新的方法,以及自动更新可能出现的问题汇总,后续将持续更新
整体的思路如下:
1.在数据库保存APP最新的版本信息
2.APP运行时检测版本是否与最新版匹配,不一致则下载更新安装
3.最新版的安装包放在远程服务器上,通过FTP的方式获取
以上方式适合公司的内部APP升级方式
下面开始进入正题
【获取APP版本信息】
通过以下代码可以得到APP的版本号,如:1.0.1,我们可以按同样的格式将最新版本保存到数据库中,APP版本设置如下图所示
获取APP版本号代码如下,至于获取数据库保存的最新版本号进行对比,则比较简单不述,这里只针对几个关键点进行说明:
function GetAndroidVersion:string;
var
PackageManager: JPackageManager;
PackageInfo: JPackageInfo;
begin
PackageManager := TAndroidHelper.Context.getPackageManager;
PackageInfo := PackageManager.getPackageInfo
(TAndroidHelper.Activity.getPackageName, 0);
Result := JStringToString(PackageInfo.versionName);
end;
【下载APP安装包】
以下是通过FTP的方式获取APP安装包,并将安装包下载至手机本地
1.连接FTP
在界面上放置一个IdFTP1控件,然后写如下代码进行连接
procedure TFrmData.FtpConnect;
var
SPath:string;
begin
IdFTP1.Passive:=True;
IdFTP1.Host:='IP地址';
IdFTP1.Port:=端口;
IdFTP1.Username:='用户名';
IdFTP1.Password:='密码';
IdFTP1.Connect;
IdFTP1.RetrieveCurrentDir;
end;
2.以下代码为下载代码
procedure tFrmData.DownLoadAPK;
var
SPath,UPath:string;
begin
try
FrmData.IdFTP1.ChangeDir('AppUpdate'); //我将安装包放在根目录下面的AppUpdate文件夹内
UPath:='MFD.apk'; //MFD.apk为安装包名称
SPath:=TPath.Combine(TPath.GetSharedDownloadsPath,UPath); //将安装包下载至本地
FrmData.IdFTP1.Get(UPath,SPath,True);
InstallAPK;
except on e:Exception do
ShowMessage(e.Message);
end;
end;
【安装软件包】
procedure InstallAPK;
var
Intent: JIntent;
begin
Intent:=TJIntent.Create;
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
{$IF CompilerVersion>=33.0}
Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
Intent.SetDataAndType(TAndroidHelper.JFileToJURI(TJFile.JavaClass.init(StringToJString(TPath.Combine(TPath.GetSharedDownloadsPath,'MFD.apk')))),
StringToJString('application/vnd.android.package-archive'));
{$ELSE}
Intent.SetDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(url)),
StringToJString('application/vnd.android.package-archive'));
{$ENDIF}
try
TAndroidHelper.Activity.startActivity(Intent);
//SharedActivity.startActivity(Intent); 新版DELPHI,建议用上一行的方法
except
on e: Exception do
begin
ShowMessage('在调用安装过程中,出现异常错误, 具体错误信息如下:'+e.Message);
end;
end;
end;
===================================================================
【升级可能出现的问题】:
【问题1】:
问题现象:出现Couldn’t find meta-data for provider with authority错误,升级不成功,而是显示需要其它程序打开,并不能进入安装程序界面
解决方案:
在高版本的Delphi下需要进行如下设置:
Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check it
【问题二】
以上的代码可能需要引用的单元如下:
uses
{$IFDEF ANDROID}
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android,
Androidapi.Helpers,
Androidapi.Jni.Net,
androidapi.Jni.Os,
{$ENDIF}