2017-07-29 10 views
0

に私はそれから現在のlatitudelongitudeともaddressを取得するためにJSONを使用するアプリケーションを構築しようとしていますが、できるだけ早く私はbuttonをクリックすると私が取得しますBasicNetwork.performRequest:予期しない応答コード400アンドロイド

E /ボレー:私のログにエラー[5807] BasicNetwork.performRequest:予期しない応答コード400 https://maps.googleapis.com/maps/api/geocode/json?latlng=0.00.0

コードのために以下に与えられる:

Gps3Activity.java

public class Gps3Activity extends AppCompatActivity { 
    private Button display; 
    private LocationManager locationManager; 
    private LocationListener locationListener; 
    private RequestQueue requestQueue; 
    private double lat; 
    private double lng; 

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

     display = (Button) findViewById(R.id.displayL); 
     requestQueue = Volley.newRequestQueue(this); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     locationListener = new myLocationlistener(); 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      return; 
     } 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); 

     display.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Log.e("Latitude", String.valueOf(lat)); 
       Log.e("Longitude", String.valueOf(lng)); 

       JsonObjectRequest request = new JsonObjectRequest("http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat+","+lng +"&sensor=true", new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          String address = response.getJSONArray("results").getJSONObject(0).getString("formatted_address"); 
          //textViewCity.setText(address); 
          Toast.makeText(getApplicationContext(), "City : " + address, Toast.LENGTH_LONG); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
       requestQueue.add(request); 
      } 
     }); 
    } 

    private class myLocationlistener implements LocationListener { 
     @Override 
     public void onLocationChanged(Location location) { 
      if (location != null) { 
       lat = location.getLatitude(); 
       lng = location.getLongitude(); 
      } 
     } 

     @Override 
     public void onStatusChanged(String s, int i, Bundle bundle) { 

     } 

     @Override 
     public void onProviderEnabled(String s) { 

     } 

     @Override 
     public void onProviderDisabled(String s) { 

     } 
    } 
} 

07-30 01:18:33.287 9750-9750/com.example.shaloin.gps2 W/System.err: org.json.JSONException: Index 0 out of range [0..0) 
07-30 01:18:33.288 9750-9750/com.example.shaloin.gps2 W/System.err:  at org.json.JSONArray.get(JSONArray.java:293) 
07-30 01:18:33.288 9750-9750/com.example.shaloin.gps2 W/System.err:  at org.json.JSONArray.getJSONObject(JSONArray.java:521) 
07-30 01:18:33.288 9750-9750/com.example.shaloin.gps2 W/System.err:  at com.example.shaloin.gps2.Gps3Activity$1$1.onResponse(Gps3Activity.java:63) 
07-30 01:18:33.288 9750-9750/com.example.shaloin.gps2 W/System.err:  at com.example.shaloin.gps2.Gps3Activity$1$1.onResponse(Gps3Activity.java:58) 

logcatはまた、私はなぜ私が0.0としてlatitudelongitudeの値を取得していますへと把握することはできませんよ。

誰でも手助けできますか?

まず:

JsonObjectRequest()のフォーマットは完全に間違っているように思わありがとう:)

答えて

0

JsonObjectRequest()の形式を変更するだけでした。正しいコードは以下のとおりである@ZeekHuge

JsonObjectRequest(int method, 
       String url, 
       JSONObject jsonRequest, 
       Response.Listener<JSONObject> listener, 
       Response.ErrorListener errorListener) 

によって示唆されるように正しい形式は以下のとおりである:この方法を使用して、それがlocationを表示するために多くの時間を要する

public class Gps3Activity extends AppCompatActivity { 

private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ; 
private Button display; 
private TextView displayLocation; 
private LocationManager locationManager; 
private LocationListener locationListener; 
private RequestQueue requestQueue; 
private double lat; 
private double lng; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gps3); 

    display = (Button) findViewById(R.id.displayL); 
    displayLocation=(TextView)findViewById(R.id.location1); 
    requestQueue = Volley.newRequestQueue(this); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationListener = new myLocationlistener(); 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

     return; 
    } 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); 

    display.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      getLocation(lat,lng); 

      Log.e("Latitude", String.valueOf(lat)); 
      Log.e("Longitude", String.valueOf(lng)); 
      Log.e("city",address); 
      Toast.makeText(getApplicationContext(), "City : " + address, Toast.LENGTH_LONG); 
      displayLocation.setText("City : "+address); 
} 
    }); 
} 

private class myLocationlistener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     if (location != null) { 
      lat = location.getLatitude(); 
      lng = location.getLongitude(); 
      //Toast.makeText(getApplicationContext(),"Latitude: "+lat+"\nLongitude: "+lng,Toast.LENGTH_LONG).show(); 
      getLocation(lat,lng); 
     } 
    } 

    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) { 

    } 

    @Override 
    public void onProviderEnabled(String s) { 

    } 

    @Override 
    public void onProviderDisabled(String s) { 

    } 
} 

public void getLocation(double latitude,double longitude){ 
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, 
      "http://maps.googleapis.com/maps/api/geocode/json?latlng="+ latitude+","+longitude +"&sensor=true", 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         address = response.getJSONArray("results").getJSONObject(0).getString("formatted_address"); 
         //textViewCity.setText(address); 
         //Toast.makeText(getApplicationContext(), "City : " + address, Toast.LENGTH_LONG); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 
    requestQueue.add(request); 
} 
} 

が。

0

が3つの問題があるようです。正しい形式は次のとおりです。

JsonObjectRequest(int method, 
        String url, 
        JSONObject jsonRequest, 
        Response.Listener<JSONObject> listener, 
        Response.ErrorListener errorListener) 

thisthis

セカンドを参照してください:あなたは、GoogleのジオコードのAPIを使用するにはジオコードAPIから

を予期しない応答を得ている、あなたが最初に自分自身を取得する必要がありますAPIキー。 フォーマットのようなものでなければなりません:(thisドキュメントを参照してください)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&location_type=ROOFTOP&result_type=street_address&key=YOUR_API_KEY 

だから、あなたがそこに見ることができる、それはAPIキーが必要です。 hereを読んでキーを取得することができます。また、には、緯度と経度の間にコンマ(、)があることがあります。コードにそのコードがありません。

第三:あなたは、位置データをフェッチするには時間がかかるためであるlatlng

0.0などを取得しています。特定の精度で位置データが得られるまで、OSは onLocationChange()を呼び出しません。したがって、ボタンをクリックすると、それまで更新された場所はありません。あなたがするべきことは、ユーザーがボタンをクリックすると、彼にメッセージ updating locationで進行状況バーを表示し、 onLocationChange()が呼び出されたときだけそれを却下することです。 'onLocationChange()'が少なくとも1回呼び出される場合にのみ latlngを使用してください。

+0

私はこのアプリを作っている間、https://stackoverflow.com/questions/20238197/get-current-location-using-json/20238474#20238474に従っています。あなたがapiキーについて述べたように、投稿はそれを持っていませんでした。 –

+0

あなたが3歳のansに従って行くことを望むなら、あなたのところまで選択してください。ユーザーが「暗黙的」であると思った場合、またはこれらのAPIの所有者であるこれらの[google docs](https://developers.google.com/maps/documentation/geocoding/intro)を信じている場合 – ZeekHuge

+0

あなたが昏睡状態に陥ったと言いましたように、私はそれを修正しました。ログには次のようなものが表示されます: 'W/System.err:org.json.JSONException:インデックス0が範囲外です[0..0)' –

関連する問題