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));