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

google play  services

然后导入

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

\adt-bundle-windows-x86\sdk\extras\google\google_play_services\libproject\google-play-services_lib

 AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.v2_test"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <permission
android:name="com.example.v2_test.permission.MAPS_RECEIVE"
android:protectionLevel="signature" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.example.v2_test.permission.MAPS_RECEIVE" /> <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-permission android:name="android.permission.ACCESS_MOCK_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="com.example.v2_test.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="AIzaSyDmrnUUl_zWzgimKKeR5t3ZiinvouSWO8E" />
</application> </manifest>
 布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
<ImageButton
android:id="@+id/local"
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
/> </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/    这里有您而精彩

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

Google Maps API v2密钥申请以及实现地图定位导航的更多相关文章

  1. Google Maps API v2密钥申请

    1. 进入到Google APIs Console页面 https://code.google.com/apis/console/ 点击左边导航栏的Seivices进入 在All services 的 ...

  2. Google Map API V2密钥申请

    之前用的都是v1,用的是MapView,好吧,仅仅能认命了.废话不再多说,開始android 的Google Maps Android API v2吧 之前參考了http://www.cnblogs. ...

  3. Google Maps API v2 Demo Tutorial

    申请API KEY https://code.google.com/apis/console/?noredirect 1. 创建项目,名称随意,只是为了区分 2. 开启Google Maps Andr ...

  4. Google Maps API V2

    1. 在AndroidManifest.xml的application节点中,添加Google play service的版本号: <meta-data android:name="c ...

  5. Google Maps API Web Services

    原文:Google Maps API Web Services 摘自:https://developers.google.com/maps/documentation/webservices/ Goo ...

  6. Google Maps API Key申请办法(最新)

    之前的Google Maps Api的API Key很容易申请,只需要按照一个简单的表单提交部署的网站地址即可,自动生成API Key并给出引用的路径. 但是最近在处理另外一个项目的时候发现之前的这种 ...

  7. google maps api申请的问题

    现在已经改由统一的GOOGLE API控制台进行所有GOOGLE API的管理了. 方法是使用Google帐号登入 https://code.google.com/apis/console. 然后在所 ...

  8. Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解

    在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...

  9. Google maps API开发(一)(转)

    一.加载Google maps API <script type="text/javascript" src="http://ditu.google.com/map ...

随机推荐

  1. c++入门笔记

    对于有java基础的人来说,学习c++并不难,毕竟c++是java的前身. 何况还熟练掌握了java呢,哈哈. 安装gcc环境,照着菜鸟教程来. 开发工具ide使用vs,eclipse虽然用习惯了,这 ...

  2. mysql树形结构递归查询

    之前一直用的是Oracle,对于树形查询可以使用start with ... connect by ' connect by id = prior parent_id; 没错,这是Oracle所支持的 ...

  3. Javascript 中的神器

    Promise in js 回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力.而 Promise 很好地解决了这一切. 2015 年 6 月,ECMAScript ...

  4. 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)

    4332: JSOI2012 分零食 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66 Description 这里是欢乐 ...

  5. WC2018伪题解

    NOIP分数过低的场外选手,一个月之后才有幸膜到这套卷子.感觉题目质量很不错啊,可惜了T1乱搞可过,T2题目出锅非集训队员没有通知到,导致风评大幅被害. 感觉Cu的话随手写两个暴力就稳了,Ag的话T3 ...

  6. [ZHOJ1131]Find K Min

    题目大意: 给你一个数列,求其中第K大的数. 思路: 类似于快速排序的思想,每次可以确定出当前的的x在数组中的位置. 然后根据位置选择该往左找还是往右找. #pragma GCC optimize(3 ...

  7. nginx部署ssl证书

    确保nginx有ssl模块,修改nginx.conf文件 在server中添加 listen 443 ssl; #crt文件路径 证书的公钥 ssl_certificate xxx.crt; #key ...

  8. js异步处理工作机制(setTimeout, setInterval)

    经常谈到异步,但是发现自己一直没深入理解setTimeout, setInterval,逛论坛的时候发现了这篇好文章,分享一下. ————————————————————以下为原文—————————— ...

  9. java开发_数字转换汉语中人民币的大写_完整版

    做这个应用,源于突然的一个想法:看到发票上面的数字要转换成汉语中人民币的大写 于是就有了下面的这些事儿..... 先看看运行效果: ================================== ...

  10. svn 服务器搭建及使用 三

    SVN服务器搭建和使用(三) 接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文 ...