アプリケーションサーバーからencodeされた文字列(画像データ)をdecodeしてBitmapに変換する処理を作成しています。
コードは以下のようになります。
Java
1InputStream _input_stream = URLDecoder.decode(json_data.getString("profile_picture")); 2Bitmap bmp = BitmapFactory.decodeStream(_input_stream), "UTF-8")); 3 4ImageView _image = (ImageView)view.findViewById(R.id.image_view); 5_image.setImageBitmap(bmp);
しかし、例外が発生して、bad base-64というエラーが返ってきてしまいます。
他に試したことは、
・android.util.Base64でなくorg.apache.commons.codec.binary.Base64を使う
Java
1byte [] encodeByte=Base64.decode(encodedString,Base64.DEFAULT); 2
・Base64.DEFAULTだけでなく、URL_SAFEなど、全オプションを試す
いずれもうまく行きませんでした。jsonで送られてくる文字列に問題がありそうですが、全く同じデータがiOS(Swift)では正しく画像に変換できています。
Swift
1let _clinic_image: UIImage? = json_data["profile_picture"].string!.urlDecode() 2 3public func urlDecode() -> UIImage? { 4 var img: UIImage = UIImage() 5 6 let base64String = self.replacingOccurrences(of: " ", with: "+") 7 8 let decodeBase64:NSData? = 9 NSData(base64Encoded:base64String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) 10 11 12 if let decodeSuccess = decodeBase64 { 13 img = UIImage(data: decodeSuccess as Data)! 14 } 15 16 return img 17}
Swiftで行なっている処理そのものをAndroidでも実現したいのですが、うまくいきません。
どなたかご助言をいただけないでしょうか?
よろしくお願いします。
[追記]
アドバイスいただいた内容をもとにソースコードを変更しました。結果はbad base-64エラーは消えましたが、bmpはnullになってしまいます。
Java
1String _profile_picture = data.getString("profile_picture").substring(0, data.getString("profile_picture").length()-1).replaceAll("\n", "").replaceAll(" ", "+"); 2InputStream is = new ByteArrayInputStream(_profile_picture.getBytes("utf-8")); 3Bitmap bmp = BitmapFactory.decodeStream(is);
SwiftでNSData.Base64DecodingOptions.ignoreUnknownCharactersを外すと、Android同様に画像が表示できなくなってしまうことから、なんらかの不適切な文字が入っていることに原因があるのではないかと推測していますが、特定できていない状況です。
お分かりになる方がいらっしゃいましたらアドバイスいただけると幸いです。