1,721 views
この記事は最終更新から 2265日 が経過しています。
1. やりたいこと
(4) BMI計算アプリを作る。 では、入力された身長、体重から BMI値を算出して表示するアプリを作った。
今回は算出した BMI値を WEB上で保存すべく、HTTPプロトコルで WEBサーバーと繋げてみたい。
※たまたま自分が使っているサイトが HTTPSオンリーに設定しているため、HTTPSを使用する。
いろいろと機能てんこ盛りにすると息切れしてしまうので、
まずは GETのパラメータで身長、体重、BMIを渡すところまでを作ってみる。
2. やってみる!
(1) 方針
(4) BMI計算アプリを作る。 で作ったプログラムからの変更点はわずかだ。
1) [計算実行]ボタン押下で BMI値を算出した後、HTTPの GETで身長、体重、BMIを WEBサーバーに送信する。
2) WEBサーバー側では渡された各値をファイル保存する。
以上だ。
(2) マニュフェストの変更
自動生成されたマニュフェストでは、インターネット接続が NGになっている。
マニュフェストファイルを書き換えてこれを許可する。
AndroidManufest.xml
uses-permission の行を追加する。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.dogrow.www.mybmi"> <uses-permission android:name="android.permission.INTERNET" />
でないと、HttpsURLConnection::connect() でこんな例外が発生する。
java.lang.SecurityException: Permission denied (missing INTERNET permission?)
(3) 実装
(4) BMI計算アプリを作る。 からの変更箇所だけを記す。
MainActivity.java
onClick() の最後に★★★を追加する。
public void onClick(View v){ // 身長と体重の入力値を取得 double input_H_double = Double.valueOf(input_H.getText().toString()); double input_W_double = Double.valueOf(input_W.getText().toString()); double BMI = calcBMI(input_H_double, input_W_double); // BMI算出結果を表示 String result = String.format("%.1f", BMI); bmi_result.setText(result); //★★★ WEBにデータ送信 HttpReq http_req = new HttpReq(); http_req.SendDataToWEB(input_H_double, input_W_double, BMI); }
HttpReq.java
このファイルはクラスの新規作成で作った。
通信用スレッドを生成し、その中で身長、体重、BMIを引数として HTTPリクエストを送信している。
package net.dogrow.www.mybmi; import android.util.Log; import javax.net.ssl.HttpsURLConnection; import java.net.URL; public class HttpReq { public void SendDataToWEB(double h, double w, double bmi){ final String url = String.format("https://www.dogrow.net/android/sample/0007/index.php?w=%f&h=%f&bmi=%f", w, h, bmi); new Thread(new Runnable() { @Override public void run() { HttpsURLConnection con = null; try { URL jnUrl = new URL(url); con = (HttpsURLConnection)jnUrl.openConnection(); con.connect(); int status = con.getResponseCode(); if (status != HttpsURLConnection.HTTP_OK) { Log.d("HttpReq.Thread", "Failed. status = " + status); } } catch(Exception e) { System.out.println(e); } finally{ if(con != null) { con.disconnect(); } } } }).start(); } }
index.php
WEBサーバー側には以下のファイルを置いた。
<? if(count($_GET) > 0){ $dt = strftime("%Y-%m-%d %H:%M:%S", time()); $add = ''; $fh = fopen("testG.txt", "a+"); foreach($_GET as $k => $v){ $add .= "{$k}:{$v} "; } $line = "{$dt} {$add}\n"; fwrite($fh, $line); fclose($fh); }
(4) 実行結果
BMI計算の後、WEBサーバーに以下のようなファイルが出来ていた。 → OK!
2018-09-30 00:09:56 w:80.000000 h:178.000000 bmi:25.249337 2018-09-30 00:31:40 w:68.000000 h:174.000000 bmi:22.460034
3. 所感
・HTTPレスポンスの取得は別の機会にやってみる。
・HTTPSでは URLも暗号化されているので、GETで渡した BMI値が伝送路上で漏洩する可能性は低い。
・サーバー側では BMI値を DBに保存するように改造しよう。(いつか)
・サーバー側からグラフ画像を取得しても面白いかも。(数値を取得してスマホ側でグラフ化でもよい)
4. 参考
ありがとうございます。 m(_ _)m
https://hogem.hatenablog.com/entry/20100307/1267977441