Issue
I have an Android mobile app on a Zebra device that will stay in house. All that works well but I have been struggling with the updates. I have code to check version numbers and can download a new signed APK to the device in a folder (MyFolder). That works. I can install the update from that folder if need be but the users will need it to just update without having to learn that process. I have read and tried many things in this group and others, I'm sure it is something super simple. I make sure the device has the file, the device allows the application to install, and has access to the device storage. I get the message error parsing package and I'm just not sure where to go next. Here is code I have
AndroidManifest.xml
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true">
MainActivity.cs (ProcessUpdate())
Android.Net.Uri fileUri = Android.Support.V4.Content.FileProvider.GetUriForFile(context, context.PackageName+".provider", myDir);
bool binstall = context.PackageManager.CanRequestPackageInstalls();
if (!binstall)
{
context.StartActivity(new Intent(Android.Provider.Settings.ActionManageUnknownAppSources));
}
Intent intent = new Intent(Intent.ActionView);
intent.AddFlags(ActivityFlags.NewTask);
intent.PutExtra(Intent.ExtraNotUnknownSource, true);
intent.SetDataAndType(fileUri, "application/vnd.android.package-archive");
intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
try
{
context.StartActivity(intent);
}
catch (ActivityNotFoundException ex)
{
WritetoLog("ActivityNotFoundException ProcessUpdate - " + ex.Message);
}
catch (Exception ex)
{
WritetoLog("Exception ProcessUpdate - " + ex.Message);
}
Solution
I replaced the intent with PackageInstaller and ensured that the Activity was doing LaunchMode = LaunchMode.SingleTop on the CS page. It does ask the user if they want to install, upon accepting, it closes the app and does not relaunch, but for now that is an easy workaround to relaunch it.
PackageInstaller packageInstaller = context.PackageManager.PackageInstaller;
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
AddApkToInstallSession(newFile.ToString(), session);
// Create an install status receiver.
Intent intent = new Intent(this, this.Class);
intent.SetAction(PACKAGE_INSTALLED_ACTION);
PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.IntentSender;
// Commit the session (this will start the installation workflow).
session.Commit(statusReceiver);
Answered By - Cami
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.