※ 日本アンドロイドの会の会員のかた(Twitter ID: @dietposter さん)からのアドバイスにより
HTTPRequestHelper クラスを用いずに、HttpURLConnection クラスのみで HTTP 送信を
行えることがわかったため本プログラムを全面的に書き換えました。
(>@dietposter さん: 貴重なアドバイスありがとうございました。)
< 【送信側】Android ケータイのGPSで位置を監視し、サーバに格納する >
package test.LocationTest1;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;
/**
* Android ケータイの GPS で位置を計測して経度、緯度情報をサーバに格納するアプリケーション
*
*/
public class LocationTest1 extends Activity implements LocationListener {
private static final String URL_LOC = "http://www3.biwako.ne.jp/~mirai954/locwrite.cgi";
private static final String POST_MSG1 = "?LAT=";
private static final String POST_MSG2 = "&LON=";
private static final String POST_METHOD = "POST";
private static final String CLASSTAG = LocationTest1.class.getSimpleName();
private static final String LOGTAG = "LocationTest1";
private LocationManager locationManager; //ロケーションマネージャ
private int iIdo = 0;
private int iKeido = 0;
/* 起動時に実行される処理 */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// LocationManager を取得する
locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
// 現在位置を取得し更新する
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0 , 0, this);
}
/* 位置情報が更新時されたときに呼び出される処理 */
@Override
public void onLocationChanged(Location location) {
/* 経度、緯度情報の読み出し */
iIdo = (int)(location.getLatitude()*1E6) ;
iKeido = (int)(location.getLongitude()*1E6) ;
/* 経度、緯度情報をサーバに格納する */
sendPostMethod();
}
/* 位置情報をサーバに送信する処理 */
private void sendPostMethod() {
URL url = null;
String sLine = "";
try {
url = new URL( URL_LOC );
} catch (MalformedURLException e) {
Log.d(LOGTAG, " " + CLASSTAG + " MalformedURLException");
}
if (url != null) {
try {
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod (POST_METHOD);
urlCon.setDoInput (true);
urlCon.setDoOutput (true);
String query = POST_MSG1 + Integer.toString(iIdo) + POST_MSG2 +
Integer.toString(iKeido);
DataOutputStream out = new DataOutputStream (urlCon.getOutputStream
());
out.writeBytes (query);
out.flush ();
out.close ();
// 内容が nul 以外なら読み出す
BufferedReader bin = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));
while ((sLine = bin.readLine()) != null) {
Log.d(LOGTAG, " " + CLASSTAG + " response= "
+ sLine);
}
bin.close(); // ファイル読み出し終了
urlCon.disconnect(); // 接続終了
} catch (IOException e) {
Log.d(LOGTAG, " " + CLASSTAG + " IOException");
}
} else {
Log.d(LOGTAG, " " + CLASSTAG + " url==null");
}
}
/* プロバイダが使用不可能な状態のときに呼ばれる処理 */
@Override
public void onProviderDisabled(String provider) {
}
/* プロバイダが使用可能な状態のときに呼ばれる処理 */
@Override
public void onProviderEnabled(String provider) {
}
/* プロバイダの状態が変化したときに呼ばれる処理 */
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
switch (status) {
case LocationProvider.AVAILABLE:
// プロバイダ実行可能のときの処理を記述する
break;
case LocationProvider.OUT_OF_SERVICE:
// プロバイダ実行不可のときの処理を記述する
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
// テンポラリが取得できないときの処理を記述する
break;
}
}
}
< 【受信側】 Android ケータイでサーバに格納された位置情報を読み出し、地図表示を行う >
package test.MapDisp1;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import android.view.Window;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* GoogleMapsを表示するアプリケーション
*
*/
public class MapDisp1 extends MapActivity {
private MapView mapView; //マップビュー
private int iIdo=0, iIdo_prev=0;
private int iKeido=0, iKeido_prev=0;
MapController mCont = null;
final static long waittime = 5000; // sleep時間
final static String urlName = "http://www3.biwako.ne.jp/~mirai954/loc.txt";
// 接続先のファイル名
/* 起動時に実行される処理 */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// アプリケーションのタイトルバーを非表示に設定する
requestWindowFeature(Window.FEATURE_NO_TITLE );
// MapView を作成する
mapView=new MapView(this,"Google Map API キー"); // ★★★【注1】
// GoogleMap上でのドラッグ、ドロップを許可する
mapView.setClickable(true);
// 拡大縮小ボタンを表示する
mapView.setBuiltInZoomControls(true);
setContentView(mapView);
mCont = mapView.getController();
mCont.setZoom(20); // 各住宅位置がわかる程度に拡大して表示する
// 位置情報の読み出し&地図表示用スレッドの生成、開始
MyThread th1 = new MyThread("th1");
th1.start();
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
// 独自 Thread クラス
class MyThread extends Thread {
// コンストラクタ
public MyThread(String name) {
super(name);
}
// スレッド本体
public void run() {
URL url = null;
String sLine = "";
int iIndex = 0;
String sLon="", sLat="";
while ( true ) {
try {
url = new URL(urlName);
} catch (MalformedURLException e) {
}
if (url != null) {
try {
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
BufferedReader bin = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));
// 内容が null 以外なら読み出す
while ((sLine = bin.readLine()) != null) {
iIndex = sLine.indexOf("&LAT");
sLat = sLine.substring( 4, iIndex );
iKeido = Integer.parseInt(sLat);
sLon = sLine.substring( iIndex+5 );
iIdo = Integer.parseInt(sLon);
// 緯度、経度の何れかが変化したら地図を表示する
if ( (iIdo != iIdo_prev) || (iKeido != iKeido_prev) ) {
iIdo_prev = iIdo;
iKeido_prev = iKeido;
mCont.animateTo(new GeoPoint(iIdo,iKeido));
}
}
bin.close(); // ファイル読み出し終了
urlCon.disconnect(); // 接続終了
} catch (IOException e) {
}
} else {
}
try {
// 一定時間待つ
Thread.sleep( waittime );
} catch (InterruptedException ex) {
}
}
}
}
}
【注1】
mapView=new MapView(this, "Google Map API キー"); の
"Google Map API キー" の部分は実際に取得したキーを記述します。