2014-08-27 9 views
0

해당 답변을 검색 및 검색했지만 찾은 항목이 적합하지 않습니다.org.json.JSONException (Google 지역 정보)

(http://code.tutsplus.com/tutorials/android-sdk-working-with-google-maps-displaying-places-of-interest--mobile-16145)에서 자습서를 사용하여 현재 위치에서 현지 장소 (식당 등)를 식별했습니다. 그러나 자습서와 달리 내 지역 장소가 표시되지 않습니다. 다음과 같이

내 매니페스트는 다음과 같습니다

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.WreckinApp.MaJoRProduct.wbiassistant" > 

<permission 
    android:name="com.WreckinApp.MaJoRProduct.wbiassistant.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature"/> 
<uses-permission android:name="com.WreckinApp.MaJoRProduct.wbiassistant.MAPS_RECEIVE"/> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 


<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="MAPS_API_KEY"/> 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

    <activity 
     android:name=".splash" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".main" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 
    <activity android:name=".contact" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 
    <activity android:name=".map" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 
    <activity android:name=".gallery" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 
    <activity android:name=".link" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 
    <activity android:name=".split" 
     android:screenOrientation="portrait" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 


</application> 

</manifest> 

다음과 같이지도를 포함하는 활동은 다음과 같습니다

package com.WreckinApp.MaJoRProduct.wbiassistant; 

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.util.Log; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import android.location.Location; 
import android.location.LocationManager; 
import android.content.Context; 
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.os.AsyncTask; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.util.Log; 


public class map extends Activity { 
private GoogleMap map; 
private LocationManager locMan; 
private Marker userMarker; 
private int userIcon, foodIcon, drinkIcon, shopIcon, otherIcon; 
private Marker[] placeMarkers; 
private final int MAX_PLACES = 10; 
private MarkerOptions[] places; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map); 
    userIcon = R.drawable.yellow_point; 
    foodIcon = R.drawable.red_point; 
    drinkIcon = R.drawable.blue_point; 
    shopIcon = R.drawable.green_point; 
    otherIcon = R.drawable.purple_point; 

    if(map==null) { 
     //map not instantiated yet 
     map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    } 

    if(map != null){ 
     //ok - proceed 
    } 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    placeMarkers = new Marker[MAX_PLACES]; 
    updatePlaces(); 
} 
private void updatePlaces(){ 
    locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
    double lat = lastLoc.getLatitude(); 
    double lng = lastLoc.getLongitude(); 

    //update location 

    LatLng lastLatLng = new LatLng(lat, lng); 
    if(userMarker!=null){userMarker.remove();} 
    userMarker = map.addMarker(new MarkerOptions() 
      .position(lastLatLng) 
      .title("You are here") 
      .icon(BitmapDescriptorFactory.fromResource(userIcon)) 
      .snippet("Your last recorded location")); 
    map.animateCamera(CameraUpdateFactory.newLatLng(lastLatLng), 3000, null); 

    String types = "food|bar|store|museum|art_gallery"; 
    try { 
     types = URLEncoder.encode(types, "UTF-8"); 
    } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    String placesSearchStr = "https://maps.googleapis.com/maps/api/place/nearbysearch/output?" + 
      "parameters" + 
      "json?location="+lat+","+lng+ 
      "&radius=500&sensor=true" + 
      "&types=" + types + 
      "AIzaSyASEbnPuqb-_Y8N_CqBfqSw9ZPVLWQt0lQ"; 

    new GetPlaces().execute(placesSearchStr); 
} 

private class GetPlaces extends AsyncTask<String, Void, String> { 
    //fetch and parse place data 

    @Override 
    protected String doInBackground(String... placesURL) { 
     //fetch places 

     StringBuilder placesBuilder = new StringBuilder(); 

     //process search parameter string(s) 
     for (String placeSearchURL : placesURL) { 
      //execute search 

      HttpClient placesClient = new DefaultHttpClient(); 
      try { 
       //try to fetch the data 
       HttpGet placesGet = new HttpGet(placeSearchURL); 
       HttpResponse placesResponse = placesClient.execute(placesGet); 
       StatusLine placeSearchStatus = placesResponse.getStatusLine(); 

       if (placeSearchStatus.getStatusCode() == 200) { 
        //we have an OK response 
        HttpEntity placesEntity = placesResponse.getEntity(); 
        InputStream placesContent = placesEntity.getContent(); 
        InputStreamReader placesInput = new InputStreamReader(placesContent); 
        BufferedReader placesReader = new BufferedReader(placesInput); 
        String lineIn; 
        while ((lineIn = placesReader.readLine()) != null) { 
         placesBuilder.append(lineIn); 
        } 
       } 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     return placesBuilder.toString(); 
    } 
    protected void onPostExecute(String result) { 
     //parse place data returned from Google Places 
     if(placeMarkers!=null){ 
      for(int pm=0; pm<placeMarkers.length; pm++){ 
       if(placeMarkers[pm]!=null) 
        placeMarkers[pm].remove(); 
       try { 
        //parse JSON 
        JSONObject resultObject = new JSONObject(result); 
        JSONArray placesArray = resultObject.getJSONArray("results"); 
        places = new MarkerOptions[placesArray.length()]; 
        //loop through places 
        for (int p=0; p<placesArray.length(); p++) { 
         //parse each place 
         boolean missingValue=false; 
         LatLng placeLL=null; 
         String placeName=""; 
         String vicinity=""; 
         int currIcon = otherIcon; 
         try{ 
          //attempt to retrieve place data values 
          missingValue=false; 
          JSONObject placeObject = placesArray.getJSONObject(p); 
          JSONObject loc = placeObject.getJSONObject("geometry").getJSONObject("location"); 
          placeLL = new LatLng(
            Double.valueOf(loc.getString("lat")), 
            Double.valueOf(loc.getString("lng"))); 
          JSONArray types = placeObject.getJSONArray("types"); 
          for(int t=0; t<types.length(); t++) { 
           //what type is it 

           String thisType = types.get(t).toString(); 
           if (thisType.contains("food")) { 
            currIcon = foodIcon; 
            break; 
           } else if (thisType.contains("bar")) { 
            currIcon = drinkIcon; 
            break; 
           } else if (thisType.contains("store")) { 
            currIcon = shopIcon; 
            break; 
           } 
          } 
          vicinity = placeObject.getString("vicinity"); 
          placeName = placeObject.getString("name"); 

         } 
         catch(JSONException jse){ 
          missingValue=true; 
          jse.printStackTrace(); 
         } 
         if(missingValue) places[p]=null; 
         else 
          places[p]=new MarkerOptions() 
            .position(placeLL) 
            .title(placeName) 
            .icon(BitmapDescriptorFactory.fromResource(currIcon)) 
            .snippet(vicinity); 
        } 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
       if(places!=null && placeMarkers!=null){ 
        for(int p=0; p<places.length && p<placeMarkers.length; p++){ 
         //will be null if a value was missing 
         if(places[p]!=null) 
          placeMarkers[p]=map.addMarker(places[p]); 
        } 
       } 
      } 
     } 

    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.splash, menu); 
    return true; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

내 로그 캣 오류가 반복해서 같이 :

08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515) 
08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
08-27 18:07:02.577 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ org.json.JSONException: End of input at character 0 of 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at org.json.JSONTokener.syntaxError(JSONTokener.java:450) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at org.json.JSONTokener.nextValue(JSONTokener.java:97) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:155) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:172) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at com.WreckinApp.MaJoRProduct.wbiassistant.map$GetPlaces.onPostExecute(map.java:176) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at com.WreckinApp.MaJoRProduct.wbiassistant.map$GetPlaces.onPostExecute(map.java:130) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:632) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.os.Looper.loop(Looper.java:136) 
08-27 18:07:02.587 26474-26474/com.WreckinApp.MaJoRProduct.wbiassistant W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5001) 

내가 아는 것은 map.java : 13030

0123입니다.
private class GetPlaces extends AsyncTask<String, Void, String> 

JSONObject resultObject = new JSONObject(result); 

map.java:176하지만 난 튜토리얼에서 단계별로 갔다으로보고 각 라인에 어떤 문제가 있는지 알 수 없습니다. 그들은 테스트 앱에서 한번 전에 나타 났지만, (바보 같은) 삭제 한 이후로 나에게 보여줄 로컬 장소가 필요하고 그렇지 않습니다. 내가 어디로 잘못 가고 있니?

+0

요청할 때 URL의 모양은 무엇입니까? 이를 브라우저에 넣고 결과를 보면 JSON 모양이 올바른 것입니까? – rindress

답변

0

나는 코드에 아무 문제가 없다고 생각합니다. URL을 확인하십시오.

String placesSearchStr = "https://maps.googleapis.com/maps/api/place/nearbysearch/output?" + 
     "parameters" + 
     "json?location="+lat+","+lng+ 
     "&radius=500&sensor=true" + 
     "&types=" + types + 
     "AIzaSyASEbnPuqb-_Y8N_CqBfqSw9ZPVLWQt0lQ"; 

귀하의 URL에 "output?"이라는 단어가 포함되어 있습니다. json 또는 xml 출력을 의미하며 "parameters"는 생략해야합니다. 다음과 같이 표시되어야합니다.

String placesSearchStr = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?" + 
     "location="+lat+","+lng+ 
     "&radius=500&sensor=true" + 
     "&types=" + types +"&key=AIzaSyASEbnPuqb-_Y8N_CqBfqSw9ZPVLWQt0lQ"; 

희망이 있습니다.

+0

트릭을 수행 한 것으로 보입니다. 감사합니다! 이것은 지금 2 주 동안 저를 괴롭 히고 있습니다. 다음 부분에! 우 후 !! – TOUKOD

+0

당신을 진심으로 환영합니다. – yhel

0

while 루프에서 응답을 읽는 동안 줄을 더 읽으면 읽습니다. 줄 바꿈없이 삽입하고 있습니다.

도움이 될지 확신 할 수 없지만 Json 인코딩을 손상시킬 수 있습니다.

  while ((lineIn = placesReader.readLine()) != null) { 
        placesBuilder.append(lineIn + "\n"); 
       } 
+0

불행히도 변경 사항은 없지만 귀하의 도움에 감사드립니다. – TOUKOD

관련 문제