Android:安装apk意图(monodroid)

时间:2013-09-18 11:37:29

标签: android android-intent xamarin.android xamarin android-install-apk

我正在尝试创建一个从资产安装另一个.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,因此文件已成功从资产中复制并存在。

1 个答案:

答案 0 :(得分:1)

您需要使用SetData,而不是使用SetTypeSetDataAndType方法。我不知道为什么这个工作反对单独设置它们但确实如此。

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);
        }
    }
}