2,168 views
この記事は最終更新から 2758日 が経過しています。
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