2014-03-13 42 views
4

我一直在關注教程,以創建一個應用程序,使用Google Maps和Places API顯示附近的地方。具體而言,我試圖查看附近的餐館或外賣店。實際上,應用程序顯示地圖片段,但沒有地方顯示爲標記。FileNotFoundException嘗試使用Maps API查找附近地點時

我曾嘗試增加半徑值,並將類型更改爲以下列出的部分:https://developers.google.com/places/documentation/supported_types,但我得到相同的FileNotFoundException錯誤。任何人都可以看到出了什麼問題?

這是我的LogCat。

03-13 17:21:51.076: E/GooglePlayServicesUtil(13109): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 
03-13 17:21:51.436: D/dalvikvm(13109): GC_FOR_ALLOC freed 2262K, 24% free 8393K/10920K, paused 65ms, total 83ms 
03-13 17:21:51.536: D/dalvikvm(13109): GC_FOR_ALLOC freed 1339K, 23% free 8409K/10920K, paused 21ms, total 23ms 
03-13 17:21:51.586: W/ActivityThread(13109): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader()); 
03-13 17:21:52.137: D/dalvikvm(13109): GC_FOR_ALLOC freed 739K, 19% free 8928K/10920K, paused 31ms, total 32ms 
03-13 17:21:52.387: D/dalvikvm(13109): GC_FOR_ALLOC freed 775K, 18% free 9233K/11192K, paused 18ms, total 19ms 
03-13 17:21:52.457: W/SystemClock(13109): time going backwards: prev 232776411235435(ioctl) vs now 232776411021793(ioctl), tid=13531 
03-13 17:21:53.308: D/dalvikvm(13109): GC_FOR_ALLOC freed 1516K, 19% free 9496K/11604K, paused 21ms, total 21ms 
03-13 17:21:53.619: D/Exception while downloading url(13109): java.io.FileNotFoundException: https://maps.googleapis.com/maps/api/place/nearbysearch/json??types=meal_takeawaylocation=55.94395494, -3.12815476&radius=10000&sensor=true&key=[My API Key] 
03-13 17:21:53.629: D/Background Task(13109): java.lang.NullPointerException 
03-13 17:21:53.659: D/Exception(13109): java.lang.NullPointerException 

這裏是我的代碼:

public class GPSActivity extends FragmentActivity implements LocationListener{ 

GoogleMap mGoogleMap; 
String[] mPlaceType=null; 
String[] mPlaceTypeName=null; 

double mLatitude=0; 
double mLongitude=0; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gps); 

    mPlaceType = getResources().getStringArray(R.array.place_type); 
    mPlaceTypeName = getResources().getStringArray(R.array.place_type_name); 

    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 
    if(status!=ConnectionResult.SUCCESS) { 
     int requestCode = 10; 
     Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
     dialog.show(); 
    } else { 
     SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mGoogleMap = fragment.getMap(); 
     mGoogleMap.setMyLocationEnabled(true); 
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     String provider = locationManager.getBestProvider(criteria, true); 
     Location location = locationManager.getLastKnownLocation(provider); 

     if (location!=null) { 
      onLocationChanged(location); 
     } 

     locationManager.requestLocationUpdates(provider, 20000, 0, this); 

     String type = mPlaceType[0]; 

     StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
     sb.append("?types=meal_takeaway"); 
     sb.append("location="+mLatitude+", "+mLongitude); 
     sb.append("&radius=10000"); 
     sb.append("&sensor=true"); 
     sb.append("&key=[My API Key]"); 

     PlacesTask placesTask = new PlacesTask(); 
     placesTask.execute(sb.toString()); 
    } 
} 

public void onLocationChanged(Location location) { 
    mLatitude = location.getLatitude(); 
    mLongitude = location.getLongitude(); 
    LatLng latLng = new LatLng(mLatitude, mLongitude); 
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 
} 

protected void onPostExecute(List<HashMap<String,String>> list) { 
    mGoogleMap.clear(); 
    for (int i=0; i<list.size(); i++) { 
     MarkerOptions markerOptions = new MarkerOptions(); 
     HashMap<String,String> hmPlace = list.get(i); 
     double lat = Double.parseDouble(hmPlace.get("lat")); 
     double lng = Double.parseDouble(hmPlace.get("lng")); 
     String name = hmPlace.get("meal_takeaway"); 
     String vicinity = hmPlace.get("vicinity"); 
     LatLng latLng = new LatLng(lat, lng); 
     markerOptions.title(name+" : "+vicinity); 
     mGoogleMap.addMarker(markerOptions); 
    } 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 
} 


class PlacesTask extends AsyncTask<String,Integer,String> { 
String data = null; 

private String downloadUrl(String strUrl) throws IOException { 
    String data = ""; 
    InputStream iStream = null; 
    HttpURLConnection urlConnection = null; 
    try { 
     URL url = new URL(strUrl); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.connect(); 
     iStream = urlConnection.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 
     StringBuffer sb = new StringBuffer(); 
     String line = ""; 
     while ((line = br.readLine()) !=null) { 
      sb.append(line); 
     } 
     data = sb.toString(); 
     br.close(); 
    } catch (Exception e) { 
     Log.d("Exception while downloading url", e.toString()); 
    } finally { 
     iStream.close(); 
     urlConnection.disconnect(); 
    } 
    return data; 
} 

protected String doInBackground(String... url) { 
    try { 
     data = downloadUrl(url[0]); 
    } catch(Exception e) { 
     Log.d("Background Task", e.toString()); 
    } 
    return data; 
} 

protected void onPostExecute(String result) { 
    ParserTask parserTask = new ParserTask(); 
    parserTask.execute(result); 
} 
} 

謝謝你,我會很感激的任何幫助。

編輯:異常現在消失了,但標記仍然沒有顯示在地圖上。

+0

是的,我已經在我的清單中的所有這些權限: <使用許可權的android:name = 「android.permission.INTERNET對」/> <使用許可權的android:NAME =」 android.permission.ACCESS_NETWORK_STATE「/> <使用權限android:name =」android.permission.WRITE_EXTERNAL_STORAGE「/> <使用權限android:name =」com.google.android.providers.gsf.permission.READ_GSERVICES「 /> user1860676

+0

你可以添加代碼爲pl王牌任務? – cbrulak

+0

已向OP添加Places任務。 – user1860676

回答

0

嘗試刪除api網址中位置座標之間的空格。

+0

這似乎已經擺脫了FileNotFoundError,但地圖仍然沒有顯示任何標記。 – user1860676

1

看起來像你的網址構建器壞了。您有:

StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
     sb.append("?types=meal_takeaway"); 
     sb.append("location="+mLatitude+", "+mLongitude); 
     sb.append("&radius=10000"); 
     sb.append("&sensor=true"); 
     sb.append("&key=[My API Key]"); 

這意味着你必須 ?jsontypes,並沒有&之間types=meal_takeawaylocation之間。修復它,像這樣:

StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
     sb.append("types=meal_takeaway"); 
     sb.append("&location="+mLatitude+","+mLongitude); 
     sb.append("&radius=10000"); 
     sb.append("&sensor=true"); 
     sb.append("&key=[My API Key]"); 

(注:僅在改變前兩個sb.append()調用 - 也去掉了空間)

FWIW,它很可能是從長遠來看,使用排或類似的東西更容易用於JSON請求,而不是單獨下載url並解析它。

+0

現在FileNotFoundException消失了,但我仍然沒有任何標記顯示出來,除了我的當前位置。 – user1860676

+0

不使用'StringBuilder',java將'StringBuilder'中的每個'String'操作轉換爲''StringBuilder''中的連接 – sherpya

+0

爲什麼你不記錄(並在此共享)你創建的URL。確保清理您的API密鑰。我只是使用我的API密鑰做了一個請求,並且沒有任何問題獲得本地很多列表。 – 323go

0

您的網址已損壞,您在緯度座標後添加逗號後的空格。

如果您想要抽象地點API處理,我最近開發了一個Java庫,它是Place API的1對1映射。到附近的餐館就像。

GooglePlaces client = new GooglePlaces("apiKey"); 
List<Place> places = client.getNearbyPlaces(lat, lng, GooglePlaces.MAXIMUM_RESULTS, Param.name("types").value("restaurant")); 
for (Place place : places) { 
    System.out.println(place.getName()); 
} 

https://github.com/windy1/google-places-api-java

相關問題