(7) Androidアプリから HTTPでサイトに接続する。

投稿者: | 2018年9月30日

この記事は最終更新から 1155日 が経過しています。

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


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)