5.1 搜索周边信息的方法 在此,笔者提供一个公共类,以供周边信息搜索,原理是利用当前位置信息,在Google Place API上搜索信息,所以需要在开发者控制台申请Place API的接入
5.2 在公共类的方法中需要提供一个apikey的参数,这里并不是用之前已申请的key,在帐号申请之处,API Access页面中已有一个key,用它就可以了。 5.3 GoogleUtil公共类 注意:此公共类为其他网友所写,为保证著作权,所以使用时请标注上作者名 GoogleUtil.java import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Scanner;
import org.json.JSONArray; import org.json.JSONObject;
import android.util.Log;
import com.google.android.gms.maps.model.LatLng;
/** * Google Map的搜索工具 * * @author macro * */ public class GoogleUtil { private static String URL_API = "https://maps.googleapis.com/maps/api/place/search/json?"; /** * 根据传入的条件信息查询附近信息 * * @param key API 密钥 * @param location 即要在其周围检索地方信息的纬度/经度。必须指定为纬度、经度。 * @param radius 范围 * @param sensor 请求的设备是否会使用 GPS 等位置传感器 * @param keyword 方建立索引的全部内容相匹配的字词(可选) * @param language 语言代码(可选) * @param name 地方信息的名称进行匹配的字词(可选) * @param types 指定类型相匹配的地方信息,类型应使用竖线符号 (type1|type2|etc) 进行分隔(可选) * @return List<Map<String, String>> */ public static List<Map<String, String>> queryByCondition(String apikey, LatLng latLng, int radius, String keyword, String language, String name, String types) throws Exception { List<Map<String, String>> listMaps = new LinkedList<Map<String, String>>(); // *******************************************组装请求路径信息 ************************************************************************// // 例子: https://maps.googleapis.com/maps/api/place/search/json?location=-33.8670522,151.1957362&radius=500&types=food&name=harbour&sensor=false&key=AddYourOwnKeyHere URL_API += "location=" + latLng.latitude + "," + latLng.longitude + "&radius=" + radius + "";
if (null != keyword && keyword.length() > 0) {// 关键词 URL_API += "&keyword=" + keyword; } if (null != language && language.length() > 0) {// 语言 URL_API += "&language=" + language; } if (null != name && name.length() > 0) {// 匹配名称 URL_API += "&name=" + name; } if (null != types && types.length() > 0) {// 类型 URL_API += "&types=" + types; } URL_API += "&sensor=false"; URL_API += "&key=" + apikey + ""; System.out.println("请求的URL=" + URL_API); // *******************************************获取查询得到的返回值************************************************************************// StringBuffer buf = new StringBuffer(); InputStream input = null; try { URL url = new URL(URL_API); input = url.openStream(); Scanner scan = new Scanner(input); while (scan.hasNext()) { buf.append(scan.next()); // 所有的数据都保存在字符串里面 } } catch (Exception e) { e.printStackTrace(); throw e; } finally { if (input != null) { input.close(); } } System.out.println("查询得到的数据=" + buf.toString()); JSONObject allData = new JSONObject(buf.toString()); // 获取连接状态 String status = allData.getString("status"); if ("OK".equals(status)) { JSONArray jsonArr = allData.getJSONArray("results"); for (int i = 0; i < jsonArr.length(); i++) { Map<String, String> map = new HashMap<String, String>(); JSONObject jsonObj = jsonArr.getJSONObject(i); map.put("vicinity", jsonObj.getString("vicinity")); map.put("icon", jsonObj.getString("icon")); map.put("name", jsonObj.getString("name")); JSONObject locationJsonObj = jsonObj.getJSONObject("geometry").getJSONObject("location"); map.put("latitude", locationJsonObj.getString("lat")); map.put("longitude", locationJsonObj.getString("lng")); listMaps.add(map); Log.v("location", "latitude="+locationJsonObj.getString("lat")+",longitude="+locationJsonObj.getString("lng")); } } return listMaps; }
} 5.4 使用公共类中queryByCondition方法 MainActivity.java import java.util.List; import java.util.Map;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions;
import android.app.ProgressDialog; import android.location.Location; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.View; import android.widget.Toast;
public class MainActivity extends FragmentActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener{ public static final int STATUS_FAILED = 0; public static final int STATUS_SUCCESS = 1; public static final int STATUS_NETERROR = 2; private static final String API_KEY = "AIzaSyBYHW-0vQ5RHPCrh8Zc7uBks8KSTibntcs"; private static final String language = "zh-CN"; private static final String types = "food|restaurant"; private static final int radius = 200; private String name = ""; private String keywords = "";
private List<Map<String, String>> listMaps = null; private LatLng latLng = null;
private LocationClient mLocationClient;
private ProgressDialog progressDialog = null; private static GoogleMap mMap;
private static final LocationRequest REQUEST = LocationRequest.create() .setInterval(2000) // 2 seconds .setFastestInterval(16) // 16ms = 60fps .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
setUpMapIfNeeded();
}
protected void onResume() { super.onResume();
if (mLocationClient == null) { mLocationClient = new LocationClient(this, this, this); } mLocationClient.connect(); }
private void setUpMapIfNeeded() { if (mMap == null) { mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); } mMap.setMyLocationEnabled(true); }
public void displayNearby(View v){ new SearchAsyncTask().execute(); }
public static void setMapCenter(LatLng latLng) { CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng) .zoom(17) .build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); }
@Override public void onLocationChanged(Location location) { latLng = new LatLng(location.getLatitude(), location.getLongitude()); setMapCenter(latLng); }
@Override public void onConnected(Bundle arg0) { mLocationClient.requestLocationUpdates(REQUEST, this); }
@Override public void onDisconnected() { // TODO Auto-generated method stub
}
@Override public void onConnectionFailed(ConnectionResult arg0) { // TODO Auto-generated method stub
}
private class SearchAsyncTask extends AsyncTask<Integer, String, Integer> {
public SearchAsyncTask(){ progressDialog = ProgressDialog.show(MainActivity.this, null, "正在获取附近餐馆数据,请稍后...", true); progressDialog.setCancelable(false); }
@Override protected Integer doInBackground(Integer... arg0) { try {
if (latLng != null) { listMaps = GoogleUtil.queryByCondition(API_KEY, latLng, radius, keywords, language, name, types); return STATUS_SUCCESS; }else{ return STATUS_FAILED; } } catch (Exception e) { e.printStackTrace(); return STATUS_NETERROR; } }
@Override protected void onPostExecute(Integer result) { super.onPostExecute(result); if(progressDialog != null) { progressDialog.dismiss(); progressDialog = null; } switch(result){ case STATUS_FAILED: Toast.makeText(getApplicationContext(), "正在确认当前位置,请稍后再试!", Toast.LENGTH_SHORT).show(); break; case STATUS_NETERROR: Toast.makeText(getApplicationContext(), "网络出错,请检查网络!", Toast.LENGTH_SHORT).show(); break; case STATUS_SUCCESS: if (null != listMaps && listMaps.size() > 0) { LatLng latLngTemp = null; for (int i = 0; i < listMaps.size(); i++) { latLngTemp = new LatLng(Double.parseDouble(listMaps.get(i).get("latitude")),Double.parseDouble(listMaps.get(i).get("longitude"))); mMap.addMarker(new MarkerOptions().position(latLngTemp).title(listMaps.get(i).get("name")).snippet(listMaps.get(i).get("address"))); } }else{ Toast.makeText(getApplicationContext(), "抱歉,附近未搜索到餐馆!", Toast.LENGTH_SHORT).show(); } break; } } }
} activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >
<fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" />
<Button android:id="@+id/btn_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:onClick="displayNearby" android:text="显示附近餐馆"/>
</RelativeLayout> |