Hi,
ich habe das so umgesetzt:
1. Download des APK, das sollte asynchron / im Hintergrund geschehen, da sonst die App nicht mehr reagiert.
Delphi-Quellcode:
HttpClient := THTTPClient.Create;
try
DestFile := TFileStream.Create('/sdcard/Download/' + DestFileName, fmCreate);
HttpClient.Get(UpdateFile.DownloadURL, DestFile);
finally
DestFile.Free;
end;
2. "Aufruf" des heruntergeladenen APK mittels Intent. FÜhrt dazu, dass der Benutzer das APK installieren und neu starten kann, oder abbrechen.
Diesen Aufruf führe ich im Synchronized/Mainthread aus.
Quelle:
http://www.fmxexpress.com/build-your...ey-on-android/
Delphi-Quellcode:
aFile := TJFile.JavaClass.init(StringToJString('/sdcard/Download'), StringToJString(DestFileName));
Intent := TJIntent.Create;
Intent.setAction(TJintent.JavaClass.ACTION_VIEW);
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setDataAndType(TJnet_Uri.Javaclass.fromFile(aFile), //Androidapi.JNI.Net.pas
StringToJString('application/vnd.android.package-archive'));
SharedActivityContext.startActivity(Intent);
Für asynchrone Funktionen die ein synchrone (bei z.B. Aktualisierung der
GUI) Aktion triggern habe ich eine kleine Hilfsfunktion geschrieben:
Die Fkt. ShowActivity und HideActivity öffnen und schließen hier eine Form, die einen Ladebalken (Kreis) anzeigt und die Eingaben des Benutzer ignoriert (HardwareBack-Key).
Delphi-Quellcode:
procedure CallAsync(AsyncProc : TThreadProcedure; SyncProcCalledAfterAsync : TThreadProcedure);
begin
if (Assigned(AsyncProc)) then begin
ShowActivity;
TThread.CreateAnonymousThread(
procedure ()
begin
try
AsyncProc;
finally
TThread.Synchronize(nil,
procedure
begin
HideActivity;
if (Assigned(SyncProcCalledAfterAsync)) then begin
SyncProcCalledAfterAsync;
end;
end);
end;
end).Start;
end;
end;
Gruß
sevo