gpt4 book ai didi

Android:安装 apk Intent (monodroid)

转载 作者:行者123 更新时间:2023-11-30 03:22:29 24 4
gpt4 key购买 nike

我正在尝试创建一个从 Assets 安装另一个 .apk 文件的应用。

var tmpPath = Android.OS.Environment.ExternalStorageDirectory.Path + "/tmp_app.apk";
using (var asset = Assets.Open("Test/Cnd.apk")) using (var dest = File.Create (tmpPath)) asset.CopyTo (dest);
Intent setupIntent = new Intent(Intent.ActionView);
setupIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(tmpPath)));
setupIntent.SetType("application/vnd.android.package-archive");
StartActivity(setupIntent);

但是如果我在模拟器上运行它,我会得到“没有找到处理 Intent 的 Activity ”异常。如果我在移动设备上运行它,我会得到“Java.Lang.Throwable”异常。我在设备上检查了 sdcard,因此文件已成功从 Assets 中复制并存在。

最佳答案

您需要使用 SetDataAndType 而不是使用 SetDataSetType 方法。我不知道为什么这与单独设置它们相反,但确实如此。

Intent setupIntent = new Intent(Intent.ActionView);
setupIntent.SetDataAndType(Android.Net.Uri.FromFile(new Java.IO.File(tmpPath)), "application/vnd.android.package-archive");
StartActivity(setupIntent);

参见: Install Application programmatically on Android

您还需要在 list 中包含 INSTALL_PACKAGES 权限,您可以在 Xamarin 中通过 Project Options->Android Application 执行此操作-所需权限菜单。

奖励答案

我还注意到您用来提取 apk 的方法不起作用。代码 using (var asset = Assets.Open("Test/Cnd.apk")) using (var dest = File.Create (tmpPath)) 将在您的目录中创建一个名为 tmp_app.apk 的空文件外部存储路径。当包管理器尝试安装它时,它会因解析错误而失败。

要解决此问题,请像这样从 Assets 目录中复制 APK 的二进制副本:

string apkPath = Path.Combine (Android.OS.Environment.ExternalStorageDirectory.ToString (), "tmp_app.apk");
using (BinaryReader br = new BinaryReader(Assets.Open("Test/Cnd.apk")))
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(apkPath, FileMode.Create)))
{
byte[] buffer = new byte[2048];
int len = 0;
while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
{
bw.Write (buffer, 0, len);
}
}
}

关于Android:安装 apk Intent (monodroid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18871203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com