Android AsyncHttpClient-“不允许使用内容类型!”不考虑提供的类型



大家好。

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

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

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新