C# Xamarin Android 从 APK 文件更新应用程序

问题描述 投票:0回答:1

我正在开发一个 Xamarin Android 应用程序,当我单击按钮时需要自行更新。

下载成功,我发现我的设备的下载文件夹中有一个文件(.apk)。

然后我需要执行该文件。

当我处于调试模式时,应用程序告诉我需要获得从源安装的权限。 然后我收到开始更新的消息。 最后,我收到消息“应用程序未安装,因为该包与已存在的包冲突。”

我已经阅读了这里那里为什么。

因此,我在 V1 中编译应用程序,然后将 V2 中的应用程序上传到驱动器上。 我在设备上安装 V1,单击“更新”按钮,然后下载文件但不更新。 它甚至没有向我显示调试中的消息。

这是我的代码:

在 AndroidManifest.xlm 中我有:

<provider android:name="androidx.core.content.FileProvider" android:authorities="com.companyname.bingowmc.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
        </provider>

并且:

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
  <uses-permission android:name="android.permission.ACTION_INSTALL_PACKAGE" />
  <uses-permission android:name="android.permission.EXTRA_INSTALLER_PACKAGE_NAME" />
  <uses-permission android:name="android.permission.EXTRA_NOT_UNKNOWN_SOURCE" />
  <uses-permission android:name="android.permission.EXTRA_ALLOW_REPLACE" />
  <uses-permission android:name="android.permission.RESTART_PACKAGES" />

我有一个provider_path.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <!--external-path name="external_files" path="." />-->
  <external-path name="external" path="." />
  <external-files-path name="external_files" path="." />
  <files-path name="files" path="." />
</paths>

还有 C# 代码:

private async Task InstallApk(IDownloadFile file)
        {
            try
            {
                string destinationPath = GetLocalDownloadPathFromFileName("BingoWMC.apk");
                await CopyDownloadedFile(file, destinationPath);

                Java.IO.File apkFile = new Java.IO.File(destinationPath);
                Intent intent = new Intent(Intent.ActionView);

                if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
                {
                    Android.Net.Uri apkURI = AndroidX.Core.Content.FileProvider.GetUriForFile(Android.App.Application.Context, "com.companyname.bingowmc.fileprovider", apkFile);
                    intent.SetDataAndType(apkURI, "application/vnd.android.package-archive");
                    //intent.AddFlags(ActivityFlags.GrantReadUriPermission | ActivityFlags.NewTask | ActivityFlags.ClearTop);
                    intent.AddFlags(ActivityFlags.NewTask);
                    intent.AddFlags(ActivityFlags.GrantReadUriPermission);
                    intent.AddFlags(ActivityFlags.ClearTop);
                    intent.PutExtra(Intent.ExtraNotUnknownSource, true);
                }
                else
                {
                    intent.SetDataAndType(Android.Net.Uri.FromFile(apkFile), "application/vnd.android.package-archive");
                    intent.SetFlags(ActivityFlags.NewTask);
                }

                Android.App.Application.Context.StartActivity(intent);
                OnUpdateStatusChanged(new UpdateStatusEventArgs(UpdateStatusEventArgs.UpdateStatusType.Completed, "Update installed successfully"));
            }
            catch (Exception ex)
            {
                OnUpdateStatusChanged(new UpdateStatusEventArgs(UpdateStatusEventArgs.UpdateStatusType.Failed, ex.Message));
            }
        }

有人看到出了什么问题吗?

我已经尝试了这些主题中提出的解决方案来编写我的代码: 用于以编程方式更新 apk 的 Xamarin 应用程序

Xamarin Android 应用程序更新

Xamarin,从应用程序内更新现有应用程序。没有任何服务。更新时出现应用程序未安装错误。安卓

如何使Xamarin Forms应用程序自动更新?

但我想它仍然缺少一些东西。

android xamarin apk
1个回答
0
投票

我想通了;我只需要等待,一切都会好起来的。更正后的代码是:

private async Task InstallApk(IDownloadFile file)
    {
        try
        {
            string destinationPath = GetLocalDownloadPathFromFileName("BingoWMC.apk");
            await CopyDownloadedFile(file, destinationPath);

            Java.IO.File apkFile = new Java.IO.File(destinationPath);

            Intent intent = new Intent(Intent.ActionView);

            if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
            {
                Android.Net.Uri apkURI = AndroidX.Core.Content.FileProvider.GetUriForFile(Android.App.Application.Context, "com.companyname.bingowmc.fileprovider", apkFile);
                intent.SetDataAndType(apkURI, "application/vnd.android.package-archive");
                //intent.AddFlags(ActivityFlags.GrantReadUriPermission | ActivityFlags.NewTask | ActivityFlags.ClearTop);
                intent.AddFlags(ActivityFlags.NewTask);
                intent.AddFlags(ActivityFlags.GrantReadUriPermission);
                intent.AddFlags(ActivityFlags.ClearTop);
                intent.PutExtra(Intent.ExtraNotUnknownSource, true);
            }
            else
            {
                intent.SetDataAndType(Android.Net.Uri.FromFile(apkFile), "application/vnd.android.package-archive");
                intent.SetFlags(ActivityFlags.NewTask);
            }

            await Task.Delay(5000);
            //Android.App.Application.Context.StartActivity(intent);
            Xamarin.Essentials.MainThread.BeginInvokeOnMainThread(() =>
            {
                Android.App.Application.Context.StartActivity(intent);
            });
            await Task.Delay(5000);

            OnUpdateStatusChanged(new UpdateStatusEventArgs(UpdateStatusEventArgs.UpdateStatusType.Completed, "Update installed successfully"));
        }
        catch (Exception ex)
        {
            await Utils.ShowErrorPopup(ex.Message);
            OnUpdateStatusChanged(new UpdateStatusEventArgs(UpdateStatusEventArgs.UpdateStatusType.Failed, ex.Message));
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.