Delphi Android アプリは自動的にアップグレードされます

Androidapi.JNI.Support はこのユニットを参照します

プロシージャ _InstallApk(Apk: 文字列); 
var 
  LFile: JFile; 
  LIntent: JIntent; 
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); 
終わり; 
プロシージャ InstallApk(Apk: string); 
var 
  LFile: JFile; 
  LIntent: JIntent; 
  LNet_Uri: Jnet_Uri; 
始める
  TOSVersion.Check(7, 0) でない場合は、
    _InstallApk(Apk)
  を開始します。
    出口; 
  終わり; 
  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 
    // 修正: android.os.FileUriExusedException: Intent.getData() を通じてアプリを超えて公開される
    // プロジェクト -> オプション -> アプリケーション -> 資格リスト -> 安全なファイル共有 -> チェックを入れます
    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); 
終わり;

コードをコピーする

Android 8.0 以降の場合、マニフェストに権限を追加する必要があります。

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> を AndroidManifest.template.xml ファイルに追加するだけです

TPath を使用してパスを処理します (クロスプラットフォーム パスは、System.IOUtils で提供されるものを使用して記述する必要があります)。

たとえば、
APK := TPath.Combine(TPath.GetTempPath, 'new.apk');

download('server:// foo /bar/new.apk', APK); // APK として保存

InstallAPK(APK);

Android プラットフォーム上のパスは *nix ルールに従い、独自のアプリケーションではプレフィックスは必要ありません。

おすすめ

転載: blog.csdn.net/tjsoft/article/details/132401934