簡體   English   中英

通過編程方式安裝 APK Xamarin.Forms (Android)

[英]Install APK by programmatically Xamarin.Forms (Android)

到目前為止,我的代碼如下所示:

1. 下載APK文件並保存到內部存儲:

使用依賴服務

應用程序.xaml.cs

    IDownloader downloader = DependencyService.Get<IDownloader>();

    protected override void OnStart(){
        downloader.OnFileDownloaded+=OnFileDownloaded;
        downloader.DownloadFile("http://localhost:8080/download","folder"); 
    }

    private void OnFileDownloaded(object sender,DownloadEventArgs e) {
        if(e.FileSaved) {
            App.Current.MainPage.DisplayAlert("XF Downloader","File Saved Successfully","Close"); 
        } else {
            App.Current.MainPage.DisplayAlert("XF Downloader","Error while saving the file","Close");
        }
    }

Android: AndroidDownloader.cs

[assembly: Dependency(typeof(NoguianaNucleo.Droid.AndroidDownloader))]
namespace NoguianaNucleo.Droid { 
  public class AndroidDownloader: IDownloader {
    public event EventHandler<DownloadEventArgs> OnFileDownloaded;

    public void DownloadFile(string url,string folder) {

        string pathToNewFolder = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),folder);
        Directory.CreateDirectory(pathToNewFolder);

        try {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted+=new AsyncCompletedEventHandler(Completed);
            string pathToNewFile = Path.Combine(pathToNewFolder,"nucleo.apk");
            webClient.DownloadFileAsync(new Uri(url),pathToNewFile);
        } catch(Exception ex) {
            if(OnFileDownloaded!=null)
                OnFileDownloaded.Invoke(this,new DownloadEventArgs(false));
        }
    }

    private void Completed(object sender,AsyncCompletedEventArgs e) {
        if(e.Error!=null) {
            App.Current.MainPage.DisplayAlert("Error", e.Error.Message,"Ok");
            if(OnFileDownloaded!=null)
                OnFileDownloaded.Invoke(this,new DownloadEventArgs(false));
        } else {
            if(OnFileDownloaded!=null)
                OnFileDownloaded.Invoke(this,new DownloadEventArgs(true));
        }
    }
  }
}

2. 從內部存儲安裝 APK 文件:

應用程序.xaml.cs

    public void OpenApk(string filepath) {
        Java.IO.File file = new Java.IO.File(filepath);
        Intent install = new Intent(Intent.ActionView);

        // Old Approach
        if(Android.OS.Build.VERSION.SdkInt<Android.OS.BuildVersionCodes.N) {
            install.SetFlags(ActivityFlags.NewTask|ActivityFlags.GrantReadUriPermission);
            install.SetDataAndType(Android.Net.Uri.FromFile(file),"application/vnd.android.package-archive"); //mimeType
        } else {
            Android.Net.Uri apkURI = Android.Support.V4.Content.FileProvider.GetUriForFile(Android.App.Application.Context,Android.App.Application.Context.ApplicationContext.PackageName+".fileprovider",file);
            install.SetDataAndType(apkURI,"application/vnd.android.package-archive");
            install.AddFlags(ActivityFlags.NewTask);
            install.AddFlags(ActivityFlags.GrantReadUriPermission);
        }

        Android.App.Application.Context.StartActivity(install);
    }

最后一個 function 不起作用。 我認為Android。支持它不再支持了。

我也試過這個:

   var downloadUri = Android.Net.Uri.Parse("/data/user/0/noguiana.nucleo/files/noguiana/nucleo.apk");
   Intent install = new Intent(Intent.ActionInstallPackage);
   install.AddFlags(ActivityFlags.GrantReadUriPermission);
   install.AddFlags(ActivityFlags.GrantWriteUriPermission);
   install.AddFlags(ActivityFlags.GrantPersistableUriPermission);
   install.SetDataAndType(downloadUri,"application/vnd.android.package-archive");     
   context.StartActivity(install);

沒有任何作用

您知道在 Xamarin.Forms (Android) 中以編程方式安裝 APK 的其他方法嗎?

請改用 PackageInstaller。 ActionView 和 ACTION_INSTALL_PACKAGE 已在 API 級別 29 中棄用。

你試過這個解決方案嗎? Android PackageInstaller 未安裝 APK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM