主要参考百度API
http://developer.baidu.com/map/index.php?title=android-locsdk
总结为如下几个步骤:
1、申请key
如何申请请见:http://developer.baidu.com/map/index.php?title=android-locsdk/guide/key
2、导入定位所需的当前最新库文件(.so 和 .jar 文件,我在2014年11月17日下载的最新的,有需要的直接点击下载)
将.so文件拷贝到libs/armeabi目录下。
将.jar文件拷贝到工程的libs目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定 jar,确定后返回。
这样您就可以在程序中使用百度定位SDK了。
3、编写代码。
3.1、新建工程 mymap
3.2、在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="WoLfGNLQHozWNQON63E4yxm7" /> 此处替换为你自己在百度网上申请的key值
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
3.4 编写源代码 location_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_loc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="定位" />
<TextView
android:id="@+id/txt_loc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF0000"
>
</TextView>
</LinearLayout>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:clickable="true" />
</LinearLayout>
3.5 编写源码 LocationActivity.java
package com.example.mymap;
import com.baidu.lbsapi.BMapManager;
import com.baidu.lbsapi.MKGeneralListener;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class LocationActivity extends Activity {
private LocationClient mLocationClient;
private BDLocationListener mLocListener = new MyLocationListener();
private MapView mMapView;
private BaiduMap mMap;
private BMapManager mMapManager;
private TextView mTxtLoc;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// /----start---可不加
mMapManager = new BMapManager(getApplicationContext());
mMapManager.init(new MKGeneralListener() {
@Override
public void onGetPermissionState(int ret) {
// TODO Auto-generated method stub
if (ret == 300) {
T.show(LocationActivity.this, "ret : " + ret + ", key验证失败");
mTxtLoc.setText("ret : " + ret + ", key验证失败");
}
}
});
// /-----end-----可不加
init();
}
private void init() {
// TODO Auto-generated method stub
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.location_layout);
mTxtLoc = (TextView) findViewById(R.id.txt_loc);
// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mMap = mMapView.getMap();
mMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 定位
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(mLocListener);
// 设置定位参数
LocationClientOption opt = new LocationClientOption();
opt.setOpenGps(true);
mLocationClient.setLocOption(opt);
mLocationClient.start();
if (mLocationClient != null && mLocationClient.isStarted()) {
L.log("发起定位");
mLocationClient.requestLocation();
} else {
L.log("locClient is null or not started");
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mMapView.onDestroy();
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(mLocListener);
}
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation loc) {
// TODO Auto-generated method stub
if (loc == null) {
return;
}
StringBuffer sb = new StringBuffer(256);
sb.append("time:");
sb.append(loc.getTime());
sb.append("\nerror code:");
sb.append(loc.getLocType());
sb.append("\nlatitude(纬度):");
sb.append(loc.getLatitude());
sb.append("\nlontitude(经度):");
sb.append(loc.getLongitude());
sb.append("\nradius:");
sb.append(loc.getRadius());
if (loc.getLocType() == BDLocation.TypeGpsLocation) {
sb.append("\nspeed:");
sb.append(loc.getSpeed());
sb.append("\nsatellite:");
sb.append(loc.getSatelliteNumber());
} else if (loc.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr:");
sb.append(loc.getAddrStr());
}
//如果是GPS定位,addr为null,只有当网络定位时,addr才有值
T.show(getApplicationContext(), "定位类型:" + loc.getLocType()+ ", 定位addr:" + loc.getAddrStr());
L.log(sb.toString());
mTxtLoc.setText("" + sb.toString());
// 标注覆盖物
LatLng point = new LatLng(loc.getLatitude(), loc.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
OverlayOptions opt = new MarkerOptions().position(point)
.icon(bitmap).zIndex(9).draggable(true);
mMap.addOverlay(opt);
L.log("改变地图状态: 将定位位置显示在当前地图中心");
LatLng center = new LatLng(loc.getLatitude(), loc.getLongitude());
MapStatus mapStatus = new MapStatus.Builder().target(center)
.zoom(18).build();
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mapStatus);
mMap.setMapStatus(mapStatusUpdate);
}
}
public void onClick(View v) {
if (v.getId() == R.id.btn_loc) {
T.show(getApplicationContext(), "正在定位。。。");
mLocationClient.requestLocation();
}
}
}
3.6 附件定位图片:icon_marka.png
4、工程源代码下载请点击 :