这是 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 更多
请帮忙