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;
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.