如何自行安装 APK 修复错误解析 APK?

How do I self install APK fixing error parsing APK?

我在 Zebra 设备上有一个 Android 移动应用程序,可以留在家里。一切正常,但我一直在为更新而苦苦挣扎。我有检查版本号的代码,可以将新签名的 APK 下载到设备的文件夹 (MyFolder) 中。这样可行。如果需要,我可以从该文件夹安装更新,但用户将需要它来更新而无需学习该过程。我已经阅读并尝试了这个小组和其他人的很多东西,我确信这是非常简单的事情。我确保设备有文件,设备允许安装应用程序,并且可以访问设备存储。我收到消息错误解析包,我只是不确定下一步该去哪里。这是我的代码

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);
    }

我用 PackageInstaller 替换了意图,并确保 Activity 在 CS 页面上执行 LaunchMode = LaunchMode.SingleTop。它确实询问用户是否要安装,在接受后,它会关闭应用程序并且不会重新启动,但目前这是重新启动它的简单解决方法。

    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);

两件事

  1. 确保您的 myDir 已暴露给文件提供者 文件提供者应该有 filePaths
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application>
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
    </application>
</manifest>

您的文件路径应位于 res/xml/filepaths.xml

<paths>
    <files-path path="<myDir path>/" name="apk_dir" />
</paths>
  1. 最好使用 Intent(Intent.ACTION_INSTALL_PACKAGE) 意图。