Android-百度地图之方向感应和模式更改

目标效果:

   

菜单中设置几种模式,点击可查看不同的地图形式,这里随便截几张图。

1.首先要去百度地图网站 http://lbsyun.baidu.com/

2.注册账号后,点击开发->Android地图SDK->获取密钥,进入后显示如下页面。

3.创建应用

4.打开eclipse,选择Window->Preferences->Android->Build,获取SHA1

5.提交后回到上一个Android地图SDK页面选择相关下载,再点击自定义下载

6.选择定位功能,基础地图,检索功能,LBS云检索,计算工具后点击开发包,示例代码和类参考根据自己的实际情况进行下载

7.下载完成后解压如图

8.开始创建应用,注意创建时包名

9.创建好后,把刚才下载的libs目录下所有内容复制到项目libs文件夹中。

10.开始编写代码。activity_main.xml页面放入一个map控件。

activity_main.xml页面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

	<com.baidu.mapapi.map.MapView
    android:id="@+id/mv_map"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
</RelativeLayout>

11.main.xml作为菜单页面,增加几个模式选择。

main.xml页面:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/id_map_common"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="普通地图"/>
    <item
        android:id="@+id/id_map_site"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="卫星地图"/>
    <item
        android:id="@+id/id_map_traffic"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="实时交通(off)"/>
    <item
        android:id="@+id/id_map_location"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="我的位置"/>
    <item
        android:id="@+id/id_map_mode_common"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="普通模式"/>
    <item
        android:id="@+id/id_map_mode_following"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="跟随模式"/>
    <item
        android:id="@+id/id_map_mode_compass"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="罗盘模式"/>

</menu>

12.创建MyOrientationListener.java页面用于在方向改变时进行获取。

MyOrientationListener.java页面:

package com.imooc.baidumap;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class MyOrientationListener implements SensorEventListener {

	private SensorManager mSensorManager;
	private Context context;
	private Sensor mSensor;// 传感器

	private float lastX;

	public MyOrientationListener(Context context) {
		this.context = context;
	}

	// 开启监听
	@SuppressWarnings("deprecation")
	public void start() {
		//获得系统服务
		mSensorManager=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
		if(mSensorManager!=null){
			//获得方向传感器
			mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
		}
		if(mSensor!=null){
			mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_UI);//第三个参数为经度
		}
	}

	// 结束监听
	public void stop() {
		//停止定位
		mSensorManager.unregisterListener(this);
	}

	// 经度发生改变时
	@Override
	public void onAccuracyChanged(Sensor arg0, int arg1) {

	}

	// 纬度发生改变时
	@Override
	public void onSensorChanged(SensorEvent event) {
		//如果事件返回的类型是方向传感器
		if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
			float x=event.values[SensorManager.DATA_X];
			//如果变化大于一度
			if(Math.abs(x-lastX)>1.0){
				//通知主界面进行回掉
				if(mOnOrientationListener!=null){
					mOnOrientationListener.onOrientationChanged(x);
				}
			}
			lastX=x;
		}
	}

	private OnOrientationListener mOnOrientationListener;

	public void setmOnOrientationListener(
			OnOrientationListener mOnOrientationListener) {
		this.mOnOrientationListener = mOnOrientationListener;
	}

	//回掉接口
	public interface OnOrientationListener{
		void onOrientationChanged(float x);
	}
}

13.主页面MainActivity.java页面进行模式更改以及定位等。

MainActivity.java页面:

package com.imooc.baidumap;

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.MyLocationConfiguration;
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.model.LatLng;
import com.imooc.baidumap.MyOrientationListener.OnOrientationListener;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;

public class MainActivity extends Activity {

	private MapView mv_map;
	private BaiduMap baiduMap;

	// 定位相关
	private LocationClient mLocationClient;
	private MyLocationListener mLocationListener;
	private boolean isFirstIn = true;
	private double mLatitude; // 记录最新经纬度
	private double mLongtitude;

	// 自定义定位图标
	private BitmapDescriptor mIconLocation;
	private MyOrientationListener mOrientationListener;
	private float mCurrentX;

	// 模式变量
	private com.baidu.mapapi.map.MyLocationConfiguration.LocationMode mLocationMode;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
		// 注意该方法要再setContentView方法之前实现
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.activity_main);

		// 初始化控件
		init();

		// 初始化定位
		initLocation();
	}

	// 初始化控件
	private void init() {
		mv_map = (MapView) findViewById(R.id.mv_map);
		baiduMap = mv_map.getMap();
		MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);// 设置地图放大比例
		baiduMap.setMapStatus(msu);
	}

	@Override
	protected void onStart() {
		super.onStart();
		baiduMap.setMyLocationEnabled(true);
		if (!mLocationClient.isStarted()) {
			// 开启定位
			mLocationClient.start();
			// 开启方向传感器
			mOrientationListener.start();
		}
	}

	@Override
	protected void onStop() {
		super.onStop();
		baiduMap.setMyLocationEnabled(false);
		// 停止定位
		mLocationClient.stop();
		// 停止方向传感器
		mOrientationListener.stop();
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
		mv_map.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
		mv_map.onPause();

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
		mv_map.onDestroy();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	// 点击菜单进行切换地图
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.id_map_common: // 普通地图
			baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
			break;

		case R.id.id_map_site: // 卫星地图
			baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
			break;

		case R.id.id_map_traffic: // 实时交通
			if (baiduMap.isTrafficEnabled()) {
				baiduMap.setTrafficEnabled(false);
				item.setTitle("实时交通(off)");
			} else {
				baiduMap.setTrafficEnabled(true);
				item.setTitle("实时交通(on)");
			}
			break;
		case R.id.id_map_location:
			centerToMyLocat();
			break;
		case R.id.id_map_mode_common:
			mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL;
			break;
		case R.id.id_map_mode_following:
			mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING;
			break;
		case R.id.id_map_mode_compass:
			mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.COMPASS;
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	// 定位到我的位置
	private void centerToMyLocat() {
		LatLng latLng = new LatLng(mLatitude, mLongtitude);
		MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
		baiduMap.animateMapStatus(msu);
	}

	private class MyLocationListener implements BDLocationListener {
		@Override
		public void onReceiveLocation(BDLocation location) {
			MyLocationData data = new MyLocationData.Builder()//
					.direction(mCurrentX)//
					.accuracy(location.getRadius())//
					.latitude(location.getLatitude())//
					.longitude(location.getLongitude())//
					.build();
			baiduMap.setMyLocationData(data);

			// 更新位置
			mLatitude = location.getLatitude();
			mLongtitude = location.getLongitude();
			// 判断是否第一次进入
			if (isFirstIn) {
				LatLng latLng = new LatLng(location.getLatitude(),
						location.getLongitude());
				MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
				baiduMap.animateMapStatus(msu);

				isFirstIn = false;
			}
			// 设置自定义图标
			MyLocationConfiguration config = new MyLocationConfiguration(
					mLocationMode, true, mIconLocation);
			baiduMap.setMyLocationConfigeration(config);
		}
	}

	// 初始化定位
	private void initLocation() {
		mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL; // 默认模式
		mLocationClient = new LocationClient(this);
		mLocationListener = new MyLocationListener();
		mLocationClient.registerLocationListener(mLocationListener);

		LocationClientOption option = new LocationClientOption();
		option.setCoorType("bd0911");
		option.setIsNeedAddress(true);
		option.setOpenGps(true);
		option.setScanSpan(1000);// 每个多少秒进行一次请求

		mLocationClient.setLocOption(option);
		// 初始化图标
		mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.arrow);

		mOrientationListener = new MyOrientationListener(this);

		mOrientationListener
				.setmOnOrientationListener(new OnOrientationListener() {

					@Override
					public void onOrientationChanged(float x) {
						mCurrentX = x;
					}
				});
	}

}

14.Androidmanifest.xml页面配置权限及添加AppKey。

Androidmanifest.xml页面:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.imooc.baidumap"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="3KjZS5ym9TXSm98V7bVjwZTZwAoajsgp" /><!-- 创建应用的AppKey -->

        <activity
            android:name="com.imooc.baidumap.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>
        <service
                android:name="com.baidu.location.f"
                android:enabled="true"
                android:process=":remote" >
            <intent-filter>
				<action
				    android:name="com.baidu.location.service_v2.2">
				</action>
            </intent-filter>
        </service>
    </application>

</manifest>

15.程序运行就可以显示目标效果了。

时间: 2024-10-11 02:06:15

Android-百度地图之方向感应和模式更改的相关文章

Android百度地图结合方向传感器我们自己定位哪里走

Android百度地图结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步修改,有兴趣的同学可以研究下怎么修改的 本篇我们准备为地图添加:第一,定位功能:第二,与方向传感器结合,通过旋转手机进行道路的方向确认.有了这两个功能,地图已经可以为我服务了 @一启动就自动定位了 a,MainActivity 中添加定位代码,定位的监听器MyLocationListener b,封装的方向传感器

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

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

Android百度地图(二)结合方向传感器我们自己定位哪里走

Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步改动.有兴趣的同学能够研究下怎么改动的 本篇我们准备为地图加入:第一.定位功能:第二.与方向传感器结合.通过旋转手机进行道路的方向确认. 有了这两个功能.地图已经能够为我服务了 @一启动就自己主动定位了 a,MainActivity 中加入定位代码,定位的监听器MyLocationListener b.封装

Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易,且用且珍惜. 对于官方开发指南对于离线地图的教程,提供了两种方案: 第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内.好吧,我表示不能接受,无视了. 第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详

Android百度地图API集成二《定位》

书接上回 ↑ 基础地图请查看Android百度地图API集成一<基础地图>: 地址http://www.cnblogs.com/dhr125/p/5969980.html 1.在Application标签中声明SERVICE组件 <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> <

Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易.且用且珍惜. 对于官方开发指南对于离线地图的教程,提供了两种方案: 第一.手动导入,先将从官网下载的离线包解压,把vmp目录拷入SD卡根目录下的BaiduMapSDK目录内. 好吧,我表示不能接受,无视了. 第二,接口下载方法例如以下:mOffline.start(cityid);还比較靠谱,就是

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

android 百度地图开发实例(转载)

因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点android 百度地图开发常用的方法. 1初始化 MapManager mBMapMan = new BMapManager(this);boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener()); isSuccess 的值

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报 登录   注册 www.open-open.com/libOPEN经验 投稿 全部经验分类  Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类  >  开发语言与工具  >  移动开发