質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.47%

  • Java

    14101questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • JSON

    1201questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

【Android】Json形式でサーバーからAndroidへデータを送信したい(ローカル環境)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,413

GH_usami13

score 16

サーバーサイドの言語は Java で
環境はローカルで行いたいです。

下記のようにサーバーで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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

サーバ
・JSONオブジェクトを文字列に変換して送出

クライアント
・送られてきた文字列をJSONオブジェクトに変換

文字列とJSONの相互変換

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 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端末からのリクエストにより、DBから位置情報を取得し、JSON化、Android端末に返却するですね?

    ・サーバ側
    サーブレットについて調べて、実装しなおしてください。

    ・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

    ・doInBackgroundの引数はURLの文字列なのか
    ・ヌルポはキャッチしない
    ・エクセプションではなく、もっと細かいエクセプションでキャッチする。

    キャンセル

  • 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

    おかげさまで、JSONの値を取得して、Mapに反映させることができました。

    http://PCのIPアドレス:8080/プロジェクト名/アノテーションのurlPatterns
    で取得できました。

    なお、今回IOExceptionが出ていた理由は、
    onCreateメソッドで、
    mapsActivity = this;
    としていなかったことにあったようです。

    お付き合いいただき、ありがとうございました。

    キャンセル

0

エクセプションでキャッチしていたせいで問題を見つけることが困難になることが多々あります。

・サーバとするPCとAndroid端末を同一無線LAN上に配置してください。
・サーバとするPCのプログラムを起動しておく。
・http://以降はサーバとするPCに割り当てられたIPを指定。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/09/29 16:18

    ご返答ありがとうございます。

    >サーバとするPCのプログラムを起動しておく。
    すみません、こちらのプログラムを起動しておくというのはどういうことでしょうか?


    同一無線LAN上に設定し、http://以降をPCのIPアドレスとして、
    実行させましたが、IOExceptionでcatchして
    org.apache.http.conn.HttpHostConnectException: Connection to http://IPアドレス refusedとなりました。
    先程は、数分後にIOExceptionになりましたが、
    MAPを移動するごとにIOExceptionとなりました。
    http://以降をlocalhostとした場合や:8080を付けた場合も同様となりました。

    10.0.2.2とした場合は、先ほどと変わらず、
    数分後にIOExceptionとなりました。

    キャンセル

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

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

関連した質問

  • 解決済

    android アプリ作成

    android studioを使ってandroidアプリ開発の勉強をしているものです。 本に書いてあるプログラムを見ながら勉強しているのですが、AsyncTaskのdoInBack

  • 解決済

    poiにおいて、Excelダウンロード処理を関数内で実行すると、ダウンロード後のタブが自動で閉じられ...

    PoiでExcelのダウンロードを行っているのですが、 以下のようにサーブレット側、サーブレットから呼び出される関数を作ると、 ダウンロード処理完了後に自動でタブが閉じられ

  • 解決済

    JsonをPHPで操作

    下記のようなJsonコードがあるとして、phpで扱うためにはどうしたらよろしいでしょうか? Jsonあまり触ったことないのでメンバへのアクセスがイマイチわからないと言いますか

  • 解決済

    Gsonの使い方

    以下のようなJsonをAPIで取得し、Gsonでjavaオブジェクトに変換したいのですが resultsの値がnullになります。 ご教授お願いします。 { "0": {

  • 解決済

    親サーブレットのロジックで子サーブレットのサーブレット名を取得

    【背景】 親サーブレットから遷移先に指定されているJSPで 呼び出し元(親サーブレットを継承し製造したサーブレット、以下子サーブレット)のサーブレット名を取得し、表示したいです

  • 受付中

    JAVAの掲示板作成

    JAVAで掲示板を作成しているが、ファイルに書き込めるが、nullと表示されているので、原因を教えてください。 BoardSevlet.java import java.i

  • 解決済

    JSPでテーブルを更新画面で更新したいのですが

    一覧画面(employeelist.jsp)でラジオボタンでテーブルの行を選択して、 更新ボタンを押し、更新画面(update.jsp)遷移させ、 そこで選択した行の情報を更新した

  • 解決済

    Android StudioでListViewを用いたRSSリーダーの開発

     前提・実現したいこと 現在、Android Studioを使ってRSSリーダーなるものを開発しようとしています。 RSSを取得しListViewに表示させたいのですが、ListV

同じタグがついた質問を見る

  • Java

    14101questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • JSON

    1201questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。