我正在开发一个 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,从应用程序内更新现有应用程序。没有任何服务。更新时出现应用程序未安装错误。安卓
但我想它仍然缺少一些东西。
我想通了;我只需要等待,一切都会好起来的。更正后的代码是:
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));
}
}