Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将HttpResponse转换为.apk文件_Android - Fatal编程技术网

Android 将HttpResponse转换为.apk文件

Android 将HttpResponse转换为.apk文件,android,Android,问题是: 我与某个url建立了internet连接,并通过app_example.apk接收了一个HttpResponse 然后我想创建一个文件(an.apk) 在SD卡中输入此数据,以便下载此应用程序 可以稍后安装 如何将HttpResponse转换为.apk文件 让我们澄清一些细节: 我必须通过internet连接到我的服务器来获取此apk文件 我不想安装SD卡上收到的此应用程序 所有这些都必须在我的代码中完成,我不能使用android market 我现在正在写那个文件 我正在做的是将

问题是:

我与某个url建立了internet连接,并通过app_example.apk接收了一个HttpResponse

然后我想创建一个文件(an.apk) 在SD卡中输入此数据,以便下载此应用程序 可以稍后安装

如何将HttpResponse转换为.apk文件

让我们澄清一些细节:

  • 我必须通过internet连接到我的服务器来获取此apk文件
  • 我不想安装SD卡上收到的此应用程序
  • 所有这些都必须在我的代码中完成,我不能使用android market
我现在正在写那个文件

我正在做的是将HttpResponse转换为字节[]

然后,使用ObjectOutputStream将该字节[]写入文件(an.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();
    }
最后,文件被创建 并有接收到的内容

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

我认为在这个过程中,接收到的数据正在被破坏

你有别的办法解决这个问题吗


非常感谢

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

我会尝试从模拟器(或设备)上取下apk,检查它的MD5与服务器上的文件,以确保正确写入位

  • 不要使用ObjectOutputStream,字节数组被序列化为对象,而不是作为原始数据写入
  • 你确定你有SD卡写入权限吗?android.permission.WRITE\u外部存储
  • 不要写入SD卡根目录。可以限制根目录中的文件数。而是在SD卡上创建应用程序子目录
  • 此代码适用于我:

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

    看看Pavel p的答案

    另外,我要指出的是,您使用
    视图
    意图操作安装APK的想法确实有效,因为我在过去已经测试过这项技术

    但是,除非用户已明确进入设置→ 应用程序和选择的“允许非市场应用程序”,您的安装将失败,用户只会看到一个屏幕,告诉他们由于安全原因,安装已被阻止


    基本上,你真的需要依靠那些相当精通技术的用户,他们愿意忽略一个可怕的安全警告,并去禁用该设置。

    的确如此。只需将
    appByteArray
    写入
    stream
    ——您的
    FileOutputStream
    。这段代码就可以工作了!正如Erich Douglass所说,ObjectOutputStream可能会向创建的文件添加额外的数据,这可能就是问题所在。非常感谢你。葡萄牙语:Obrigado!这就像一个魅力,我遇到的一个简单问题是,来自entitiy的内容长度是582504,但当我查看文件管理器时,大小会达到863145。我认为在将文件写入SD卡时添加了一些数据。有什么解决方法吗?apk文件只是一个具有不同扩展名的zip文件,因此您可以将该文件从SD卡中取出并尝试解压,看看其中是否包含您期望的所有内容。您能否发布从调用
    视图
    意图的角度获得的实际日志输出?