Androidスマートフォンの現在地データをサーバーに送信する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,377

horisuke3232

score 109

以前こちら
https://teratail.com/questions/26472
で質問させていただいて、回答に取得した現在位置をサーバーに送信する。とありました。
そこで実際に試してみようと思い、以前使っていたAndroid端末を準備しました。
サーバーはAWSを使おうと思います。

初歩的で申し訳ないのですが、Android端末からGPS情報を取得しAWSに送るにはどのようにするのでしょうか?

インターネットで調べたところ、gps情報を発信するためのコードがありました。こちらのコードを使って送信したいと考えています。

LocationSenderService.javaファイルに
private final String server = "http://192.168.0.4/";
とあるので、こちらのURLをAWSに変更すれば送れるものなのでしょうか?

HTMLとCSSについてはある程度わかるのですが、それ以外については操作したことがありません。
先ほど、Androidstudioをインストールしたレベルです。。。

**GPSTest1.java**

package com.example.gpstest1;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class GPSTest1 extends Activity implements OnClickListener {

    private Button btnSendStart;
    private Button btnSendStop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gpstest1);

        btnSendStop = (Button)findViewById(R.id.btnSendStop);
        btnSendStart = (Button)findViewById(R.id.btnSendStart);

        btnSendStop.setOnClickListener(this);
        btnSendStart.setOnClickListener(this);

    }

    @Override
    protected void onDestroy() {

        Intent locationSenderService = new Intent(GPSTest1.this, LocationSenderService.class);
        stopService(locationSenderService);

        super.onDestroy();
    }

    @Override
    public void onClick(View view) {
        // TODO Auto-generated method stub
        if (view == btnSendStop) {
            Intent locationSenderService = new Intent(GPSTest1.this, LocationSenderService.class);
            stopService(locationSenderService);

            btnSendStop.setEnabled(false);
            btnSendStart.setEnabled(true);
        } else if (view == btnSendStart) {
            Intent locationSenderService = new Intent(GPSTest1.this, LocationSenderService.class);
            startService(locationSenderService);

            btnSendStop.setEnabled(true);
            btnSendStart.setEnabled(false);

        }
    }

}
**LocationSenderService.java**


package com.example.gpstest1; 
import java.io.IOException;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.widget.Toast;

public class LocationSenderService extends Service implements LocationListener {

    private final String server = "http://192.168.0.4/";
    private final String path = "PHP/LocationLogger.php";
    private String username = "pondelion";
    private LocationManager lm;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        lm = (LocationManager)getSystemService(LOCATION_SERVICE);

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 0, this);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, this);

        Toast.makeText(this, "サービス開始", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onDestroy() {
        lm.removeUpdates(this);

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        String url = server 
                + path
                + "?username="
                + username
                + "&latitude="
                + location.getLatitude()
                + "&longitude="
                + location.getLongitude()
                + "×tamp="
                + System.currentTimeMillis();

        try {
            HttpClient httpClient = new DefaultHttpClient();
            httpClient.execute(new HttpGet(url));
            Toast.makeText(getApplicationContext(), "位置を送信しました", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), "Error : " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2016/02/13 21:25

    何もしていない状態から質問をしても解決には至らないと思いますよ。
    コードなどを追記してください。

    キャンセル

  • 退会済みユーザー

    2016/02/16 14:35

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

0

あんまり綺麗なソースではないですが、自分が流用しているpost送信用クラスです。

package com.example.gcmsample;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p>
 * TODO: Customize class - update intent actions, extra parameters and static
 * helper methods.
 */
public class MyIntentService extends IntentService {
    // TODO: Rename actions, choose action names that describe tasks that this
    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
    private String message,title;
    private String ret;
    private String URL = "https://xxxxxxxxxxxxxxxx/";

    public MyIntentService(String name) {
        super(name);
        // TODO 自動生成されたコンストラクター・スタブ

    }

    public MyIntentService() {
        // TODO 自動生成されたコンストラクター・スタブ
        super("MyIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO 自動生成されたメソッド・スタブ

        // Log.d("IntentService", "onHandleIntent Start");
        // InputDialogからのintent受取後、文字列に
        message = intent.getStringExtra("message");
        title = intent.getStringExtra("title");
        Log.d("***INTENT***", URL);

        exec_post();

    }

    // POST通信を実行(AsyncTaskによる非同期処理を使わないバージョン)
    private void exec_post() {

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e2) {
            // TODO 自動生成された catch ブロック
            e2.printStackTrace();
        };


        // Log.d("posttest", "postします");
        ret = "";
        // URL
        URI url = null;
        try {
            url = new URI(URL);
             Log.d("posttest", "URLはOK");
        } catch (URISyntaxException e) {
            e.printStackTrace();
            ret = e.toString();
        }

        // POSTパラメータ付きでPOSTリクエストを構築
        HttpPost request = new HttpPost(url);
        ArrayList<NameValuePair> post_params = new ArrayList<NameValuePair>();
        post_params.add(new BasicNameValuePair("message", message));
        post_params.add(new BasicNameValuePair("title", title));
        try {
            // 送信パラメータのエンコードを指定
            request.setEntity(new UrlEncodedFormEntity(post_params, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }

        // POSTリクエストを実行
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
             Log.d("posttest", "POST開始");
            ret = httpClient.execute(request, new ResponseHandler<String>() {

                @Override
                public String handleResponse(HttpResponse response)
                        throws IOException {
                     Log.d("posttest", "レスポンスコード:"+
                     response.getStatusLine().getStatusCode());

                    // 正常に受信できた場合は200
                    switch (response.getStatusLine().getStatusCode()) {
                    case HttpStatus.SC_OK:
                         Log.d("posttest", "レスポンス取得に成功");

                        // レスポンスデータをエンコード済みの文字列として取得する
                        return EntityUtils.toString(response.getEntity(),
                                "UTF-8");

                    case HttpStatus.SC_NOT_FOUND:
                        Log.d("posttest", "データが存在しない");
                        return null;

                    default:
                        Log.d("posttest", "通信エラー");
                        return null;
                    }

                }

            });

        } catch (IOException e) {
             Log.d("posttest", "通信に失敗:" + e.toString());
        } finally {
            // shutdownすると通信できなくなる
            httpClient.getConnectionManager().shutdown();
        }

    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる