質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

3788閲覧

Androidで、encodeされた文字列のBitmap変換について

kazzzstudio

総合スコア94

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/05/29 01:13

編集2018/05/29 06:16

アプリケーションサーバーから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同様に画像が表示できなくなってしまうことから、なんらかの不適切な文字が入っていることに原因があるのではないかと推測していますが、特定できていない状況です。

お分かりになる方がいらっしゃいましたらアドバイスいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/29 04:26

Base64でエンコードした文字列は64種類の文字(A–Z, a–z, 0–9 までの62文字と、記号2つ +, /)で構成されています。ただし末尾にパディングで'='が1から3個付くことがあります。デコードしようとしている文字列はそうなっているでしょうか?
kazzzstudio

2018/05/29 04:46

文字列の構成はおかしなところはありませんでした。Swiftでデバッグ出力したものと全く同じでした。
fuzzball

2018/05/29 05:43

さっきはうっかり回答のコメントに書いてしまったので、今回はこちらに。Swiftの方は " " を "+" に置換しているようですが、この処理はAndroidにも入っているのでしょうか?
kazzzstudio

2018/05/29 05:50

入っていなかったので追加してみましたが、結果は変わらないようでした。Swiftでも、ignoreUnknownCharactersを取り除くと表示できなくなってしまうようなので、何か余計な文字が含まれていることは想像できるのですが、それがどの文字なのか特定できずにいます。
fuzzball

2018/05/29 05:55

+への置換と、改行コード除去と、両方ともやった状態でもダメでしたか?
kazzzstudio

2018/05/29 06:02

はい、今は両方ともやっていますが結果は変わらずです
fuzzball

2018/05/29 06:06

一度質問を整理した方が良いかと思います。現状のコード、今まで試したことと結果、など。(Androidについては、あまりお役に立てそうにないです‥)
kazzzstudio

2018/05/29 06:17

これまでにいただいたアドバイスから問題を整理して追記しました。お手数をおかけして申し訳ありません。
kakajika

2018/05/29 13:44

追記されたコードの中にはBase64のデコード処理が入っていないようですが、このコード以外の箇所でやっているのでしょうか?
kazzzstudio

2018/05/29 14:07

BitmapFactory.decodeStream(is)がdecode処理に相当すると認識していました。Base64のデコードが入っていなかったです。
guest

回答1

0

options: NSData.Base64DecodingOptions.ignoreUnknownCharacters

これでうまくいって

BitmapFactory.decodeStream(_input_stream), "UTF-8"));

(かっこが多いような)

ignoreUnknownCharacters
という意味で解釈すればいいのでは

InputStream is = null; try{ is = urlConnection.getInputStream(); bmp = BitmapFactory.decodeStream(is); is.close(); } catch(IOException e){ e.printStackTrace(); } finally{ if(is != null){ is.close(); } }

リンク内容

投稿2018/05/29 03:03

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazzzstudio

2018/05/29 03:43

ご回答、ありがとうございます。 コードを下記のように書き換えました。 InputStream is = new ByteArrayInputStream(data.getString("profile_picture").getBytes("utf-8")); Bitmap bmp = BitmapFactory.decodeStream(is); しかし、例外は消えたものの、bmpがnulになってしまいます。 画像に(少なくてもSwiftでは)変換できるとした場合、何か他にignoreUnknownCharactersに当たる部分をAndroidで実装する方法はありませんでしょうか?
fuzzball

2018/05/29 04:30

Swift(iOS)でignoreUnknownCharactersを指定しないとどうなるんでしょうか?
kazzzstudio

2018/05/29 04:47

SwiftでignoreUnknownCharactersの指定をやめたところ、画像が出力されなくなってしまいました。
fuzzball

2018/05/29 04:53 編集

Base64エンコード時に改行コードを含まないようにするか、Androidでのデコード時に改行コードを除去するか、どちらか簡単に試せますか?
kazzzstudio

2018/05/29 05:30

Androidでのデコード時に、 "string".replaceAll("\n", "") を追加してみましたが、結果は変わりませんんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問