3

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

请帮忙

4

2 回答 2

4

问题在这里:

<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyC6TVk6gtR_i_.......**************"/> 

meta-data标记在这里需要一个integer,因此您必须在此处包含com.google.android.maps您正在使用的库的版本。您可能会在项目中包含的库中找到它,然后只需定义:

<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
   android:value="@integer/your_google_maps_version" />
于 2014-03-02T16:52:08.977 回答
0
<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyC6TVk6gtR_i_.......**************"/> 

在 manifest.xml 中,只需在 application> 标记之后和您的第一个活动之前添加它

于 2017-03-07T10:16:04.023 回答