我正在尝试创建一个从资产安装另一个.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);
但是如果我在模拟器上运行它,我得到“没有找到处理意图的活动”异常。 如果我在移动设备上运行它,我会得到“Java.Lang.Throwable”异常。我在设备上检查了sdcard,因此文件已成功从资产中复制并存在。
答案 0 :(得分:1)
您需要使用SetData
,而不是使用SetType
和SetDataAndType
方法。我不知道为什么这个工作反对单独设置它们但确实如此。
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
您还需要在清单中加入INSTALL_PACKAGES
权限,您可以通过项目选项 - > Android应用程序 - >在Xamarin中执行此操作; 必需权限菜单。
我还注意到用于提取apk的方法无效。代码using (var asset = Assets.Open("Test/Cnd.apk")) using (var dest = File.Create (tmpPath))
将在外部存储路径中创建一个名为tmp_app.apk的空文件。当程序包管理器尝试安装它时,它会因分析错误而失败。
要解决此问题,请从资产目录中执行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);
}
}
}