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

本文实例为大家分享了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.程序运行就可以显示目标效果了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical&q

  • Android SDK 百度地图通过poi城市内检索简介接口的使用

    百度地图 SDK 不仅为广大开发者提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发者提供了多种 LBS 检索的能力.通过这些接口,开发者可以轻松的访问百度的 LBS 数据,丰富自己的移动端地图应用. 目前百度地图 SDK 为开发者提供的检索服务有: POI 检索:可以检索百度 POI 数据信息: 线路规划:利用百度的引擎帮助开发者规划线路: 在线建议检索.短链接分享.地理编码等等.... 本文将以一个很简单的 POI 城市内检索为例,像广大开发者介绍接口的使用. 第一步,选择并下载 SD

  • Android下如何使用百度地图sdk

    可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富.交互性强的LBS(地图类)应用程序. 百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制.您需申请密钥(key)后,才可使用百度地图Android SDK.任何非营利性产品请直接使用.这弦外之音就是盈利的产品必须帮百度给钱. 一.百度地图api平台. 百度地图API网址:http://developer.baidu.com/map/sd

  • 基于Android实现百度地图定位过程详解

    一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示: 三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息--

  • Android百度定位导航之基于百度地图移动获取位置和自动定位

    一.问题描述 使用百度地图实现如图所示应用,首先自动定位当前我起始位置(小圆点位置),并跟随移动不断自动定位我的当前位置 百度Api不同版本使用会有些差异,本例中加入lib如下: 二.编写MyApplication类 public class MyApplication extends Application { static MyApplication myApplication; BMapManager mBMapManager = null; String mStrKey = "7ZfuR

  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二.编写MyApplication类 public class MyApplication extends Application { private static MyApplication mInstance = null; public boolean m_bKeyRight = true; pu

  • Android 调用百度地图API示例

    Android 调用百度地图API 一.到 百度地图开发平台下载SDK http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download 1.点击自定义下载 2.下载自己想要的功能包我这里选了三个 3.获取密钥 获取密钥之前我们要新建一个应用 填写好相关的信息 二. 新建一个项目工程 1. 把下载好的百度sdk中的jar包拷贝到项目的libs目录下 2.在application中添加开发密钥 3.添加所需的权限 <uses-

  • android实现百度地图自定义弹出窗口功能

    我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己的数据来构造这样的弹出窗口,但是,在百度地图最新的Android SDK中,没有方便操作这种弹出窗口的类,虽然有一个PopupOverlay,但是它只支持将弹出内容转化为不多于三个Bitmap,如果这个弹出窗口里想有按钮来响应点击事件,用这个就不能满足要求了,于是,看了一遍百度地图覆盖物的API,我决定用自定义View的方法来实现类似的效果,

  • Android百度地图自定义公交路线导航

    一.问题描述 基于百度地图实现检索指定城市指定公交的交通路线图,效果如图所示 二.通用组件Application类,主要创建并初始化BMapManager public class App extends Application { static App mDemoApp; //百度MapAPI的管理类 public BMapManager mBMapMan = null; // 授权Key // 申请地址:http://dev.baidu.com/wiki/static/imap/key/ p

  • Android 百度地图POI搜索功能实例代码

    在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

随机推荐