• 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/    这里有您而精彩

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

     

     

  • 相关阅读:
    vue代码调试
    在vscode中无法使用yarn
    js滚动条计算公式
    chrome插件制作-高级篇
    网站js注入实现自动输入账号密码
    String、StringBuffer和StringBuilder有什么区别?
    待重写
    http协议
    待重写
    java内存加载机制
  • 原文地址:https://www.cnblogs.com/wangmars/p/3275068.html
Copyright © 2020-2023  润新知