1

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

4

1 回答 1

1

而不是使用你需要使用的SetDataand方法。我不知道为什么这与单独设置它们相反,但确实如此。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);

请参阅: 在 Android 上以编程方式安装应用程序

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

奖励答案

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

要解决此问题,请从 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);
        }
    }
}
于 2013-09-18T12:33:48.240 回答