2016-12-02 6 views
0

私は、ウェブサイトから場所の高度を取得する方法を作成しようとしています: https://maps.googleapis.com/maps/api/elevation/json?locations=0,0(ここで0,0は任意の座標で置き換えられます)。Android getInputStreamが正しく機能していない

ただし、URL接続からInputStreamを取得するときに問題が発生しました。

private double altitude(double lat, double longi) { 
    String elevation = ""; 
    try { 
     URL alt = new URL("https://maps.googleapis.com/maps/api/elevation/json?locations="+lat+","+longi); 
     HttpURLConnection altFind = (HttpURLConnection) alt.openConnection(); 
     altFind.setDoInput(true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(altFind.getInputStream())); 
     String inputLine; 
     OUT: 
     while ((inputLine = in.readLine()) != null) { 
      if (inputLine.contains("elevation")) { 
       for (int i = 23; ; i++) { 
        if (inputLine.charAt(i) != ',') { 
         elevation = elevation + "" + inputLine.charAt(i); 
        } else { 
         break OUT; 
        } 
       } 
      } 
     } 
     return Double.parseDouble(elevation); 
    } catch (MalformedURLException e) {} 
    catch (IOException e) {} 
    return 0; 
} 

方法であると私はここからそれを呼び出すこと:

private TextView t; 
private LocationManager locationManager; 
private LocationListener listener; 
double elev; 

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

    Intent intent = getIntent(); 
    String longlat = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
    longlat = longlat.replaceAll(" ", ""); 
    String [] longilati = longlat.split(","); 
    final double [] coord = new double[2]; 
    coord[0] = Double.parseDouble(longilati[0]); 
    coord[1] = Double.parseDouble(longilati[1]); 

    t = (TextView) findViewById(R.id.textView); 

    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     elev = altitude(coord[0], coord[1]); 
    } else { 
     Toast.makeText(this, "No connection available", Toast.LENGTH_LONG).show(); 
    } 

私は無駄に同様の質問に、次の試してみました。

+2

「正しく動作していません」と定義してください。間違いはありますか?それはクラッシュしますか?予期しないことは何ですか? – Knossos

+0

'URL接続からInputStreamを取得する際に問題が発生しました。どの問題? – greenapps

+1

あなたは 'NetworkOnMainThreadException'を持っています。そしてあなたのアプリはクラッシュしています。あなたはそのすべてに言わなければなりませんでした! – greenapps

答えて

1

バックグラウンドスレッドでネットワーク接続を実行する必要があります。

Asynctaskクラスを使用し、メソッドをdoInBackground()内に移動することができます。

あなたがここで詳細を読むことができます: https://developer.android.com/reference/android/os/AsyncTask.html

をEDITED:

私はこれをチェックアウトし、私はこれは何が必要だと思うJSONParserと呼ばれるこのクラスを見つけました: https://gist.github.com/dmnugent80/b2e22e5546c4b1c391ee

コピー&ペーストそれをあなたのプロジェクトに組み込みます。

JSONParserクラスからmakeHttpRequestメソッドを呼び出し、必要なすべてのパラメータを渡して、altitudeメソッドを変更できます。正しく操作すると、メソッドはURLからJSONオブジェクトを返します。たとえば、次のように

doInBackground内部
private static final String URL = "https://maps.googleapis.com/maps/api/elevation/json"; 
private static final String METHOD = "GET"; // You can use POST either 

private double altitude(double lat, double lng) { 
    double elevation = 0.0; 
    HashMap<String, String> params = new HashMap<>(); 
    params.put("locations", lat + "," + lng); 
    // Here you can put another params if needed 

    JSONParser jsonParser = new JSONParser(); 
    JSONObject jsonObject = jsonParser.makeHttpRequest(URL, METHOD, params); 

    if(jsonObject != null) { 
     Log.d(TAG, jsonObject.toString()); // Check if data has arrived safely? 

     try { 
      JSONArray results = jsonObject.getJSONArray("results"); 
      JSONObject result = results.getJSONObject(0); 
      elevation = result.getDouble("elevation"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return elevation; 
    } else { 
     return -1; 
    } 
} 

コールaltitudeと結果を参照してください。

+0

私はこれを追加しようとしましたが、うまくいきませんでした。私は間違っているかもしれませんが –

+0

リンクのコードを使用してメソッドを実行する際に問題が発生しました –

+0

@JoshuaTurner私は自分の答えを編集しました。 –

関連する問題