问题在于:
我与某个网址建立了互联网连接,并通过app_example.apk接收了一个HttpResponse。
然后我要创建一个文件(.apk) 在带有此数据的SD卡中,以便下载此应用程序 可以稍后安装。
如何将HttpResponse转换为.apk文件?
让我们清楚一些细节:
我目前正在写该文件。
我正在做的是将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。
我认为在此过程中的一些步骤中,收到的数据已被破坏。
你有其他方法可以解决这个问题吗?
非常感谢
答案 0 :(得分:5)
此代码适用于我:
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的想法确实有效,因为我过去曾测试过这种技术。
然而,除非用户已明确进入设置→应用程序并选择“允许非市场应用程序”,否则您的安装将失败,用户只会看到一个屏幕,告知他们出于安全原因安装已被阻止。
基本上,你真的需要依赖那些愿意忽视可怕安全警告的技术娴熟的用户并去禁用该设置。