这里是MainActivity类。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import org.json.JSONObject;
import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;
import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions;
public class MainActivity extends FragmentActivity {
GoogleMap map; ArrayList<LatLng> markerPoints;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// 初始化 markerPoints = new ArrayList<>();
// 获取 activity_main 中 SupportMapFragment 的引用 SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
// 获取 Button 的引用 Button btnDraw = (Button)findViewById(R.id.btn_draw);
// 获取 SupportMapFragment 的 Map map = fm.getMap();
// 在地图上启用“我的位置”按钮 map.setMyLocationEnabled(true);
// 为地图设置单击事件监听器 map.setOnMapClickListener(new OnMapClickListener() {
@Override public void onMapClick(LatLng point) {
// 当已经有10个点时,不再添加 if(markerPoints.size()>=10){ return; }
// 添加新的点到 ArrayList 中 markerPoints.add(point);
// 创建 MarkerOptions MarkerOptions options = new MarkerOptions();
// 设置标记的位置 options.position(point);
/** * 对于起点,标记为绿色, * 对于终点,标记为红色, * 对于其他点,标记为天蓝色 */ if(markerPoints.size()==1){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); }else if(markerPoints.size()==2){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); }else{ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); }
// 将新的标记添加到 Google Map Android API V2 上 map.addMarker(options);
} });
// 地图上长按将清除所有点 map.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override public void onMapLongClick(LatLng point) { // 清除地图上所有点 map.clear();
// 清除 ArrayList 中所有点 markerPoints.clear();
} });
// 为 Button btn_draw 设置单击事件监听器 btnDraw.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) { // 检查是否已经捕捉到起点和终点 if(markerPoints.size() >= 2){ LatLng origin = markerPoints.get(0); LatLng dest = markerPoints.get(1);
// 获取到 Google Directions API 的 URL String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask = new DownloadTask();
// 开始从 Google Directions API 下载 JSON 数据 downloadTask.execute(url); }
} });
}
private String getDirectionsUrl(LatLng origin,LatLng dest){
// 起点 String str_origin = "origin="+origin.latitude+","+origin.longitude;
// 终点 String str_dest = "destination="+dest.latitude+","+dest.longitude;
// 是否启用传感器 String sensor = "sensor=false";
// 途经点 String waypoints = ""; for(int i=2;i{
// 在非 UI 线程中下载数据 @Override protected String doInBackground(String... url) {
// 用于存放来自 Web 服务的数据 String data = "";
try{ // 从 Web 服务获取数据 data = downloadUrl(url[
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import org.json.JSONObject;
import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;
import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions;
public class MainActivity extends FragmentActivity {
GoogleMap map; ArrayList<LatLng> markerPoints;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// 初始化 markerPoints = new ArrayList<>();
// 获取 activity_main 中 SupportMapFragment 的引用 SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
// 获取 Button 的引用 Button btnDraw = (Button)findViewById(R.id.btn_draw);
// 获取 SupportMapFragment 的 Map map = fm.getMap();
// 在地图上启用“我的位置”按钮 map.setMyLocationEnabled(true);
// 为地图设置单击事件监听器 map.setOnMapClickListener(new OnMapClickListener() {
@Override public void onMapClick(LatLng point) {
// 当已经有10个点时,不再添加 if(markerPoints.size()>=10){ return; }
// 添加新的点到 ArrayList 中 markerPoints.add(point);
// 创建 MarkerOptions MarkerOptions options = new MarkerOptions();
// 设置标记的位置 options.position(point);
/** * 对于起点,标记为绿色, * 对于终点,标记为红色, * 对于其他点,标记为天蓝色 */ if(markerPoints.size()==1){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); }else if(markerPoints.size()==2){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); }else{ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); }
// 将新的标记添加到 Google Map Android API V2 上 map.addMarker(options);
} });
// 地图上长按将清除所有点 map.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override public void onMapLongClick(LatLng point) { // 清除地图上所有点 map.clear();
// 清除 ArrayList 中所有点 markerPoints.clear();
} });
// 为 Button btn_draw 设置单击事件监听器 btnDraw.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) { // 检查是否已经捕捉到起点和终点 if(markerPoints.size() >= 2){ LatLng origin = markerPoints.get(0); LatLng dest = markerPoints.get(1);
// 获取到 Google Directions API 的 URL String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask = new DownloadTask();
// 开始从 Google Directions API 下载 JSON 数据 downloadTask.execute(url); }
} });
}
private String getDirectionsUrl(LatLng origin,LatLng dest){
// 起点 String str_origin = "origin="+origin.latitude+","+origin.longitude;
// 终点 String str_dest = "destination="+dest.latitude+","+dest.longitude;
// 是否启用传感器 String sensor = "sensor=false";
// 途经点 String waypoints = ""; for(int i=2;i{
// 在非 UI 线程中下载数据 @Override protected String doInBackground(String... url) {
// 用于存放来自 Web 服务的数据 String data = "";
try{ // 从 Web 服务获取数据 data = downloadUrl(url[
Direction Parser类如下所示
package in.wptrafficanalyzer.locationwaypointmapv2;
import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;
import com.google.android.gms.maps.model.LatLng; public class DirectionsJSONParser {
/** 接收一个JSONObject并返回包含纬度和经度的列表的列表 */ public List>> parse(JSONObject jObject){
List>> routes = new ArrayList>>(); JSONArray jRoutes = null; JSONArray jLegs = null; JSONArray jSteps = null;
try {
jRoutes = jObject.getJSONArray("routes");
/** 遍历所有路线 */ for(int i=0;i>();
/** 遍历所有腿 */ for(int j=0;j list = decodePoly(polyline);
/** 遍历所有点 */ for(int l=0;l hm = new HashMap(); hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) ); hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) ); path.add(hm); } } routes.add(path); } }
} catch (JSONException e) { e.printStackTrace(); }catch (Exception e){ }
return routes; }
/** * 用于解码折线点的方法 * 参考:jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java * */ private List decodePoly(String encoded) {
List poly = new ArrayList(); int index = 0, len = encoded.length(); int lat = 0, lng = 0;
while (index = 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat;
shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) = 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng;
LatLng p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5))); poly.add(p); }
return poly; } }
Android Manifest.xml是:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<permission
android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET"/>
<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" >
<activity
android:name="in.wptrafficanalyzer.locationwaypointmapv2.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyC6TVk6gtR_i_.......**************"/>
</application>
布局文件activity_main.xml如下:
<Button
android:id="@+id/btn_draw"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/str_btn_draw"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
<fragment
android:id="@+id/map"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_above="@id/btn_draw" />
我的 LogCat 文件是
03-02 21:35:25.157: D/dalvikvm(25733): 启用CheckJNI 03-02 21:35:25.758: D/AndroidRuntime(25733): 关闭虚拟机 03-02 21:35:25.758: W/dalvikvm(25733): 线程id=1: 线程退出时出现未捕获的异常 (group=0x40ddd2a0) 03-02 21:35:25.768: E/AndroidRuntime(25733): 致命错误: 无法启动活动ComponentInfo{in.wptrafficanalyzer.locationwaypointmapv2/in.wptrafficanalyzer.locationwaypointmapv2.MainActivity}: android.view.InflateException: 二进制XML文件第16行: 膨胀类片段错误 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.access$700(ActivityThread.java:140) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.os.Handler.dispatchMessage(Handler.java:99) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.os.Looper.loop(Looper.java:137) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.main(ActivityThread.java:4935) 03-02 21:35:25.768: E/AndroidRuntime(25733): at java.lang.reflect.Method.invokeNative(Native Method) 03-02 21:35:25.768: E/AndroidRuntime(25733): at java.lang.reflect.Method.invoke(Method.java:511) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 03-02 21:35:25.768: E/AndroidRuntime(25733): at dalvik.system.NativeStart.main(Native Method) 03-02 21:35:25.768: E/AndroidRuntime(25733): Caused by: android.view.InflateException: 二进制XML文件第16行: 膨胀类片段错误 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.Activity.setContentView(Activity.java:1924) 03-02 21:35:25.768: E/AndroidRuntime(25733): at in.wptrafficanalyzer.locationwaypointmapv2.MainActivity.onCreate(MainActivity.java:43) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.Activity.performCreate(Activity.java:5206) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app请帮忙