欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-10-22 16:56:34
本文实例为大家分享了android百度地图之方向感应和模式更改,供大家参考,具体内容如下 目标效果: 菜单中设置几种模式,点击可查看不同的地图形式,这里随便截几张图...

本文实例为大家分享了android百度地图之方向感应和模式更改,供大家参考,具体内容如下

目标效果:

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

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

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

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

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

3.创建应用

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

4.打开eclipse,选择window->preferences->android->build,获取sha1

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

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

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

7.下载完成后解压如图

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

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

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

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.程序运行就可以显示目标效果了。

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