'Install APK by programmatically Xamarin.Forms (Android)

So far my code looks like this:

1. Dowload the APK file and save it into internal storege:

Using DependencyServices

App.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. Intall the APK file from the internal storege:

App.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);
    }

This last function doesn't work. I think Android.Support its not support any more.

I also tried this:

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

Nothing works

Do you know other way to install APK by programmatically in Xamarin.Forms (Android)?



Solution 1:[1]

Use PackageInstaller instead. ActionView and ACTION_INSTALL_PACKAGE had been deprecated in API level 29.

Have you tried this solution? Android PackageInstaller not installing APK

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mailin