大家好。
我第一次在SO上发帖,以前从未这样做过。读书总是足够的。现在,我只是遗憾地陷入了为Android使用AsyncHttpClient库的困境。除了下载文件外,它在其他所有响应中都非常有效,至少在我被卡住的最后一天半里是这样。:-)
代码:
@Override
public void onClick(DialogInterface dialog, int which) {
int userId = ((App)getActivity().getApplicationContext()).getUserId();
String url = ZenApi.getAbsoluteUrl("api/attachments/" + userId + "/" +
attachments[which]);
selectedFile = attachments[which].toString();
String[] allowedContentTypes = new String[] {"application/octet-stream",
"text/html; charset=ISO-8859-1", "image/png", "image/jpeg",
"image/bmp", "application/pdf", "text/html; charset=UTF-8", "image/png;charset=UTF-8" };
BinaryHttpResponseHandler handler = new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
};
@Override
public void onFinish() {
ChooseMessageAttachmentFragment.this.dismiss();
super.onFinish();
}
@Override
public void onProgress(int bytesWritten, int totalSize) {
// TODO Auto-generated method stub
super.onProgress(bytesWritten, totalSize);
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] binaryData, Throwable error) {
Toast.makeText(getActivity(), "Failed to load file: " + error.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(int statusCode, byte[] binaryData) {
File file = new File(getActivity().getFilesDir(), selectedFile);
if (file.exists()) {
try {
FileOutputStream stream = new FileOutputStream(file.getPath());
stream.write(binaryData[0]);
stream.close();
MimeTypeMap mimemap = MimeTypeMap.getSingleton();
String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
String type = mimemap.getMimeTypeFromExtension(ext);
if (type == null ) {
type = "*/*";
}
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), type);
startActivity(intent);
} catch (java.io.IOException e) {
Toast.makeText(getActivity(), "Error downloading file", Toast.LENGTH_SHORT).show();
}
}
}
};
ZenApi.post(url, null, handler);
}
使用的url格式正确(我检查过),使用该库的其他所有调用(JSON、Login POST)都可以正常工作。
我已经研究并尝试了我能想到的或通过谷歌搜索阅读的所有内容,或者这个特定库上的SO点击量,以及这个错误,我几乎尝试了所有可以想象的MimeType,但仍然存在相同的错误。我真的很想让它发挥作用,这样我就不必重构所有的代码来使用内置的httpclient,这是我的下一步。我也非常喜欢这个图书馆。
正在尝试下载一个简单的png文件。
提供图像的后端API调用正在工作,并且已经使用不同的客户端(浏览器、Titanium应用程序等)一年了。
连接通过SSL
对我们后端的所有其他调用(不涉及文件下载)都能正确使用此库。
如有任何帮助,我们将不胜感激。谢谢
您可以准确地检查后端返回的文件类型。只需覆盖BinaryHttpResponseHandler
中的onFailure
,如下所示:
@Override
public void onFailure(int statusCode, Header[] headers, byte[] binaryData, Throwable error)
{
Log.e(TAG, "onFailure!"+ error.getMessage());
for (Header header : headers)
{
Log.i(TAG, header.getName()+" / "+header.getValue());
}
}
这也可以为您提供其他信息来解决您的问题。
希望这能帮助