如何自行安装 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);
两件事
- 确保您的
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>
- 最好使用
Intent(Intent.ACTION_INSTALL_PACKAGE)
意图。
我在 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);
两件事
- 确保您的
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>
- 最好使用
Intent(Intent.ACTION_INSTALL_PACKAGE)
意图。