将HttpResponse转换为.apk文件

时间:2010-01-04 19:36:08

标签: android

问题在于:

我与某个网址建立了互联网连接,并通过app_example.apk接收了一个HttpResponse。

然后我要创建一个文件(.apk) 在带有此数据的SD卡中,以便下载此应用程序 可以稍后安装。

如何将HttpResponse转换为.apk文件?

让我们清楚一些细节:

  • 我必须通过互联网连接到我的服务器获取此apk文件
  • 我不想安装我在sdcard上收到的这些应用程序
  • 所有这一切都必须在我的代码中完成,我不能使用android market

我目前正在写该文件。

我正在做的是将HttpResponse转换为byte [],

然后使用ObjectOutputStream将byte []写入文件(.apk)。

像这样:

    // byte[] appByteArray - already has the internet response converted in bytes

    try {
    file = new File(Environment.getExternalStorageDirectory()+"/"+appName+".apk");

    file.createNewFile();

    FileOutputStream stream = null;

    stream = new FileOutputStream(file, false);

    ObjectOutputStream objectOut =
        new ObjectOutputStream(new BufferedOutputStream(stream));

    objectOut.writeObject(appByteArray);

    objectOut.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

最后,创建了文件 并收到了内容。

当我尝试安装它时,  通过VIEW意图(使用默认安装程序) 我得到一个解析错误,说它无法找到AndroidManifest.xml。

我认为在此过程中的一些步骤中,收到的数据已被破坏。

你有其他方法可以解决这个问题吗?

非常感谢

3 个答案:

答案 0 :(得分:5)

  1. 不要使用ObjectOutputStream,字节数组被序列化为Object,而不是写为原始数据。
  2. 您确定拥有SD卡写入权限吗? android.permission.WRITE_EXTERNAL_STORAGE
  3. 不要写入SD卡根目录。 root目录中的文件数量可以是有限的。而是在SD CARD上创建app子目录。
  4. 此代码适用于我:

        try {
            String filePath = Environment.getExternalStorageDirectory()
                    + "/myappdir/" + appName + ".apk";
    
            File file = new File(filePath);
            file.getParentFile().mkdirs();
            file.createNewFile();
    
            BufferedOutputStream objectOut = new BufferedOutputStream(
                    new FileOutputStream(file));
    
            objectOut.write(appByteArray);
    
            objectOut.close();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    

答案 1 :(得分:1)

这可能不是核心问题,但我认为您不想将stream包装在ObjectOutputStream中,因为它用于对象序列化。可能是它正在向文件添加额外数据,因此可以使用ObjectInputStream对其进行反序列化。

我会尝试将apk从模拟器(或设备)中拉出来并检查它的MD5与服务器上的文件,以确保正确写出这些位。

答案 2 :(得分:1)

看看Pavel P的答案。

另外,我会注意到你使用VIEW意图动作安装APK的想法确实有效,因为我过去曾测试过这种技术。

然而,除非用户已明确进入设置→应用程序并选择“允许非市场应用程序”,否则您的安装将失败,用户只会看到一个屏幕,告知他们出于安全原因安装已被阻止。

基本上,你真的需要依赖那些愿意忽视可怕安全警告的技术娴熟的用户并去禁用该设置。