Google Maps API v2密钥申请以及实现地图定位导航

注意新建项目之前需要安装

google play  services

 

 

 

然后导入

 

通过上图方法导入sdk包下面的一个包:

adt-bundle-windows-x86sdkextrasgooglegoogle_play_serviceslibprojectgoogle-play-services_lib

 

 

 

 1 AndroidManifest.xml
 2 
 3 <?xml version="1.0" encoding="utf-8"?>
 4 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 5     package="com.example.v2_test"
 6     android:versionCode="1"
 7     android:versionName="1.0" >
 8 
 9     <uses-sdk
10         android:minSdkVersion="8"
11         android:targetSdkVersion="17" />
12 
13     <permission
14         android:name="com.example.v2_test.permission.MAPS_RECEIVE"
15         android:protectionLevel="signature" />
16     
17 <uses-permission android:name="android.permission.INTERNET" />
18     <uses-permission android:name="com.example.v2_test.permission.MAPS_RECEIVE" />
19     
20     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
21     <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
22     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
23     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
24     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
25     
26     
27 
28 
29     <uses-feature
30         android:glEsVersion="0x00020000"
31         android:required="true" />
32 
33     <application
34         android:allowBackup="true"
35         android:icon="@drawable/ic_launcher"
36         android:label="@string/app_name"
37         android:theme="@style/AppTheme" >
38         <activity
39             android:name="com.example.v2_test.MainActivity"
40             android:label="@string/app_name" >
41             <intent-filter>
42                 <action android:name="android.intent.action.MAIN" />
43 
44                 <category android:name="android.intent.category.LAUNCHER" />
45             </intent-filter>
46         </activity>
47 
48         <meta-data
49             android:name="com.google.android.maps.v2.API_KEY"
50             android:value="AIzaSyDmrnUUl_zWzgimKKeR5t3ZiinvouSWO8E" />
51     </application>
52 
53 </manifest>
 1 布局文件
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:map="http://schemas.android.com/apk/res-auto" 
 4      android:layout_width="match_parent"
 5         android:layout_height="match_parent"
 6     >
 7 
 8     <fragment
 9         android:id="@+id/map"
10         android:layout_width="match_parent"
11         android:layout_height="match_parent"
12         class="com.google.android.gms.maps.SupportMapFragment" />
13     <ImageButton
14          android:id="@+id/local"
15          android:background="@null"
16          android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_marginTop="10dp"
19         android:layout_alignParentRight="true"
20         android:layout_marginRight="10dp"
21         />
22 
23 </RelativeLayout>
菜单弹出框布局文件


<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="起始位置:" 
        android:textColor="@android:color/white"
        android:textSize="18dp">
    </TextView>

    <EditText
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp"
        android:text="我的位置"
        >
    </EditText>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="18dp"
        android:text="目的地:" >
    </TextView>

    <EditText
        android:id="@+id/end"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp"
        android:text="" >
    </EditText>

</TableLayout>

以上是核心配置文件与布局文件,下面是Activity中的实现代码,具体的请参考google 的官方demo

package com.example.v2_test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

import android.app.AlertDialog;
import android.app.ProgressDialog;

import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;

import android.graphics.Color;

import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;

public class MainActivity extends FragmentActivity {

    List<LatLng> list;
    Polyline polyline;
    private Location location;
    private CameraPosition cameraPosition;
    private GoogleMap map;
    String start = "";
    String end = "";
    double lat = 0.0;
    double lng = 0.0;
    double endlat = 0.0;
    double endlng = 0.0;
    LocationManager locationManager;
    ImageButton local;
    LocationListener llistener;
    Marker  marker;
    
    private ProgressDialog progressdialog;

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            switch (msg.what) {
                                    
            case 1:
                
                progressdialog.dismiss();
                
                if(polyline!=null){
                polyline.remove();
                map.clear();
                markMysition();
                }        
                
                
                map.addMarker(new MarkerOptions().position(
                        new LatLng(endlat, endlng)).title(
                        MainActivity.this.getLocation(endlat, endlng)));
                
                
                
                LatLng last = null;
                
                for (int i = 0; i < list.size() - 1; i++) {
                    LatLng src = list.get(i);
                    LatLng dest = list.get(i + 1);
                    last = dest;
                    polyline = map.addPolyline(new PolylineOptions()
                            .add(new LatLng(src.latitude, src.longitude),
                                    new LatLng(dest.latitude, dest.longitude))
                            .width(4).color(Color.GREEN));
                }

                break;

            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        local = (ImageButton) findViewById(R.id.local);
        local.setImageResource(R.drawable.ww);

        // 点击按钮视图回到我的位置
        local.setOnClickListener(new android.view.View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.this.setCameraPosition();

            }

        });
        map = ((SupportMapFragment) (this.getSupportFragmentManager()
                .findFragmentById(R.id.map))).getMap();

        this.getPointLocation();

        MainActivity.this.setCameraPosition();
    }

    // 标记我的位置
    void markMysition() {
          marker=map.addMarker(new MarkerOptions().position(new LatLng(lat, lng)).title(
                this.getLocation(lat, lng)).snippet("我的位置"));
    
    }

    // 获取我的位置
    private void getPointLocation() {

        Criteria criteria = new Criteria();
        // ACCURACY_FINE 较高精确度
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        String provider = locationManager.getBestProvider(criteria, true);

        Log.d("provider", provider);
        llistener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                /*if(marker!=null){            
                    marker.remove();
                }
*/                lat = location.getLatitude();
                lng = location.getLongitude();
            //    MainActivity.this.markMysition();
                
            }

            @Override
            public void onProviderDisabled(String provider) {
                Log.i("onProviderDisabled", "come in");
            }

            @Override
            public void onProviderEnabled(String provider) {
                Log.i("onProviderEnabled", "come in");
            }

            @Override
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }
        };
        
        location = locationManager
                .getLastKnownLocation(locationManager.GPS_PROVIDER);

        
        
        locationManager.requestLocationUpdates(provider, 3000, (float) 10.0,
                llistener);
        
        updateLocation();

        MainActivity.this.markMysition();

        MainActivity.this.setCameraPosition();
        
        
        
    }

    // 位置更新
    private void updateLocation() {
        if (location != null) {
            lat = location.getLatitude();
            lng = location.getLongitude();
        }
    }

    // 将视图镜头定位在我的位置
    public void setCameraPosition() {
        // 获取视图镜头
        cameraPosition = new CameraPosition.Builder()
                .target(new LatLng(lat, lng)) // Sets the center of the map to
                .zoom(17) // 缩放比例
                .bearing(0) // Sets the orientation of the camera to east
                .tilt(20) // Sets the tilt of the camera to 30 degrees
                .build(); // Creates a CameraPosition from the builder
        map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }

    // 菜单
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, Menu.FIRST + 1, 1, "获取路线");
        menu.add(0, Menu.FIRST + 2, 2, "退出");
        return true;
    }

    // 菜单响应
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case Menu.FIRST + 1:
            // 定义输入框界面
            editpoint();
            break;
        case Menu.FIRST + 2:
            locationManager.removeUpdates(llistener);
            this.finish();

        }
        return true;
    }

    // 获取物理位置
    private String getLocation(double lat, double lng) {
        String address = "";
        String resultString = "";
        String urlString = String
                .format("http://maps.google.com/maps/api/geocode/json?latlng="
                        + lat + "," + lng + "&sensor=true&language=zh-CN");
        Log.i("URL", urlString);
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(urlString);

        try {
            HttpResponse response = client.execute(get);
            HttpEntity entity = response.getEntity();
            BufferedReader buffReader = new BufferedReader(
                    new InputStreamReader(entity.getContent()));
            StringBuffer strBuff = new StringBuffer();
            String result = null;
            while ((result = buffReader.readLine()) != null) {
                strBuff.append(result);
            }
            resultString = strBuff.toString();

            // 解析josn数据,获得物理地址
            if (resultString != null && resultString.length() > 0) {
                JSONObject jsonobject = new JSONObject(resultString);
                JSONArray jsonArray = new JSONArray(jsonobject.get("results")
                        .toString());
                resultString = "";

                for (int i = 0; i < jsonArray.length(); i++) {
                    resultString = jsonArray.getJSONObject(i).getString(
                            "formatted_address");
                    address += resultString;
                }
            }
        } catch (Exception e) {
        } finally {
            get.abort();
            client = null;
        }
        return address;
    }

    // 通过输入信息解析json获取路线
    private void getDirection(String start, String endposition) {

        String DresultString = "";

        String Durl = "http://maps.google.com/maps/api/directions/json?origin="
                + lat + "," + lng + "&destination=" + endlat + "," + endlng
                + "&sensor=true&mode=driving";
        HttpClient Dclient = new DefaultHttpClient();
        HttpGet Dget = new HttpGet(Durl);

        HttpResponse response;

        try {
            response = Dclient.execute(Dget);
            HttpEntity Dentity = response.getEntity();
            BufferedReader DbuffReader = new BufferedReader(
                    new InputStreamReader(Dentity.getContent()));
            StringBuffer DstrBuff = new StringBuffer();
            String Dresult = null;
            while ((Dresult = DbuffReader.readLine()) != null) {
                DstrBuff.append(Dresult);
            }
            DresultString = DstrBuff.toString();
            

        } catch (Exception e) {

        }
        try {
            final JSONObject jsonObject = new JSONObject(DresultString);
            JSONArray routeArray = jsonObject.getJSONArray("routes");
            JSONObject routes = routeArray.getJSONObject(0);
            JSONObject overviewPolylines = routes
                    .getJSONObject("overview_polyline");
            String encodedString = overviewPolylines.getString("points");
            Log.d("test: ", encodedString);
            
            list = decodePoly(encodedString);

            

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("Caught ArrayIndexOutOfBoundsException: "
                    + e.getMessage());
        }
    }

    // 填写起始地点以得到路线导航
    private void editpoint() {
        LayoutInflater factory = LayoutInflater.from(MainActivity.this);
        // 获得自定义对话框
        final View view = factory.inflate(R.layout.getdirections, null);
        AlertDialog navigate = new AlertDialog.Builder(MainActivity.this)
                .setIcon(android.R.drawable.ic_menu_edit).setTitle("获取路线")
                .setView(view).setPositiveButton("确定", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        
                        dialog.dismiss();
                        
                        
                        
                        EditText st = (EditText) view.findViewById(R.id.start);
                        EditText en = (EditText) view.findViewById(R.id.end);
                        
                        
                        
                        start = st.getText().toString();
                        end = en.getText().toString();
                        
                        
                        
                        
                        progressdialog = ProgressDialog.show(MainActivity.this,
                                "正在获取路线", "请稍等……", true);

                        

                        new Thread(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                
                                getlatlng(end);
                                getDirection("我的位置", end);
                                mHandler.sendEmptyMessage(0);
                                mHandler.sendEmptyMessage(1);
                            }
                        }).start();

                    }
                }).setNegativeButton("取消", null).create();
        navigate.show();

    }

    // 根据地理名称获得起始点和终点的经纬度
    private void getlatlng(String end) {

        StringBuilder stringBuilder = new StringBuilder();
        try {

            HttpPost httppost = new HttpPost(
                    "http://maps.google.com/maps/api/geocode/json?address="
                            + end + "&sensor=false");
            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            stringBuilder = new StringBuilder();

            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();

            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {

            endlng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lng");

            endlat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
                    .getJSONObject("geometry").getJSONObject("location")
                    .getDouble("lat");

        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    // 解析json文件里面的polyline下的poly得出导航上面路径的点
    private List<LatLng> decodePoly(String encoded) {
        List<LatLng> poly = new ArrayList<LatLng>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;

        while (index < len) {
            int b, shift = 0, result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 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) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            LatLng p = new LatLng((lat / 1E5), lng / 1E5);
            poly.add(p);
        }
        return poly;
    }

}

欢迎访问:http://www.cnblogs.com/wangmars/    这里有您而精彩

此文来自百度文库.....

 

 

原文地址:https://www.cnblogs.com/wangmars/p/3275068.html