Hasta ahora mi código se ve así:
1. Descargue el archivo APK y guárdelo en el almacenamiento interno:
Uso de servicios de dependencia
Aplicación.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. Instale el archivo APK desde el almacenamiento interno:
Aplicación.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); }Esta última función no funciona. Creo que Android. Support ya no es compatible.
También probé esto:
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);Nada funciona
¿Conoces otra forma de instalar APK mediante programación en Xamarin.Forms (Android)?