Delphi Android App automatically upgrades

Androidapi.JNI.Support references this unit

procedure _InstallApk(Apk: string);
was
  LFile: JFile;
  INTENT: INTENT;
begin
  LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));
  LIntent := TJIntent.Create;
  LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(LFile), StringToJString('application/vnd.android.package-archive'));
  TAndroidHelper.Context.startActivity(LIntent);
end;
procedure InstallApk(Apk: string);
was
  LFile: JFile;
  INTENT: INTENT;
  LNet_Uri: Jnet_Uri;
begin
  if not TOSVersion.Check(7, 0) then
  begin
    _InstallApk(Apk);
    Exit;
  end;
  LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));
  LIntent := TJIntent.Create;
  if TOSVersion.Check(8, 0) then
    LIntent.setAction(TJIntent.JavaClass.ACTION_INSTALL_PACKAGE)
  else
    LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  if TOSVersion.Check(7, 0) then
  begin
    // fix: android.os.FileUriExposedException: exposed beyond app through Intent.getData()
    // Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check it
    LIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
    LNet_Uri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,
      StringToJString(JStringToString(TAndroidHelper.Context.getPackageName) + '.fileprovider'), LFile);
  end
  else
    LNet_Uri := TJnet_Uri.JavaClass.fromFile(LFile);
  LIntent.setDataAndType(LNet_Uri, StringToJString('application/vnd.android.package-archive'));
  TAndroidHelper.Context.startActivity(LIntent);
end;

Copy code

For Android 8.0 and above, you need to add permissions in the manifest.

Just add <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> to the AndroidManifest.template.xml file
.

Use TPath to process paths (cross-platform paths should be written using the things provided in System.IOUtils).

For example,
APK := TPath.Combine(TPath.GetTempPath, 'new.apk');

download('server://foo /bar/new.apk', APK); // save as APK

InstallAPK(APK);

The path on the Android platform follows *nix rules, and no prefix is ​​required in your own application.

Guess you like

Origin blog.csdn.net/tjsoft/article/details/132401934