百度
1:首先,到百度地图API网址去注册;百度地图API,获取Appkey的过程。
进入控制台cmd:
定位到.android:
输入命令获取SHA1:
上图所用的是debug.keystore签名文件,一般开发测试过程中则用该文件,密钥库口令是android。如果我们想要使用自己的签名文件,看下图。
2:下载你所需要的开发包,并在AndroidManifest.xml文件中添加必要的代码,如下图:
根据自己需求下载不同的.jar包和.so包
添加到lib下面,我这里以定位包为例:
AndroidManifest.xml文件:
3:代码编写,我直接把代码贴上来。
BaseApplication 中进行初始化,这个一定要添加,非常重要,否则地图出不来。
public class BaseApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(getApplicationContext());
}
@Override
public void onTerminate() {
super.onTerminate();
}
}
定位类:
import android.os.Bundle;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.model.LatLng;
import com.function.BaseActivity;
import com.function.R;
public class BaiduLocationActivity extends BaseActivity{
private MapView mapView;
private BaiduMap baiduMap;
private BaiduLocationListener mListener = new BaiduLocationListener();
private LocationClient locClient;
private LocationClientOption locClientOpt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.baidu_location_activity);
mapView = (MapView)findViewById(R.id.baidu_map);
init();
}
private void init(){
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);
baiduMap.setMapStatus(msu);
BitmapDescriptor bitmapDesc = BitmapDescriptorFactory.fromResource(R.drawable.location_marker);
baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(LocationMode.NORMAL, true, bitmapDesc));
locClient = new LocationClient(this);
locClient.registerLocationListener(mListener);
locClientOpt = new LocationClientOption();
locClientOpt.setOpenGps(true);// 打开gps
locClientOpt.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
locClientOpt.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
// locClientOpt.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
// locClientOpt.setNeedDeviceDirect(false);//可选,设置是否需要设备方向结果
// locClientOpt.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
// locClientOpt.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
// locClientOpt.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
locClient.setLocOption(locClientOpt);
locClient.start();
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mapView = null;
super.onDestroy();
}
private class BaiduLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
baiduMap.setMyLocationData(locData);
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(u);
}
}
}
运行结果:
高德
1:同样是到高德的地图API进行注册、获取AppKey,高德地图API
获取key的方法是一样的,高德这里可以同时使用debug和发布情况下的两个SHA1,如下图:
2:下载.jar包和.so包,并添加到lib下:
3:AndroidManifest.xml文件:
4:代码编写:
import android.graphics.Color;
import android.os.Bundle;
import android.view.Window;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.MyLocationStyle;
import com.function.BaseActivity;
import com.function.R;
import com.function.utils.Log4Lsy;
public class AmapLocationActivity extends BaseActivity implements AMapLocationListener,LocationSource{
private AMap aMap;
private MapView mapView;
private OnLocationChangedListener mListener;
private AMapLocationClient mlocationClient;
private AMapLocationClientOption mLocationOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.amap_location_activity);
mapView = (MapView) findViewById(R.id.amap_map);
mapView.onCreate(savedInstanceState);// 此方法必须重写
init();
}
private void init(){
if (aMap == null) {
aMap = mapView.getMap();
setMapProperty();
}
}
private void setMapProperty(){
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.location_marker));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.moveCamera(CameraUpdateFactory.zoomTo(13));//设置地图缩放级别
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
deactivate();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
/**
* 定位成功后回调函数
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null&&amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
Log4Lsy.e("AmapErr",errText);
}
}
}
/**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
}
运行结果:
腾讯
1:同样是到地图API网址去注册并获取AppKey的过程,跟上面都一样,腾讯地图API
2:下载.jar包和.so包:
3:AndroidManifest.xml文件:
4:代码编写:
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.view.Window;
import com.function.BaseActivity;
import com.function.R;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;
import com.tencent.tencentmap.mapsdk.maps.LocationSource;
import com.tencent.tencentmap.mapsdk.maps.MapView;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import com.tencent.tencentmap.mapsdk.maps.model.CircleOptions;
public class TencentLocationActivity extends BaseActivity implements LocationSource,TencentLocationListener{
private TencentLocationRequest locationRequest;
private TencentLocationManager locationManager;
private MapView mapView;
private TencentMap tencentMap;
private OnLocationChangedListener mChangedListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.tencent_location_activity);
mapView = (MapView)findViewById(R.id.tencent_map);
init();
}
private void init(){
tencentMap = mapView.getMap();
CircleOptions circleOption = new CircleOptions();
circleOption.strokeColor(Color.BLACK);
circleOption.strokeWidth(1.0f);
circleOption.fillColor(Color.argb(100, 0, 0, 180));
circleOption.radius(5);
tencentMap.addCircle(circleOption);
locationRequest = TencentLocationRequest.create();
locationRequest.setInterval(1000);
locationRequest.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_NAME);
locationRequest.setAllowCache(true);
locationManager = TencentLocationManager.getInstance(this);
tencentMap.setLocationSource(this);
tencentMap.setMyLocationEnabled(true);
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(locationRequest, this);
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView = null;
locationManager = null;
}
@Override
public void activate(OnLocationChangedListener arg0) {
mChangedListener = arg0;
int err = locationManager.requestLocationUpdates(locationRequest, this);
switch (err){
case 1:
setTitle("设备缺少使用腾讯定位服务需要的基本条件");
break;
case 2:
setTitle("manifest 中配置的 key 不正确");
break;
case 3:
setTitle("自动加载libtencentloc.so失败");
break;
}
}
@Override
public void deactivate() {
//结束定位
locationManager.removeUpdates(this);
mChangedListener = null;
locationRequest = null;
locationManager = null;
}
@Override
public void onLocationChanged(TencentLocation arg0, int arg1, String arg2) {
if (arg1 == TencentLocation.ERROR_OK && mChangedListener != null) {
Location location = new Location(arg0.getProvider());
location.setLatitude(arg0.getLatitude());
location.setLongitude(arg0.getLongitude());
location.setAccuracy(arg0.getAccuracy());
mChangedListener.onLocationChanged(location);
}
}
@Override
public void onStatusUpdate(String arg0, int arg1, String arg2) {
}
}
三种地图的使用方法大致相同,多仔细认真看一下参考手册和官方提供的Demo,就应该很容易开发出你想要的功能了。