简体   繁体   English

Xamarin android 以编程方式下载并安装 apk

[英]Xamarin android download and install apk programatically

So I have a button that verifies for updates and when I click it I want it to download and install the apk but I keep getting the error There was a problem parsing the package .所以我有一个按钮来验证更新,当我点击它时,我希望它下载并安装 apk,但我一直收到错误There was a problem parsing the package

Downloading ->下载 ->

          var imagePath = Path.Combine(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).ToString(), "abcFichaObrasUpdate");
          using (WebClient client = new WebClient())
          {
            try
            {
              if (!Directory.Exists(imagePath.ToString()))
              {
                Directory.CreateDirectory(imagePath.ToString());
              }
              Uri uri = new Uri(remoteUri);
              client.DownloadFileCompleted += (s, e) => Extract(s, e, progress);
              client.DownloadProgressChanged += (s, e) => ProgessChanged(s, e);
              client.DownloadFileAsync(uri, imagePath + "/" + "update.apk");
            }
            catch (Exception)
            {
              throw;
            }
          }

So when the download is finished it save's in a path something like that /storage/emulated/0/Download/abcFichaObrasUpdate/update.apk因此,当下载完成后,它会保存在类似于/storage/emulated/0/Download/abcFichaObrasUpdate/update.apk的路径中

Instaling ->安装 ->

        Java.IO.File updatePath = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).ToString(), "abcFichaObrasUpdate");
        Java.IO.File toInstall = new Java.IO.File(updatePath, "update.apk");
        Android.Net.Uri apkUri = Android.Support.V4.Content.FileProvider.GetUriForFile(Application.Context,
                AppInfo.PackageName + ".provider",
                toInstall);
        Intent intent = new Intent(Intent.ActionView);
        intent.SetFlags(ActivityFlags.GrantReadUriPermission);
        intent.SetFlags(ActivityFlags.ClearTop);
        intent.SetFlags(ActivityFlags.NewTask);
        intent.PutExtra(Intent.ExtraNotUnknownSource, true);
        intent.SetData(apkUri);
        Application.Context.StartActivity(intent);

AndroidManifest.xml AndroidManifest.xml

    <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.abcbraga.abcfichaobras.provider" android:exported="false" android:grantUriPermissions="true">
      <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" />
    </provider>

filepaths.xml文件路径.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path
    name="external"
    path="." />
  <external-files-path
      name="external_files"
      path="." />
  <files-path
      name="files"
      path="." />
</paths>

But when it gets the apkUri it transforms it to {content://com.abcbraga.abcfichaobras.provider/external/Download/abcFichaObrasUpdate/update.apk} and when it tries to start the install activity it just throws the error, I think the problem is in the URI.但是当它获得 apkUri 时,它会将其转换为{content://com.abcbraga.abcfichaobras.provider/external/Download/abcFichaObrasUpdate/update.apk}并且当它尝试启动安装活动时它只会抛出错误,我认为问题出在 URI 中。

To make it work I changed provider为了让它工作,我改变了供应商
From android support v4从 android 支持 v4

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.abcbraga.abcfichaobras.provider" android:exported="false" android:grantUriPermissions="true">
   <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" />
</provider>

To androidx core content到androidx核心内容

<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" />
</provider>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM