2013-11-26 67 views
2

好日子全部。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,登錄文章)所有的工作細每隔電話。

我已經研究並嘗試了所有我能想到的或已經通過谷歌搜索或通過這個特定庫與此錯誤一起閱讀的內容,並且我嘗試了幾乎所有可以想象的MimeType以包含該調用,仍然與同樣的錯誤。我真的希望得到這個工作,所以我不需要重構所有我的代碼來使用內置的httpclient,這是我認爲的下一步。我也非常喜歡這個圖書館。

  • 試圖下載一個簡單的PNG文件。

  • 提供映像的後端API調用正在運行,並且已經在不同的客戶端(瀏覽器,Titanium App等)中運行了一年。

  • 連接是通過SSL

  • 其他所有呼叫(不涉及文件下載),與此庫正確地我們的後端工作。

任何幫助,將不勝感激。謝謝!

回答

1

您可以檢查後端返回的文件類型。只是簡單地覆蓋在你的BinaryHttpResponseHandleronFailure這樣的:

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

這也可以爲您提供其他信息,以解決您的問題。

希望這會有幫助

相關問題