Android百度地图定位

说到百度地图,现在这个时候应该都是众说周知了吧,多的话不扯了,直接奔向主题。

接入百度地图api必须申请key,这里申请key就不用说了,官方文档上面有介绍如何去申请key。

这里使用的百度地图定位是4.2的版本,api是3.1.1版本。如果申请好了key,那么就可以进入编码阶段了,具体实现如下:

1.引入百度地图相关jar包及armeabi目录到libs目录中

2.在项目的AndroidManifest.xml文件中配置相关信息

配置权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
	<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.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.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.READ_LOGS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

在application标签中声明Service标签,每个app拥有独立的service

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

设置百度密钥

    <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="yMSCtrtXNOKOZnyXtVXaMA7O" />

3.配置布局文件

<?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" >
    <com.baidu.mapapi.map.MapView
        android:id="@+id/mv_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
</LinearLayout>

4.代码具体实现

package com.example.map.activity;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
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.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{
	private LocationClient locationClient;//定位客户端
	private MyLocationListener locationListener=new MyLocationListener();
	private MapView mvMap;//百度地图控件
	private BaiduMap baiduMap;//地图对象控制器
	private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//必须在setContentView前
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.main_activity);
		initMap();//初始化
	}

	/**
	 * 初始化地图
	 */
	private void initMap(){
		//获取地图控件
		mvMap=(MapView) findViewById(R.id.mv_map);
		//获取地图对象控制器
		baiduMap=mvMap.getMap();
		baiduMap.setBuildingsEnabled(true);//设置显示楼体
		baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));//设置地图状态

		//创建定位客户端
		locationClient=new LocationClient(getApplicationContext());
		//注册监听器
		locationClient.registerLocationListener(locationListener);

		//实例化客户端定位参数
		LocationClientOption options=new LocationClientOption();
		options.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
		options.setCoorType("gcj02");//返回定位结果
		options.setScanSpan(6000);//设置定位扫描间隔时间
		options.setIsNeedAddress(true);//设置定位结果中是否含地址信息,默认无
		options.setNeedDeviceDirect(true);//设置网络定位时,需要设备方向
		locationClient.setLocOption(options);//设置定位参数
		locationClient.start();//开始定位

	}

	/**
	 * 实现百度定位监听器
	 * @author Arvin_Li
	 *
	 */
	public class MyLocationListener implements BDLocationListener{
		@Override
		public void onReceiveLocation(BDLocation location) {
			if (location == null) return ;
			//创建地理坐标点对象
			LatLng point=new LatLng(location.getLatitude(), location.getLongitude());
			//将国测局坐标转为百度坐标
			point=gcjTobaidu(point);
			//开启定位图层
			baiduMap.setMyLocationEnabled(true);
			//构造定位数据
			MyLocationData locData=new MyLocationData.Builder()
			.accuracy(location.getRadius())//设置位置的精度信息
			.direction(location.getDirection())//设置获取到的方向信息,顺时针0-360
			.latitude(point.latitude)//设置定位数据的纬度
			.longitude(point.longitude)//设置定位数据的经度
			.build();//构建生成定位数据对象
			//设置定位数据
			baiduMap.setMyLocationData(locData);
			//构建定位图标
			constructionLocationIcon(point);
		}
	}

	/**
	 * 构建定位图标
	 * @param point 图标位置
	 */
	private void constructionLocationIcon(LatLng point){
		//创建Marker图标
		BitmapDescriptor descriptor=BitmapDescriptorFactory.fromResource(R.drawable.xk);
		//构建MarkerOption,用于在地图上添加Marker
		OverlayOptions options=new MarkerOptions()
		.icon(descriptor)//设置图标
		.position(point)//设置图标位置
		.draggable(true)//允许拖拽
		.zIndex(5);//设置图标层次
		//清空地图所有的 Overlay 覆盖物以及 InfoWindow
		baiduMap.clear();
		//在地图上添加图标
		baiduMap.addOverlay(options);
		//设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效
		baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING, true, descriptor));
		//关闭定位图层
		baiduMap.setMyLocationEnabled(false);
	}

	@Override
	protected void onPause() {
		super.onPause();
		mvMap.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
		mvMap.onResume();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(null!=locationClient&&locationClient.isStarted()){
			locationClient.stop();//停止定位
		}
		locationClient=null;
		mvMap.onDestroy();//销毁地图
	}

	/**
	 * 国测局转换百度经纬度
	 * @param point
	 * @return
	 */
	public static LatLng gcjTobaidu(LatLng point) {
		// double x = gg_lon, y = gg_lat;
		double x = point.longitude, y = point.latitude;
		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
		double bd_lon = z * Math.cos(theta) + 0.0065;
		double bd_lat = z * Math.sin(theta) + 0.006;
		LatLng point1 = new LatLng(bd_lat,bd_lon);
		return point1;
	}
}

返回定位参数有三个值:

1.gcj02 返回国测局经纬度坐标系

2.bd09返回百度墨卡托坐标系

3.bd09ll 返回百度经纬度坐标

默认是gcj02

设置定位模式有三种:

1.Battery_Saving 低功耗模式

2.Device_Sensors 仅设备GPS模式

3.Hight_Accuracy 高精度模式

option.setLocationMode(LocationMode.Hight_Accuracy)

设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效

其中的定位图层显示方式有3中:

1.COMPASS  罗盘态,显示定位方向圈,保持定位图标在地图中心

2.NORMAL 普通态: 更新定位数据时不对地图做任何操作

3.FOLLOWING 跟随态,保持定位图标在地图中心

baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING, true, descriptor));

到这里定位的功能就算是结束了。

时间: 2024-11-12 11:27:29

Android百度地图定位的相关文章

Android 百度地图定位(手动+自动) 安卓开发教程

近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究和咨询,找到了解决方案,在此备忘一下. 注意:定位使用真机才能够真正定位:模拟器的话,在DDMS中的Emulator Control中,选择Manual,下面单选按钮选择Decimal,然后填写经纬度,send后,再点击定位我的位置按钮,就能定位了(这应该算是固定定位,哈哈...). 1.第一步当然

Android百度地图定位demo

AS写的百度地图定位demo 版本V6.0.5 先上效果图     版权声明:本文为博主原创文章,未经博主允许不得转载.

android 百度地图定位开发1

首先注册成为百度开发者 然后进入百度开发者中心 点击LBS 跳到下一个页面 点击Android 开发 里面的基础地图 进入  点击获取密钥 进入   点击创建应用 进入     应用名称自己填 应用类型 选Android SDK   包名为项目包名  SHA1点击查看详细配置方法 进入可以自己看 这里直接讲方法 第一种方法: 第1步:运行进入控制台 第2步:定位到.android文件夹下,输入cd .android 第3步:输入keytool -list -v -keystore debug.k

android 百度地图定位开发2

先下载了示例代码 进行配置(可查看开发 指南 Hello BaiDuMap) 第一步:创建并配置工程(具体方法参见工程配置部分的介绍): 第二步:在AndroidManifest中添加开发密钥.所需权限等信息: (1)在application中添加开发密钥 <application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> &l

android 百度地图 定位功能

废话不多说 直接新建一个新android项目:location,然后花一分钟申请一个key,然后就是把百度定位demo抄一下就行 1:首先在AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="andr

android百度地图定位开发

一.activity import android.app.Activity; import android.graphics.Point;import android.graphics.PointF;import android.os.Bundle;import android.os.Message;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu

Android百度地图定位定到了海里,定到了非洲

百度定位偶尔会出现定到非洲的现象,一开始我以为是GPS信号不太好的原因,后来出现的次数有点多了,上网查找才发现是权限不够的原因 官网地址http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/create-project/android-studio 注意这个权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 除了

Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图添加:第一,定位功能:第二,与方向传感器结合,通过旋转手机进行道路的方向确认.有了这两个功能,地图已经可以为我服务了~~~~ 效果图: 好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中. 1.初次启动定位 [java] view plaincopy /** * 定位的客户端 */ private LocationClient mLocationClient; /** * 定位的监听器 */ public MyLoca

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定