【Android】Json形式でサーバーからAndroidへデータを送信したい(ローカル環境)
- 評価
- クリップ 0
- VIEW 2,641
環境はローカルで行いたいです。
下記のようにサーバーでJson形式のデータを作成します。
{"locations":[
{
"latitube":35.680795,
"longitube":139.76721
},
{
"latitube":35.664036,
"longitube":139.6982
},
{
"latitube":35.69146104550162,
"longitube":139.70466434955597
},
{
"latitube":35.671395524875145,
"longitube":139.7557784251785
}
]}
そのデータをAndroid側で受け取って
GoogleMapsで表示させたいと考えておりす。
サーバー側でのJSON生成のコードが下記になります。
@WebServlet(name = "MakeJsonInfo" , urlPatterns = { "/MakeJsonInfo" })
public class MakeJsonInfo extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DbSelect dbselect = new DbSelect();
LinkedList<Locations> locationsList = new LinkedList<>();
Gson gson = new Gson();
PrintWriter out = response.getWriter();
try{
dbselect.connect();
double lat = 0;
double lon = 0;
int listCount = dbselect.detailListAllCount(1);
for(int i = 0; i < listCount; i++){
lat = dbselect.selectInfoList().get(i).getLatitube();
lon = dbselect.selectInfoList().get(i).getLongitube();
Locations locations = new Locations(lat , lon);
locationsList.add(locations);
}
String jsonFile = "{\"locations\":\"" + gson.toJson(locationsList) + "\"}";
out.println(jsonFile);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
static class Locations{
private double lat;
private double lon;
public Locations(double latitube , double longitube){
this.lat = latitube;
this.lon = longitube;
}
}
}
Android側
MainActivityになります。
MainActivity
AsyncDownload asyncTask = new AsyncDownload(mapsActivity);
asyncTask.execute("http://localhost:8080/プロジェクト名/アノテーションのurlPatterns?lat=" + point.latitude + "&lon=" + point.longitude + "&num_of_res=" + NumOfRes);
AsyncDownloadクラスです。
@SuppressWarnings("deprecation")
public class AsyncDownload extends AsyncTask<String, Integer, String> {
private HttpClient hClient;
private HttpGet hGetMethod;
private MapsActivity mainActivity;
private OnCameraChangeListener onCameraChangeListener;
// コンストラクター
public AsyncDownload(MapsActivity mainActivity2){
mainActivity = mainActivity2;
hClient = new DefaultHttpClient();
hGetMethod = new HttpGet();
}
// バックグラウンドで処理
@Override
protected String doInBackground(String... params) {
String uri = params[0];
return downloadLocations(uri);
}
// バックグラウンド処理が終了した後にメインスレッドに渡す処理
protected void onPostExecute(String result) {
try{
mainActivity.setResultLocations(result);
}catch(NullPointerException e){
}
}
// 位置情報(JSON)をダウンロード
private String downloadLocations(String uri) {
try {
hGetMethod.setURI(new URI(uri));
HttpResponse resp = hClient.execute(hGetMethod);
Log.d("DownloadLocations","status="+resp.getStatusLine().getStatusCode());
if (resp.getStatusLine().getStatusCode() < 400) {
String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
Log.d("DownloadLocations","res="+str);
return str;
}
} catch (Exception e) {
Log.d("DownloadLocations","error");
e.printStackTrace();
}
return null;
}
}
デバッグを用いると、
hGetMethodのuri=nullとなっているので、downloadLocationメソッド
の
HttpResponse resp = hClient.execute(hGetMethod);
が問題なのかと思います。
この場合、HTTP通信ができていないということなのでしょうか?
ご教授のほどよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
・サーバとするPCとAndroid端末を同一無線LAN上に配置してください。
・サーバとするPCのプログラムを起動しておく。
・http://以降はサーバとするPCに割り当てられたIPを指定。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/09/28 14:13
文字列に変換する処理とJsonに変換するところは
なんとなくわかるのですが、
その文字列を送受信する方法がわからなくて困っております。
よろしくお願いいたします。
2015/09/28 14:58
どのように実装するかわから無いので回答できません。
クライアント
http://d.hatena.ne.jp/m-kawato/touch/20120909/1347185105
2015/09/28 15:34
サーバー側のJson生成処理を追記いたしました。
Android側では、
AsyncTaskのdoInBackgroundメソッドで取得しようと考えております。
2015/09/28 21:11
・サーバ側
サーブレットについて調べて、実装しなおしてください。
・Android側
下記のリンク先に書いてあります。
http://d.hatena.ne.jp/m-kawato/touch/20120909/1347185105
2015/09/28 23:02
サーバー側の処理をサーブレットに変更して実行してみました。
現状、
http://localhost:8080/プロジェクト名/アノテーションのurlPatterns
をブラウザ表示させると、
質問にあるような形式での表示ができました。
この状態から
Android側で
取得ができていない状況です。
この状態においてのサーバ側の処理は問題ないのでしょうか??
2015/09/29 03:57
HttpServletResponse#getOutputStream( )を使ったほうがいいかもしれませんが、今は問題なさそうです。
Android側
情報が足りません。
何をどのようにしてできないかを教えて下さい。
2015/09/29 09:34
Android側のJsonの処理の部分を追記致しました。
何卒、よろしくお願い致します。
2015/09/29 14:31
・ヌルポはキャッチしない
・エクセプションではなく、もっと細かいエクセプションでキャッチする。
2015/09/29 15:04
>doInBackgroundの引数はURLの文字列なのか
URLの文字列で返ってきております。
こちらに関して、質問なのですが、
現在、USB接続で実機でアプリを実行しているのですが、
URLは
http://10.0.2.2/・・・という形でよろしいのでしょうか?
参考資料:http://onmosoft.daiwa-hotcom.com/wordpress/?p=198
>ヌルポはキャッチしない
かしこまりました。
>エクセプションではなく、もっと細かいエクセプションでキャッチする。
起動の数分後に、IOExceptionで
org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2 refused
というメッセージが出力されました。
すなわち、URLの設定の仕方が間違っているということですか?
2015/09/29 16:39
IOExceptionが発生するのはサーバ側のプログラムが起動していないためと考えられます。時間をおいて発生するのは再チャレンジしている可能性があります。
サーバ側プログラム起動方法については簡単なので自分で調べてください。詰まったらまたコメントしてください。
全てを聞くのではなく、自分で考えて実際に動かして、詰まってから質問してください。また、回答者はあなたのパソコンの画面を直接見ているわけではありません。しっかりと情報を提供してください。
2015/09/29 20:44
http://PCのIPアドレス:8080/プロジェクト名/アノテーションのurlPatterns
で取得できました。
なお、今回IOExceptionが出ていた理由は、
onCreateメソッドで、
mapsActivity = this;
としていなかったことにあったようです。
お付き合いいただき、ありがとうございました。