2

良い一日。

SOに初めて投稿するのは初めてで、これまではそうする必要はありませんでした。読書は常に十分でした。今、私は Android 用の AsyncHttpClient ライブラリを使用してひどく行き詰まっています。ファイルのダウンロード以外のすべての応答で、少なくとも私にとっては、行き詰まった最後の 1 日半の間、素晴らしく機能します。:-)

コード:

@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、ログイン POST) はすべて正常に動作します。

このエラーに関連して、この特定のライブラリで考えられる、またはGoogle検索またはSOヒットを読んだことがあるすべてを調査して試しましたが、呼び出しに含めるほぼすべてのMimeTypeを試しましたが、同じエラー. 私は本当にこれを機能させたいと思っているので、すべてのコードをリファクタリングして組み込みの httpclients を使用する必要はありません。これが私の次のステップだと思います。私もこの図書館が大好きです。

  • シンプルなpngファイルをダウンロードしようとしています。

  • イメージを提供するバックエンド API 呼び出しは機能しており、さまざまなクライアント (ブラウザー、Titanium アプリなど) で 1 年間使用されています。

  • 接続はSSL経由です

  • バックエンドへの他のすべての呼び出し (ファイルのダウンロードを含まない) は、このライブラリで正しく機能します。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

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

これにより、問題を解決するためのその他の情報も提供されます。

お役に立てれば

于 2014-01-16T11:41:39.763 に答える