Androidapi.JNI.Support引用这个单元
procedure _InstallApk(Apk: string); varLFile: JFile;LIntent: JIntent; beginLFile := 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); varLFile: JFile;LIntent: JIntent;LNet_Uri: Jnet_Uri; beginif not TOSVersion.Check(7, 0) thenbegin_InstallApk(Apk);Exit;end;LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));LIntent := TJIntent.Create;if TOSVersion.Check(8, 0) thenLIntent.setAction(TJIntent.JavaClass.ACTION_INSTALL_PACKAGE)elseLIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);if TOSVersion.Check(7, 0) thenbegin// fix: android.os.FileUriExposedException: exposed beyond app through Intent.getData()// Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check itLIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);LNet_Uri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,StringToJString(JStringToString(TAndroidHelper.Context.getPackageName) + '.fileprovider'), LFile);endelseLNet_Uri := TJnet_Uri.JavaClass.fromFile(LFile);LIntent.setDataAndType(LNet_Uri, StringToJString('application/vnd.android.package-archive'));TAndroidHelper.Context.startActivity(LIntent); end;
Android 8.0以上要在manifest里加权限
在AndroidManifest.template.xml文件中加入
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>即可。
用TPath处理路径(跨平台的路径相关应该都使用System.IOUtils里提供的东西来写)
例如
APK := TPath.Combine(TPath.GetTempPath, 'new.apk');
download('server://foo/bar/new.apk', APK); // save as APK
InstallAPK(APK);
在安卓平台路径是*nix规则的,自己应用内不需要前缀