这是 MainActivity 类
导入 java.io.BufferedReader; 导入 java.io.IOException; 导入 java.io.InputStream; 导入 java.io.InputStreamReader; 导入 java.net.HttpURLConnection; 导入 java.net.URL; 导入 java.util.ArrayList; 导入 java.util.HashMap; 导入 java.util.List; 导入 org.json.JSONObject; 导入android.graphics.Color; 导入android.os.AsyncTask; 导入android.os.Bundle; 导入android.support.v4.app.FragmentActivity; 导入android.util.Log; 导入 android.view.Menu; 导入android.view.View; 导入 android.view.View.OnClickListener; 导入android.widget.Button; 导入 com.google.android.gms.maps.GoogleMap; 导入 com.google.android.gms.maps.GoogleMap.OnMapClickListener; 导入 com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; 导入 com.google.android.gms.maps.SupportMapFragment; 导入 com.google.android.gms.maps.model.BitmapDescriptorFactory; 导入 com.google.android.gms.maps.model.LatLng; 导入 com.google.android.gms.maps.model.MarkerOptions; 导入 com.google.android.gms.maps.model.PolylineOptions; 公共类 MainActivity 扩展 FragmentActivity { 谷歌地图; ArrayList 标记点; @覆盖 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 的引用 按钮 btnDraw = (Button)findViewById(R.id.btn_draw); // 获取 SupportMapFragment 的地图 地图 = fm.getMap(); // 在地图中启用 MyLocation 按钮 map.setMyLocationEnabled(true); // 为地图设置 onclick 事件监听器 map.setOnMapClickListener(new OnMapClickListener() { @覆盖 公共无效 onMapClick(LatLng 点){ // 已经有 10 个位置,有 8 个航路点和 1 个起始位置和 1 个结束位置。 // 非业务用户的查询中最多允许 8 个航点 if(markerPoints.size()>=10){ 返回; } // 将新项目添加到 ArrayList markerPoints.add(point); // 创建 MarkerOptions MarkerOptions 选项 = new MarkerOptions(); // 设置标记的位置 选项.位置(点); /** * 对于起始位置,标记的颜色为绿色,并且 * 对于结束位置,标记的颜色为红色,并且 * 其余标记的颜色为天蓝色 */ if(markerPoints.size()==1){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); }否则如果(markerPoints.size()==2){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); }别的{ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); } // 向 Google Map Android API V2 添加新标记 map.addMarker(选项); } }); // 长按会清空地图 map.setOnMapLongClickListener(新 OnMapLongClickListener() { @覆盖 公共无效 onMapLongClick(LatLng 点){ // 从谷歌地图中删除所有点 map.clear(); // 删除 ArrayList 中的所有点 markerPoints.clear(); } }); // 按钮 btn_draw 的单击事件处理程序 btnDraw.setOnClickListener(new OnClickListener() { @覆盖 公共无效 onClick(查看 v){ // 检查是否捕获了开始和结束位置 if(markerPoints.size() >= 2){ LatLng 原点 = markerPoints.get(0); LatLng dest = markerPoints.get(1); // 获取 Google Directions API 的 URL 字符串 url = getDirectionsUrl(origin, dest); 下载任务 downloadTask = new DownloadTask(); // 开始从 Google Directions API 下载 json 数据 下载任务.execute(url); } } }); } 私人字符串 getDirectionsUrl(LatLng 来源,LatLng dest){ // 路由的起源 字符串 str_origin = "origin="+origin.latitude+","+origin.longitude; // 路由目的地 字符串 str_dest = "destination="+dest.latitude+","+dest.longitude; // 传感器启用 字符串传感器=“传感器=假”; // 航点 字符串航点 = ""; for(int i=2;i{ // 在非ui线程中下载数据 @覆盖 受保护的字符串doInBackground(字符串... url){ // 用于存储来自 Web 服务的数据 字符串数据 = ""; 尝试{ // 从 Web 服务获取数据 数据 = downloadUrl(url[0]); }catch(异常 e){ Log.d("后台任务",e.toString()); } 返回数据; } // 在 UI 线程中执行,在执行之后 // doInBackground() @覆盖 受保护的无效onPostExecute(字符串结果){ super.onPostExecute(结果); ParserTask parserTask = new ParserTask(); // 调用解析JSON数据的线程 parserTask.execute(结果); } } /** 以 JSON 格式解析 Google Places 的类 */ 私有类 ParserTask 扩展 AsyncTask>> >{ // 在非ui线程中解析数据 @覆盖 受保护的列表>> doInBackground(字符串... jsonData){ JSONObject jObject; 列表>>路线=空; 尝试{ jObject = new JSONObject(jsonData[0]); DirectionsJSONParser 解析器 = new DirectionsJSONParser(); // 开始解析数据 路线 = parser.parse(jObject); }catch(异常 e){ e.printStackTrace(); } 回程路线; } // 在解析过程之后在 UI 线程中执行 @覆盖 受保护的无效onPostExecute(列表>>结果){ ArrayList 点 = 空; 折线选项 lineOptions = null; //遍历所有路由 for(int i=0;i(); lineOptions = new PolylineOptions(); // 获取第 i 个路由 列表> 路径 = 结果.get(i); // 获取第 i 条路线中的所有点 for(int j=0;j 点 = path.get(j); 双纬度 = Double.parseDouble(point.get("lat")); 双 lng = Double.parseDouble(point.get("lng")); LatLng 位置 = 新 LatLng(lat, lng); 点。添加(位置); } // 将路线中的所有点添加到 LineOptions lineOptions.addAll(点); lineOptions.width(2); lineOptions.color(Color.RED); } // 在谷歌地图中为第 i 条路线绘制折线 map.addPolyline(lineOptions); } } @覆盖 公共布尔 onCreateOptionsMenu(菜单菜单){ // 膨胀菜单;如果存在,这会将项目添加到操作栏。 getMenuInflater().inflate(R.menu.main, menu); 返回真; } }
方向解析器类是这样的
包在.wptrafficanalyzer.locationwaypointmapv2; 导入 java.util.ArrayList; 导入 java.util.HashMap; 导入 java.util.List; 导入 org.json.JSONArray; 导入 org.json.JSONException; 导入 org.json.JSONObject; 导入 com.google.android.gms.maps.model.LatLng; 公共类DirectionsJSONParser { /** 接收一个 JSONObject 并返回一个包含经纬度的列表 */ 公共列表>>解析(JSONObject jObject){ 列表>> 路线 = 新的 ArrayList>>(); JSONArray jRoutes = null; JSONArray jLegs = null; JSONArray jSteps = null; 尝试 { jRoutes = jObject.getJSONArray("路由"); /** 遍历所有路由 */ for(int i=0;i>(); /** 遍历所有腿 */ for(int j=0;j list = decodePoly(折线); /** 遍历所有点 */ 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); } } 路线。添加(路径); } } } 捕捉(JSONException e){ e.printStackTrace(); }catch (异常 e){ } 回程路线; } /** * 解码折线点的方法 * 礼貌:jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java * */ 私有列表decodePoly(字符串编码){ 列表 poly = new ArrayList(); int index = 0, len = encoded.length(); 国际纬度 = 0, lng = 0; 而(索引= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 纬度 += 纬度; 班次 = 0; 结果 = 0; 做 { b = 编码.charAt(index++) - 63; 结果 |= (b & 0x1f) = 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; LatLng p = new LatLng((((双) lat / 1E5)), (((双)液化天然气/1E5))); poly.add(p); } 返回聚; } }
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): 关闭 VM 03-02 21:35:25.758: W/dalvikvm(25733): threadid=1: 线程以未捕获的异常退出 (group=0x40ddd2a0) 03-02 21:35:25.768:E/AndroidRuntime(25733):致命异常:主要 03-02 21:35:25.768:E/AndroidRuntime(25733):java.lang.RuntimeException:无法启动活动 ComponentInfo{in.wptrafficanalyzer.locationwaypointmapv2/in.wptrafficanalyzer.locationwaypointmapv2.MainActivity}:android.view.InflateException:二进制XML 文件第 16 行:膨胀类片段时出错 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread.access$700(ActivityThread.java:140) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.os.Looper.loop(Looper.java:137) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread.main(ActivityThread.java:4935) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 java.lang.reflect.Method.invoke(Method.java:511) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 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):原因:android.view.InflateException:二进制 XML 文件第 16 行:膨胀类片段时出错 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:495) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:353) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.Activity.setContentView(Activity.java:1924) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 in.wptrafficanalyzer.locationwaypointmapv2.MainActivity.onCreate(MainActivity.java:43) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.Activity.performCreate(Activity.java:5206) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 03-02 21:35:25.768: E/AndroidRuntime(25733): ... 11 更多 03-02 21:35:25.768: E/AndroidRuntime(25733): Caused by: java.lang.IllegalStateException: 您应用的 AndroidManifest.xml 中的元数据标签没有正确的值。预期为 4242000,但发现为 0。您必须在元素中具有以下声明: 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.common.GooglePlayServicesUtil.n(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(未知来源) 03-02 21:35:25.768:E/AndroidRuntime(25733):在 com.google.android.gms.maps.internal.qv(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.maps.internal.qu(未知来源) 03-02 21:35:25.768:E/AndroidRuntime(25733):在 com.google.android.gms.maps.MapsInitializer.initialize(未知来源) 03-02 21:35:25.768:E/AndroidRuntime(25733):在 com.google.android.gms.maps.SupportMapFragment$b.ex(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.maps.SupportMapFragment$ba(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.dynamic.aa(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.google.android.gms.dynamic.a.onInflate(未知来源) 03-02 21:35:25.768:E/AndroidRuntime(25733):在 com.google.android.gms.maps.SupportMapFragment.onInflate(未知来源) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:279) 03-02 21:35:25.768: E/AndroidRuntime(25733): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:682) 03-02 21:35:25.768: E/AndroidRuntime(25733): ... 21 更多
请帮忙