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

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

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

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

Android

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

4878閲覧

BitmapFactory.decodeByteArray(sbyte, 0, sbyte.length); の戻り値がnullになってしまう

eisaku123

総合スコア74

Java

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

Android

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/02/26 06:01

編集2018/02/26 14:40

いつもお世話になります。

表記の通り、BitmapFactory.decodeByteArray(sbyte, 0, sbyte.length);の戻り値がnullになってしまって前に進めないです。

流れとしては、引数resultからbyteデータに置き換えて、Bitmapに変換したいのですがうまくいきません

resultのデータはサーバからくるデータと考えおります。

サーバー側のソースは以下の以下の通り

ちなみにresultからくるデータは以下の以下の以下通り。

java

1 2//クライアント側 再編集  3public class AsyncNetworkTask extends AsyncTask<Void, Void, byte[]> { 4 5 private ImageView imageview; 6 7 public AsyncNetworkTask(Context context) { 8 super(); 9 MainActivity activity = (MainActivity)context; 10 imageview = (ImageView)activity.findViewById(R.id.iv); 11 } 12 13 @Override 14 protected byte[] doInBackground(Void... voids) { 15 16 byte[] data; 17 18 StringBuilder builder = new StringBuilder(); 19 try { 20 URL url = new URL("http://192.168.3.5:8080/book777/chapter3"); 21 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 22 con.setRequestMethod("GET"); 23 BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); 24 String line; 25 while ((line = reader.readLine()) != null){ 26 builder.append(line); 27 } 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 32 String i = builder.toString(); 33 data=i.getBytes(); 34 return data; 35 } 36 37 @Override 38 protected void onPostExecute(byte[] result) { 39 Bitmap bmp2 = null; 40 41 if (result != null) { //byte配列をBitmapオブジェクトに変換する 42 bmp2 = BitmapFactory.decodeByteArray(result, 0, result.length);//nullになってしまう 43 } 44 if (bmp2 == null){ //bmp2がnullかどうか調べる 45 imageview.setImageResource(R.drawable.monster);//<----ここに入ってしまう!!! 46 } 47 48 imageview.setImageBitmap(bmp2);//nullになってしまうため画像が表示されない 49 } 50}

java

1//サーバー側 2@WebServlet(urlPatterns={"/chapter3/*"}) 3public class Hello3 extends HttpServlet{ 4 5 @Override 6 public void doGet( 7 HttpServletRequest request, 8 HttpServletResponse response 9 ) throws ServletException, IOException { 10 response.setContentType("image/jpeg ;charset=UTF-8"); 11 response.setHeader("Content-Disposition" ,"attachment"); 12 13 OutputStream out = response.getOutputStream();//ここでストリームをつなげる 14 15 try { 16 FileInputStream input =new FileInputStream("/Applications/Eclipse_4.7.2.app/Contents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/book777/WEB-INF/classes/chapter3/1.jpg"); 17 18 19 int i = input.read(); 20 while(i !=-1) { 21 char c = (char)i; 22 out.write(c);//ここでクライアントにデータを流す 23 System.out.print(c) 24 i = input.read(); 25 } 26 input.close(); 27 out.close(); 28 29 }catch(Exception e) { 30 System.out.println("意味不明のエラーです"); 31 }catch (Throwable e) { 32 System.out.println("byte[] data = IOUtils.toByteArray(input);でエラーです"); 33 } 34 } 35 36}

������JFIF��,,��������C��  (1#%(:3=<9387@H\N@DWE78PmQW_bghg>Mqypdx\egc����C//cB8Bcccccccccccccccccccccccccccccccccccccccccccccccccc�������"�������������������������� �����������}��!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������������������������� ���������w��!1AQaq"2�B���� #3R�br�$4�

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

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

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

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

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

unz.hori

2018/02/26 06:44

元がStringというのが解せないですが...
unz.hori

2018/02/26 06:48

サーバから来るデータというのはアップロードしているということですか?
eisaku123

2018/02/26 06:59

@Override です。 調べるとResult の方が良い? 難しい。
eisaku123

2018/02/26 09:19

アップロード? サーバー側を追記しましたのでご確認お願いします。
eisaku123

2018/02/26 13:33

クライアント側を再編して見やすくしました。 でも bmp2 = BitmapFactory.decodeByteArray(result, 0, result.length);でnullになってしまう
guest

回答3

0

BitmapFactory.decodeByteArray()の戻り値がnullになるのは、引数に突っ込んでいるデータが本当に画像データとして成立する内容になっているのか?ということに尽きるので、そこはご自身でもう少し調べていただく以外にないと思います。文字化けしているデータ列を提示されても、それでは何もわかりませんし。

以下、質問の解決に直接的に結びつく話ではありませんが。onPostExecute()というのはAsyncTaskの実装メソッドだと思うのですが、AsyncTaskを継承したクラスの宣言で

Java

1public class MyTask extends AsyncTask<Void, Void, String>

のようなことをしていますよね。この<>の中に記述した型が、それぞれdoInBackground()、onProgressUpdate()、onPostExecute()の引数の型になります。また、onPostExecute()の引数には、doInBackground()の戻り値が渡ります。ですから

Java

1public class MyTask extends AsyncTask<Void, Void, byte[]> { 2 @Override 3 protected byte[] doInBackground(Void... voids) { 4 byte[] data; 5 6 // 中略 7 8 return data; 9 } 10 11 // 中略 12 13 @Override 14 protected void onPostExecute(byte[] result) { 15 16 } 17}

のようにでもすればいいのではないか?と思いますが。無用な処理のためにおかしなことになっていないか?ということも疑ってみた方がいいような気がします。

投稿2018/02/26 09:02

編集2018/02/26 09:23
keicha_hrs

総合スコア6768

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

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

eisaku123

2018/02/26 09:56

いつもお世話になります。< >の部分は型が自由に選べれそうな感じなんですね。 検討します。いろいろアドバイスありがとうございます。 あととりあえず現状のクライアントのソースを追記しました。
eisaku123

2018/02/26 13:34

クライアント側を再編して見やすくしました。 でも bmp2 = BitmapFactory.decodeByteArray(result, 0, result.length);でnullになってしまう
keicha_hrs

2018/02/26 14:28 編集

setContentType()で設定しているコンテンツタイプがなぜtext/htmlなんですか?JPEG画像を送りたいなら、image/jpegにする必要があるのでは?
eisaku123

2018/02/26 14:38

すみません。なおします。
guest

0

自己解決

以下のように記述したら画像が出ました。

皆様、ありがとうございます。感動泣

java

1public class AsyncNetworkTask extends AsyncTask<Void, Void, Bitmap> { 2 3 private ImageView imageview; 4 5 public AsyncNetworkTask(Context context) { 6 super(); 7 MainActivity activity = (MainActivity)context; 8 imageview = (ImageView)activity.findViewById(R.id.iv); 9 } 10 11 @Override 12 protected Bitmap doInBackground(Void... voids) { 13 14 byte[] data; 15 Bitmap bitmap = null; 16 InputStream inputStream = null; 17 18 StringBuilder builder = new StringBuilder(); 19 try { 20 URL url = new URL("http://192.168.3.5:8080/book777/chapter3"); 21 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 22 con.setRequestMethod("GET"); 23 24 con.connect(); 25 inputStream = con.getInputStream(); 26 27 bitmap = BitmapFactory.decodeStream(inputStream); 28 29 30 }catch (IOException exception){ 31 32 } 33 34 return bitmap; 35 } 36 37 @Override 38 protected void onPostExecute(Bitmap result) { 39 40 imageview.setImageBitmap(result); 41 42 43 } 44 45}

投稿2018/02/26 14:44

eisaku123

総合スコア74

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

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

0

やりたいことが外部サイトから画像データを取得して表示したいということであれば以下を参照してみてください。【Androidプログラミング入門 #007】ネット上の画像を取得しImageViewに表示する

投稿2018/02/26 06:55

unz.hori

総合スコア1057

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

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

eisaku123

2018/02/26 13:40

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問