###前提・実現したいこと
サーバ側PHPでDBからSELECTした画像及び文字列を、Android端末に渡したいと考えています。
画像単体の受け渡しには成功したのですが、同時に文字列も同時に受け渡すとなると方法が良く分からず困っております。
下記処理に、どのような加筆をすれば良いでしょうか?
宜しくお願いします。
PHP
1 $sql = "SELECT image FROM xxx WHERE name = ?"; 2 if ($stmt = $mysqli->prepare($sql)) { 3 global $searchWord; 4 // 条件値をSQLにバインドする 5 $stmt->bind_param("s", $searchWord); 6 7 // 実行 8 $stmt->execute(); 9 10 // 取得結果を変数にバインドする 11 $stmt->bind_result($image); 12 while ($stmt->fetch()) { 13 header('Content-type: image/jpeg'); 14 echo $image; 15 } 16 $stmt->close(); 17 }
android
1@非同期処理クラス 2 //略 3 4 URL url = new URL(mURL); 5 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 6 7 // 接続 8 connection.connect(); 9 10 //略 11 12 //画像デコード 13 InputStream inputStream = connection.getInputStream(); 14 Bitmap bitmap_result = BitmapFactory.decodeStream(inputStream);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
MessagePackを使用すればバイナリのまま送信できます。
サイト見ればわかりますが、様々な言語で実装されています。
###サンプル
PHP側のMessagePackライブラリは、Msgpack for PHPが有名ですが、私のマシンだとインストールできない(pecl自体がそもそも不具合を起こしてる)ため、composerでインストールできるrybakit/msgpackを使用しています。
PHP側
PHPのMessagePackライブラリインストールはcomposerで行います。
$ composer require rybakit/msgpack
php
1<?php 2require_once "vendor/autoload.php"; 3 4use MessagePack\Packer; 5 6$img1 = file_get_contents('1.jpg'); 7$img2 = file_get_contents('2.jpg'); 8$img3 = file_get_contents('3.jpg'); 9 10$data = [ 11 'text1' => 'ほげ', 12 'text2' => 'ふが', 13 'bool1' => true, 14 'boo2' => false, 15 'int1' => 3, 16 'int2' => 1234567890, 17 'float1' => 4.568, 18 'float2' => 789.0123456, 19 'array1' => ['ふが', 11], 20 'array2' => ['ピヨ', true, false, 123, 456.789], 21 '1.jpg' => $img1, 22 '2.jpg' => $img2, 23 '3.jpg' => $img3 24]; 25 26$packer = new Packer(); 27$res = $packer ->packMap($data); 28echo $res; 29?>
Android側
AndroidのMessagePackライブラリのインストールはbandle.gradle(Module: app)のdependenciesにcompileの行を追加し、syncさせればインストールされます。
bandle.gradle(Module: app)
java
1dependencies { 2 compile 'org.msgpack:msgpack-core:0.8.12' // この行を追加 3}
activity_main.xml
xml
1<?xml version= "1.0" encoding= "utf-8" ?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/activity_main" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:paddingBottom="@dimen/activity_vertical_margin" 9 android:paddingLeft="@dimen/activity_horizontal_margin" 10 android:paddingRight="@dimen/activity_horizontal_margin" 11 android:paddingTop="@dimen/activity_vertical_margin" 12 tools:context="com.example.ritto.myapplication.MainActivity"> 13 14 <ScrollView 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" 17 android:layout_alignParentLeft="true" 18 android:layout_alignParentStart="true" 19 android:layout_alignParentTop="true" 20 android:clipToPadding="false" 21 tools:ignore="UselessParent"> 22 23 <LinearLayout 24 android:id="@+id/layout" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:orientation="vertical"> 28 29 <Button 30 android:id="@+id/button" 31 android:layout_width="match_parent" 32 android:layout_height="wrap_content" 33 android:text="HTTPデータ取得" 34 tools:ignore="HardcodedText" /> 35 36 <TableLayout 37 android:id="@+id/table" 38 android:layout_width="match_parent" 39 android:layout_height="match_parent" 40 android:stretchColumns="0,1"> 41 42 </TableLayout> 43 44 </LinearLayout > 45 </ScrollView > 46</RelativeLayout >
MainActivity.java
java
1package com.example.xxx.myapplication; //張り付けた後自分のパッケージ名に修正する 2 3import android.graphics.Bitmap; 4import android.graphics.BitmapFactory; 5import android.os.Handler; 6import android.support.v7.app.AppCompatActivity; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.Button; 10import android.widget.ImageView; 11import android.widget.TableLayout; 12import android.widget.TableRow; 13import android.widget.TextView; 14 15import org.msgpack.core.MessagePack; 16import org.msgpack.value.ArrayValue; 17import org.msgpack.value.ExtensionValue; 18import org.msgpack.value.FloatValue; 19import org.msgpack.value.ImmutableValue; 20import org.msgpack.value.IntegerValue; 21import org.msgpack.value.Value; 22import org.msgpack.value.ValueType; 23import java.math.BigInteger; 24import java.net.HttpURLConnection; 25import java.net.URL; 26import java.util.Map; 27 28public class MainActivity extends AppCompatActivity { 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 35 Button btn = (Button) findViewById(R.id.button); 36 final TableLayout table = (TableLayout) findViewById(R.id.table); 37 final Handler handler = new Handler(); 38 39 btn.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 table.removeAllViews(); 43 new Thread(new Runnable() { 44 @Override 45 public void run() { 46 try { 47 URL url = new URL("http://10.0.2.2/msgpack_test.php"); 48 HttpURLConnection con = (HttpURLConnection) url.openConnection(); 49 final ImmutableValue iv = MessagePack.newDefaultUnpacker(con.getInputStream()).unpackValue(); 50 51 handler.post(new Runnable() { 52 @Override 53 public void run() { 54 for (Map.Entry < Value, Value > kv : iv.asMapValue().entrySet()) { 55 kv.getValue().getValueType(); 56 Value key = kv.getKey(); 57 Value val = kv.getValue(); 58 59 TableRow row = new TableRow(MainActivity.this); 60 table.addView(row); 61 TextView keyView = new TextView(MainActivity.this); 62 keyView.setText(key.toString()); 63 row.addView(keyView); 64 View valView; 65 if (val.getValueType() == ValueType.BINARY) { 66 valView = new ImageView(MainActivity.this); 67 ((ImageView) valView).setLayoutParams(new TableRow.LayoutParams(200, 200)); 68 } else { 69 valView = new TextView(MainActivity.this); 70 } 71 72 row.addView(valView); 73 74 switch (val.getValueType()) { 75 case NIL: 76 keyView.setText(key.toString() + " [Null]"); 77 ((TextView) valView).setText(val.toString()); 78 break; 79 case BOOLEAN: 80 boolean b = val.asBooleanValue().getBoolean(); 81 keyView.setText(key.toString() + " [Boolean]"); 82 ((TextView) valView).setText(b ? "true" : "false"); 83 break; 84 case INTEGER: 85 IntegerValue intVal = val.asIntegerValue(); 86 if (intVal.isInIntRange()) { 87 int i = intVal.toInt(); 88 keyView.setText(key.toString() + " [int]"); 89 ((TextView) valView).setText(String.valueOf(i)); 90 } else if (intVal.isInLongRange()) { 91 long l = intVal.toLong(); 92 keyView.setText(key.toString() + " [long]"); 93 ((TextView) valView).setText(String.valueOf(l)); 94 } else { 95 BigInteger i = intVal.toBigInteger(); 96 keyView.setText(key.toString() + " [BigInteger]"); 97 ((TextView) valView).setText(String.valueOf(i)); 98 } 99 break; 100 case FLOAT: 101 FloatValue fv = val.asFloatValue(); 102 //float f = fv.toFloat(); // use as float 103 double d = fv.toDouble(); // use as double 104 keyView.setText(key.toString() + " [float/double]"); 105 ((TextView) valView).setText(String.valueOf(d)); 106 break; 107 case STRING: 108 String s = val.asStringValue().asString(); 109 keyView.setText(key.toString() + " [String]"); 110 ((TextView) valView).setText(s); 111 break; 112 case BINARY: 113 byte[] mb = val.asBinaryValue().asByteArray(); 114 // Binaryは画像前提 115 Bitmap bmp = BitmapFactory.decodeByteArray(mb, 0, mb.length); 116 keyView.setText(key.toString() + " [Bitmap]"); 117 ((ImageView) valView).setImageBitmap(bmp); 118 break; 119 case ARRAY: 120 ArrayValue a = val.asArrayValue(); 121 keyView.setText(key.toString() + " [Array]"); 122 StringBuilder sb = new StringBuilder(); 123 sb.append("["); 124 String spl = ""; 125 for (Value e : a) { 126 sb.append(spl + e); 127 spl = ", "; 128 } 129 sb.append("]"); 130 ((TextView) valView).setText(sb.toString()); 131 break; 132 case EXTENSION: 133 ExtensionValue ev = val.asExtensionValue(); 134 byte extType = ev.getType(); 135 byte[] extValue = ev.getData(); 136 keyView.setText(key.toString() + " [Extension(" + String.valueOf(extType) + ")]"); 137 ((TextView) valView).setText(String.valueOf(extValue)); 138 break; 139 } 140 } 141 } 142 }); 143 } catch (Exception ex) { 144 System.out.println(ex); 145 } 146 } 147}).start(); 148 } 149 }); 150 } 151}
投稿2017/03/07 00:30
編集2017/03/07 03:29総合スコア4267
0
ベストアンサー
サーバで画像をbese64にエンコードして、文字列と一緒にjson化して、クライアント側でbese64をデコードして画像を読むという方法はどうでしょうか。これならGET通信だけでいけます。
投稿2017/03/04 02:54
編集2017/03/04 03:08退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/03/04 04:19
2017/03/04 07:52
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。