Android データのアップロード
柴犬は園児たちの動きが気になるようでじっと見ていました。
概要
jsonファイルをサーバーにアップロードすることを考えてみました。
MainActivity.java
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));