![](/img/trans.png)
[英]No Activity Found to handle Intent (act=android.intent.action.VIEW) Trying to Install APK
[英]Xamarin Android 10 Install APK - No Activity found to handle Intent
我想从我的 xamarin android 应用程序的文件系统安装第 3 方应用程序。 我在 Android 10 之前成功使用的代码非常简单明了。
Intent intent = new Intent(Intent.ActionView);
Uri data = Uri.FromFile(file);
intent.SetDataAndType(data, "application/vnd.android.package-archive");
context.StartActivity(intent);
此代码不适用于 Android 10,因为 ACTION_VIEW 和 ACTION_INSTALL_PACKAGE 在 Android 10 中已弃用。看起来我们现在需要使用 PackageInstaller ZDB974238714CA8DE6347A。
我尝试使用 PackageInstaller API 编写一个方法。 不幸的是,它不起作用。
带有 PackageInstaller 的代码 API
public static void InstallPackageAndroidQAndAbove(Context context, string filePath, string packageName)
{
var packageInstaller = context.PackageManager.PackageInstaller;
var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
sessionParams.SetAppPackageName(packageName);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
var input = new FileStream(filePath, FileMode.Open, FileAccess.Read);
var output = session.OpenWrite(packageName, 0, -1);
input.CopyTo(output);
output.Close();
input.Close();
input.Dispose();
session.Fsync(output);
var pendingIntent = PendingIntent.GetBroadcast(context, sessionId, new Intent(Intent.ActionInstallPackage), 0);
session.Commit(pendingIntent.IntentSender);
}
调用过程中出现异常“Unrecognized stream”。
我希望有一个人可以帮助我。
非常感谢您提前。
Xamarin Android 使用 PackageInstaller API 安装 apk 的代码。
//Change to your package name
const string PACKAGE_INSTALLED_ACTION =
"com.example.android.apis.content.SESSION_API_PACKAGE_INSTALLED";
public static void InstallPackageAndroidQAndAbove(Context context, string filePath)
{
var packageInstaller = context.PackageManager.PackageInstaller;
var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
addApkToInstallSession(filePath, session);
// Create an install status receiver.
Intent intent = new Intent(context, context.Class);
intent.SetAction(Globals.PACKAGE_INSTALLED_ACTION);
PendingIntent pendingIntent = PendingIntent.GetActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.IntentSender;
// Commit the session (this will start the installation workflow).
session.Commit(statusReceiver);
}
private static void addApkToInstallSession(string filePath, PackageInstaller.Session session)
{
using (var input = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (var packageInSession = session.OpenWrite("package", 0, -1))
{
input.CopyTo(packageInSession);
packageInSession.Close();
}
input.Close();
}
//That this is necessary could be a Xamarin bug.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
// Note: this Activity must run in singleTop launchMode for it to be able to receive the //intent
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
Bundle extras = intent.Extras;
if (Globals.PACKAGE_INSTALLED_ACTION.Equals(intent.Action))
{
int status = extras.GetInt(PackageInstaller.ExtraStatus);
String message = extras.GetString(PackageInstaller.ExtraStatusMessage);
switch (status)
{
case (int)PackageInstallStatus.PendingUserAction:
// This test app isn't privileged, so the user has to confirm the install.
Intent confirmIntent = (Intent)extras.Get(Intent.ExtraIntent);
StartActivity(confirmIntent);
break;
case (int)PackageInstallStatus.Success:
Toast.MakeText(this, "Install succeeded!", ToastLength.Long).Show();
break;
case (int)PackageInstallStatus.Failure:
case (int)PackageInstallStatus.FailureAborted:
case (int)PackageInstallStatus.FailureBlocked:
case (int)PackageInstallStatus.FailureConflict:
case (int)PackageInstallStatus.FailureIncompatible:
case (int)PackageInstallStatus.FailureInvalid:
case (int)PackageInstallStatus.FailureStorage:
Toast.MakeText(this, "Install failed! " + status + ", " + message,
ToastLength.Long).Show();
break;
default:
Toast.MakeText(this, "Unrecognized status received from installer: " + status,
ToastLength.Long).Show();
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.