Android AsyncHttpClient - “内容类型不允许!”无论提供何种类型

时间:2013-11-26 00:34:07

标签: android download android-async-http

美好的一天。

我第一次在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);

}

使用的网址是正确形成的(我检查过),使用此库(JSON,登录POST)的所有其他调用都可以正常工作。

我已经研究并尝试了所有我能想到的或通过谷歌搜索阅读或浏览此特定库中的SO点击并结合此错误,我已经尝试了几乎所有可以想象的MimeType包含在呼叫中,仍然使用同样的错误。我真的很想让它工作,所以我不必重构我的所有代码来使用内置的httpclients,这是我认为的下一步。我也非常喜欢这个图书馆。

  • 尝试下载一个简单的png文件。

  • 提供图像的后端API调用正在运行,并且已经使用不同客户端(浏览器,Titanium App等)一年。

  • 连接已通过SSL

  • 我们后端的所有其他调用(不涉及下载文件)都能正常使用此库。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以准确检查后端返回的文件类型。只需覆盖onFailure中的BinaryHttpResponseHandler,就像这样:

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

这也可以为您提供其他信息来解决您的问题。

希望这有帮助