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

本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步修改,有兴趣的同学可以研究下怎么修改的

本篇我们准备为地图添加:第一,定位功能;第二,与方向传感器结合,通过旋转手机进行道路的方向确认。有了这两个功能,地图已经可以为我服务了

@一启动就自动定位了

a,MainActivity 中添加定位代码,定位的监听器MyLocationListener

b,封装的方向传感器的类MyOrientationListener

c,记得在AndroidManifest.xml配一个service

本文参考的是http://blog.csdn.net/lmj623565791/article/details/37730469

我刚开始看的时候差点蒙了,因为笔者思路很清晰,可是我不懂啊,最后我总结了下,其实就是改了上面的三个文件,下载他的代码看了,有些还没用到,就放进来了,我整理了好大一会才明白,

还有就是鸿洋大神有好大一个bug,害我浪费一个小时,

import com.baidu.mapapi.map.MyLocationConfigeration;

看者没问题吧,但是报错,开始我以为百度包有问题,是不是我没把百度demo上的包导入正确啊,然后各种查询,网上各种解决。。cannot resovle。。。

最后我发现是MyLocationConfiguration

一个字母一个字母对去吧。。。

好了,不说了,下面给大家附上我的代码。。

有兴趣的话可以compare一下上篇的代码

记住还是真机测试

实现功能有 普通地图,卫星地图,实时交通


布局文件或者素材

下面是我实现的代码

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical" ><com.baidu.mapapi.map.MapView
        android:id="@+id/id_bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><RelativeLayout
        android:id="@+id/id_marker_info"android:visibility="gone"android:layout_width="fill_parent"android:layout_height="220dp"android:layout_alignParentBottom="true"android:background="#CC4e5a6b"android:clickable="true" ><ImageView
            android:layout_width="fill_parent"android:layout_height="150dp"android:layout_marginBottom="10dp"android:layout_marginLeft="12dp"android:layout_marginRight="12dp"android:layout_marginTop="10dp"android:alpha="1.0"android:background="@drawable/map_image_border_white"android:clickable="true"android:scaleType="fitXY"android:src="@drawable/map_iv" /><RelativeLayout
            android:layout_width="fill_parent"android:layout_height="50dp"android:layout_alignParentBottom="true"android:background="@drawable/bg_map_bottom" ><LinearLayout
                android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:orientation="vertical" ><TextView
                    android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="老米家泡馍小炒"android:textColor="#FFF5EB" /><TextView
                    android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="距离200米"android:textColor="#FFF5EB" /></LinearLayout><LinearLayout
                android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="20dp"android:orientation="horizontal" ><ImageView
                    android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="zan"android:src="@drawable/map_zan" /><TextView
                    android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="652"android:textColor="#FFF5EB" /></LinearLayout></RelativeLayout></RelativeLayout></RelativeLayout>

展示视图控制文件:MainActivity

package com.yang.baidumapceshi;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;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.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.yang.baidumapceshi.MyOrientationListener.OnOrientationListener;import java.lang.reflect.Method;public class MainActivity extends Activity
{/*** 地图控件*/private MapView mMapView = null;/*** 地图实例*/private BaiduMap mBaiduMap;/*** 定位的客户端*/private LocationClient mLocationClient;/*** 定位的监听器*/public MyLocationListener mMyLocationListener;/*** 当前定位的模式*/private LocationMode mCurrentMode = LocationMode.NORMAL;/**** 是否是第一次定位*/private volatile boolean isFristLocation = true;/*** 最新一次的经纬度*/private double mCurrentLantitude;private double mCurrentLongitude;/*** 当前的精度*/private float mCurrentAccracy;/*** 方向传感器的监听器*/private MyOrientationListener myOrientationListener;/*** 方向传感器X方向的值*/private int mXDirection;/*** 地图定位的模式*/private String[] mStyles = new String[] { "地图模式【正常】", "地图模式【跟随】","地图模式【罗盘】" };private int mCurrentStyle = 0;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);// 注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);// 第一次定位isFristLocation = true;// 获取地图控件引用mMapView = (MapView) findViewById(R.id.id_bmapView);// 获得地图的实例mBaiduMap = mMapView.getMap();MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);mBaiduMap.setMapStatus(msu);// 初始化定位initMyLocation();// 初始化传感器initOritationListener();}/*** 初始化方向传感器*/private void initOritationListener(){myOrientationListener = new MyOrientationListener(getApplicationContext());myOrientationListener.setOnOrientationListener(new OnOrientationListener(){@Overridepublic void onOrientationChanged(float x){mXDirection = (int) x;// 构造定位数据MyLocationData locData = new MyLocationData.Builder().accuracy(mCurrentAccracy)// 此处设置开发者获取到的方向信息,顺时针0-360.direction(mXDirection).latitude(mCurrentLantitude).longitude(mCurrentLongitude).build();// 设置定位数据mBaiduMap.setMyLocationData(locData);// 设置自定义图标BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);mBaiduMap.setMyLocationConfigeration(config);}});}/*** 初始化定位相关代码*/private void initMyLocation(){// 定位初始化mLocationClient = new LocationClient(this);mMyLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(mMyLocationListener);// 设置定位的相关配置LocationClientOption option = new LocationClientOption();option.setOpenGps(true);// 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);mLocationClient.setLocOption(option);}/*** 实现实位回调监听*/public class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation location){// map view 销毁后不在处理新接收的位置if (location == null || mMapView == null)return;// 构造定位数据MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(mXDirection).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mCurrentAccracy = location.getRadius();// 设置定位数据mBaiduMap.setMyLocationData(locData);mCurrentLantitude = location.getLatitude();mCurrentLongitude = location.getLongitude();// 设置自定义图标BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);mBaiduMap.setMyLocationConfigeration(config);// 第一次定位时,将地图位置移动到当前位置if (isFristLocation){isFristLocation = false;LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);mBaiduMap.animateMapStatus(u);}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return super.onCreateOptionsMenu(menu);}/*** 默认点击menu菜单,菜单项不现实图标,反射强制其显示*/@Overridepublic boolean onMenuOpened(int featureId, Menu menu){if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null){if (menu.getClass().getSimpleName().equals("MenuBuilder")){try{Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e){}}}return super.onMenuOpened(featureId, menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item){switch (item.getItemId()){case R.id.id_menu_map_common:// 普通地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.id_menu_map_site:// 卫星地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.id_menu_map_traffic:// 开启交通图if (mBaiduMap.isTrafficEnabled()){item.setTitle("开启实时交通");mBaiduMap.setTrafficEnabled(false);} else{item.setTitle("关闭实时交通");mBaiduMap.setTrafficEnabled(true);}break;case R.id.id_menu_map_myLoc:center2myLoc();break;case R.id.id_menu_map_style:mCurrentStyle = (++mCurrentStyle) % mStyles.length;item.setTitle(mStyles[mCurrentStyle]);// 设置自定义图标switch (mCurrentStyle){case 0:mCurrentMode = LocationMode.NORMAL;break;case 1:mCurrentMode = LocationMode.FOLLOWING;break;case 2:mCurrentMode = LocationMode.COMPASS;break;}BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);mBaiduMap.setMyLocationConfigeration(config);break;}return super.onOptionsItemSelected(item);}/*** 地图移动到我的位置,此处可以重新发定位请求,然后定位;* 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好*/private void center2myLoc(){LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);mBaiduMap.animateMapStatus(u);}@Overrideprotected void onStart(){// 开启图层定位mBaiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted()){mLocationClient.start();}// 开启方向传感器myOrientationListener.start();super.onStart();}@Overrideprotected void onStop(){// 关闭图层定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();// 关闭方向传感器myOrientationListener.stop();super.onStop();}@Overrideprotected void onDestroy(){super.onDestroy();// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();mMapView = null;}@Overrideprotected void onResume(){super.onResume();// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause(){super.onPause();// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}}

写个MyOrientationListener

package com.yang.baidumapceshi;/*** Created by yang_zzheng on 2016/7/18* yangzhizheng2012@163.com*/
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 Context context;private SensorManager sensorManager;private Sensor sensor;private float lastX ;private OnOrientationListener onOrientationListener ;public MyOrientationListener(Context context){this.context = context;}// 开始public void start(){// 获得传感器管理器sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);if (sensorManager != null){// 获得方向传感器sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}// 注册if (sensor != null){//SensorManager.SENSOR_DELAY_UIsensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_UI);}}// 停止检测public void stop(){sensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy){}@Overridepublic 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 ){onOrientationListener.onOrientationChanged(x);}
//            Log.e("DATA_X", x+"");lastX = x ;}}public void setOnOrientationListener(OnOrientationListener onOrientationListener){this.onOrientationListener = onOrientationListener ;}public interface OnOrientationListener{void onOrientationChanged(float x);}}

AndroidManifest.xml配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.yang.baidumapceshi"><!-- 添加屏幕及版本支持 --><supports-screens android:largeScreens="true"android:normalScreens="true"android:smallScreens="true"android:resizeable="true"android:anyDensity="true"/><uses-sdk android:minSdkVersion="7" /><!-- 在sdcard中创建/删除文件的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 挂载和反挂载的权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><!-- 读取手机状态 ,如来了新电话--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 震动权限 --><uses-permission android:name="android.permission.VIBRATE" /><!-- 网络访问权限 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.INTERNET" /><!-- 百度地图定位功能所需权限 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><permission android:name="android.permission.BAIDU_LOCATION_SERVICE" /><uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_GPS"/><uses-permission android:name="android.permission.READ_LOGS" /><application
        android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><meta-data
            android:name="com.baidu.lbsapi.API_KEY"android:value="HOuUcEQSKXNv5gMLSK2ZSy0hK5dhMh59" /><!-- 百度定位服务    android:permission="android.permission.BAIDU_LOCATION_SERVICE">--><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><activity
            android:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

main.xml配置

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/id_menu_map_common"android:icon="@mipmap/ic_launcher"app:showAsAction="never"android:title="普通地图"/><itemandroid:id="@+id/id_menu_map_site"android:icon="@mipmap/ic_launcher"app:showAsAction="never"android:title="卫星地图"/><itemandroid:id="@+id/id_menu_map_traffic"android:icon="@mipmap/ic_launcher"app:showAsAction="never"android:title="开启实时交通"/><itemandroid:id="@+id/id_menu_map_myLoc"android:icon="@mipmap/ic_launcher"app:showAsAction="never"android:title="我的位置"/><itemandroid:id="@+id/id_menu_map_style"android:icon="@mipmap/ic_launcher"app:showAsAction="never"android:title="地图模式【正常】"/></menu>

map_image_border_white.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" ><stroke
        android:width="2dp"android:color="#AAffffff" /><padding
        android:bottom="2dp"android:left="2dp"android:right="2dp"android:top="2dp" /></shape>

我这个人比较实在,你照着copy很快就能实现,但是之间关系怎么来的,为什么这么写?

参考大神的吧:http://blog.csdn.net/lmj623565791/article/details/37730469

喜欢的就给赞吧,不喜欢的勿喷,有的地方copy多了,哈哈,我写是照着学习,勿怪。

代码下载

本文中的代码已经在文中全部出现过了,为什么还需要一个下载币呢,是因为我的下载币不够用了额,下载其他大神的代码,需要,所以请赞助一下吧。当然你不想赞助的话,你可以在文章中一个一个的copy,绝对的一模一样,绝对的开源,赞助一个下载币吧
http://download.csdn.net/detail/xyzz609/9579815

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

  1. 百度地图开发(七)方向传感器指向方向--指南针

    效果图: 用到的小图,自行下载: 原理就是利用方向传感判断机头方向传值给定位: 方向传感代码: import android.content.Context; import android.hardw ...

  2. android百度地图与正北方向夹角,指南针对准正北方向是多少角度

    满意答案 hbshlbd 2012.12.10 采纳率:58%    等级:12 已帮助:2889人 1.利用太阳 冬季日出位置是东偏南,日落位置是西偏南:夏季日出位置是东偏北,日落位置是西偏北:春分 ...

  3. android 百度地图h5,【分享】H5 地理信息定位+百度地图

    [JavaScript] 纯文本查看 复制代码 //创建和初始化地图函数: function initMap(longitude,latitude){ createMap(longitude,lati ...

  4. Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍

    ***转载.引用请标明出处*** http://www.jianshu.com/p/29ccac3e1e42 本文出自[zhh_happig的简书博客](http://www.jianshu.com/ ...

  5. android百度地图标方向,Android百度地图之方向感应和模式更改

    本文实例为大家分享了Android百度地图之方向感应和模式更改,供大家参考,具体内容如下 目标效果: 菜单中设置几种模式,点击可查看不同的地图形式,这里随便截几张图. 1.首先要去百度地图网站 htt ...

  6. Android 百度地图开发(二)

    前面我们一起了解了百度地图的申请与集成Android 百度地图开发(一),今天我们接着来学习百度地图. 今天主要来了解如下问题: 1.百度地图的生命周期控制 上一篇张我们已经在布局文件里增加了mapV ...

  7. Android百度地图开发(二)定位之自动定位及标注(及定位几日内瓦或坐标4.9E-324问题)

    接上篇Android百度地图开发(一)之Hello BaiduMap 1.环境配置: 新增权限如下 <!-- 这个权限用于进行网络定位--> <uses-permission and ...

  8. android地图入门,android 百度地图入门01 (史上最详没有之一)

    最近一直和百度地图打交道,写几篇博客记录一下吧,目前最新版是4.0的 ,之前我用的是3.7的, 就以4.0的为例说一下最基本的配置流程吧. 一.准备工作 1.申请一个百度地图开发者账户--地址:htt ...

  9. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

最新文章

  1. PyTorch迁移学习
  2. 推荐:一本“高颜值”的R语言数据可视化图书(包邮送3本)
  3. 判断男人成熟度16个新标准。
  4. mysql 学习笔记03 常用数据类型
  5. 关联分析算法(一)——Apriori(先验算法)
  6. window10 物理网卡无法启用
  7. web.xml 详细介绍
  8. 通过实现ServletContextListener接口创建数据库连接池(C3P0方式)
  9. shell应用之简单计算器
  10. python解释器怎么添加_Python解释器安装与环境变量添加
  11. ABeam Insight | 女性科技系列(1):女性科技(FemTech)简述
  12. excel不显示0_Excel教程:数值为0不显示的三种解决方法
  13. 刘强东的大格局:京东要抢食亿万级货运出行市场!
  14. 华为梁华:鸿蒙系统不是谈判策略 是针对IoT的操作系统
  15. JavaScript定义注册页面
  16. day07面向对象复习+课后练习
  17. rocket基础知识
  18. 古文觀止卷九_永州韋使君新堂記_柳宗元
  19. JAVA热部署神器,JRebel破解版,JRebel免费实用插件
  20. SVG绘制圆环进度条

热门文章

  1. BuildR Procedural Building Generator使用教程-建筑建模
  2. umount: /mnt/raid:目标忙。
  3. springboot致远汽车租赁系统
  4. 山东大学计算机组成与设计实验一基本逻辑门逻辑实验
  5. 12个很棒的学习 jQuery 的网站推荐
  6. python 字符串中正则出手机号
  7. 如何在SQL Server中附加Pubs数据库
  8. 阿里云国际站:互联网云巨头增速放缓 SaaS生态决胜未来?
  9. 【日常记录】泰阿单兵武器库的下载与安装
  10. 航空插头网线转接2.0排针线序图