一、测试通过环境:
Delphi 10.1(Berlin) | Android 5.1、6.0 |
Delphi 11(Alexandria)11.1 | Android 10 |
二、注意事项:
在高版本的Delphi下需要进行如下设置:
Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check it
如果不勾选这个参数(默认是没有勾选的),就会如下错误提示:Couldn't find meta-data for provider with authority,从而升级不成功。这个提示需要跟踪,否则程序界面并没有错误提示,而是显示需要其它程序打开,并不能进入安装程序界面。
三、升级函数
uses
Androidapi.JNI.JavaTypes,
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText;
procedure Install_NewVersion;
{$IFDEF ANDROID}
var
APK_FileName : string;
LFile : JFile; //不要删除这一行
Intent : JIntent;
{$ENDIF}
begin
{$IFDEF ANDROID}
APK_FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetTempPath,'A.apk');
if not FileExists(APK_FileName) then Exit;
try //如果把debug的版本给Release安装,就会出现问题,导致程序无法启动,所以需要使用try
{$IF CompilerVersion>=33.0} //Delphi 10.3开始
Intent := TJIntent.Create;
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
try
Intent.SetDataAndType(TAndroidHelper.JFileToJURI(TJFile.JavaClass.init(StringToJString(APK_FileName))),
StringToJString('application/vnd.android.package-archive'));
except on E: Exception do
//这里会出现 Couldn't find meta-data for provider with authority 错误
end;
TAndroidHelper.Activity.startActivity(Intent);
{$ELSE}
LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(APK_FileName)), StringToJstring('A.apk'));
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setDataAndType(TJnet_Uri.JavaClass.fromFile(LFile), StringToJString('application/vnd.android.package-archive'));
TAndroidHelper.Context.startActivity(Intent);
//TAndroidHelper.Activity.startActivity(Intent);
{$ENDIF}
except on E: Exception do
begin
//Write_err('TCloud_Update_App.Install_NewVersion','安装APK出错: ' + E.Message);
end;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
//此处安装 windows 升级程序
{$ENDIF}
end;
四、参考文档:
1. Delphi 安卓App自动升级(示例代码)_136.la
2. 盒子论坛 v2.1