【问题标题】:How do I self install APK fixing error parsing APK?如何自行安装 APK 修复错误解析 APK?
【发布时间】:2021-08-16 13:59:05
【问题描述】:

我在 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 API 而不是触发您自己的意图。此 API 可从 API 21 及更高版本获得。
  • @Cheesebaron 谢谢,我正在努力将其替换为 PackageInstaller,只是尝试在处理其他项目时解决它的外观。
  • 等待你的好消息。
  • @JessieZhang-MSFT 我的代码中有 PackageInstaller 更改,我没有收到任何错误,但是,我下载的 apk 没有更新应用程序。因此,我不确定是否需要将更新的 apk 下载到特定位置。我有一个应用程序为诸如日志文件和获取任何 apk 更新之类的东西创建的文件夹,字面意思是 MyFolder。该应用程序执行更新过程并关闭/重新打开但仍然是相同的版本。我已经在另一台设备上检查了更新版本,这是正确的。所以继续跋涉。

标签: android xamarin apk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    两件事

    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) 意图。

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2012-05-12
      • 2013-12-09
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多