Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

Android データのアップロード

柴犬は園児たちの動きが気になるようでじっと見ていました。

概要

jsonファイルをサーバーにアップロードすることを考えてみました。

MainActivity.java

copy

package siba.inu.android.customview;

import android.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;

public class PostActivity extends AppCompatActivity {

    final String TAG = "Json_Post";

    private String postURL = "https://sibainu.org/script.php";
    private Map<String, Object> postmap = new HashMap<>();
    private Button btn;
    private TextView tvresult;
    private ClickListener listner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post5);

        btn = findViewById(R.id.button);
        listner = new ClickListener();
        btn.setOnClickListener(listner);

        tvresult = findViewById(R.id.textView);
    }

    // クリック時のリスナー
    private class ClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            sendPost();
        }
    }

    public void sendPost(){

        postmap.put("name","name");
        postmap.put("userid","userid");
        postmap.put("access","access");
        postmap.put("key","key");
        postmap.put("data",【JSONフォーマット文字列】);

        new PostAsyncTask(tvresult){

            @Override
            protected void onPostExecute(String response) {
                String name = "";
                String access = "";
                if (_success == true) {
                    try {
                        JSONObject rootJson = new JSONObject(response);
                        name = rootJson.getString("name");
                        access = rootJson.getString("access");
                    } catch (JSONException ex) {
                        /// 解析エラー時の処理
                        Log.e(TAG, "JSON解析に失敗しました", ex);
                    }
                    _tvResult.setText("name: " + name + "   access: " + access);
                }
            }
        }.execute(new PostTaskParams(
                postURL, postmap));
    }

    public class PostTaskParams {
        String _url;
        Map<String, Object> _postData;

        public PostTaskParams(String url, Map<String, Object> postData) {
            this._url = url;
            this._postData = postData;
        }
    }
    public class PostAsyncTask extends AsyncTask<PostTaskParams, String, String> {
        public TextView _tvResult;
        public boolean _success = false;

        public PostAsyncTask(TextView tvresult) {
            _tvResult = tvresult;
        }

        @Override
        protected String doInBackground(PostTaskParams...params) {
            // パラメータから値を取得します。
            String urlString = params[0]._url;
            Map<String, Object> postDataMaps = params[0]._postData;
            // 初期値を設定します。
            HttpURLConnection conn = null;
            InputStream is = null;
            String result = "";

            try {
                // 連想配列から送信データを作成します。
                StringBuilder postData = new StringBuilder();
                // 連想配列をペアで結合処理
                for (Map.Entry<String, Object> entry : postDataMaps.entrySet()) {
                    // 先頭が & にならないようにします。
                    if (postData.length() != 0) postData.append('&');
                    // エンコードして結合します。
                    postData.append(URLEncoder.encode(entry.getKey(), "UTF-8"))
                            .append('=')
                            .append(URLEncoder.encode(String.valueOf(entry.getValue()), "UTF-8"));
                }
                // 送信するデータをバイト配列に変換
                byte[] postDataBytes = postData.toString().getBytes("UTF-8");

                // URLを設定します。
                URL url = new URL(urlString);
                conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                // 入力可能
                connection.setDoInput(true);
                // cache無し
                connection.setUseCaches(false);
          // データタイプをjsonに指定する
          connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
                conn.setConnectTimeout(2000);

                // POSTのデータを送る
                OutputStream os = conn.getOutputStream();
                os.write(postDataBytes);
                os.flush();
                os.close();

                // POSTのデータを送る(他の方法1)
                // conn.connect();
                // BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
                // writer.write(postDataBytes);
                // writer.close();

                // POSTのデータを送る(他の方法2)
                // OutputStream os = conn.getOutputStream();
                // PrintStream ps = new PrintStream(os);
                // ps.print(postDataBytes);
                // ps.close();

                // レスポンスを受け取る
                int status = conn.getResponseCode();
                if (status != HttpsURLConnection.HTTP_OK) {
                    throw new IOException("ステータスコード: " + status);
                }
                // 成功の場合
                is = conn.getInputStream();
                result = is2String(is);
                _success = true;

            }
            catch(SocketTimeoutException ex) {
                Log.e(TAG, "タイムアウト", ex);
            }
            catch(MalformedURLException ex) {
                Log.e(TAG, "URL変換失敗", ex);
            }
            catch(IOException ex) {
                Log.e(TAG, "通信失敗", ex);
            }
            finally {
                if (conn != null) {
                    conn.disconnect();
                }
                try {
                    if (is != null) {
                        is.close();
                    }
                }
                catch (IOException ex) {
                    Log.e(TAG, "InputStream解析失敗", ex);
                }
            }
            return result;
        }
    }

    private String is2String(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        StringBuffer sb = new StringBuffer();
        char[] b = new char[1024];
        int line;
        while(0 <= (line = reader.read(b))) {
            sb.append(b, 0, line);
        }
        return sb.toString();
    }
}

タスクの実行

指定されたパラメータを使用してタスクを実行します。タスクはそれ自体 (this) を返すため、呼び出し元はタスクへの参照を保持するので、次のように記述します。

        new PostAsyncTask(tvresult){

            @Override
            protected void onPostExecute(String response) {
                String name = "";
                String access = "";
                if (_success == true) {
                    try {
                        JSONObject rootJson = new JSONObject(response);
                        name = rootJson.getString("name");
                        access = rootJson.getString("access");
                    } catch (JSONException ex) {
                        /// 解析エラー時の処理
                        Log.e(TAG, "JSON解析に失敗しました", ex);
                    }
                    _tvResult.setText("name: " + name + "   access: " + access);
                }
            }
        }.execute(new PostTaskParams(
                postURL, postmap));