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

作者:Vivinia_Vivinia 时间:2021-10-08 20:38:39 

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

来源:https://blog.csdn.net/hester_hester/article/details/51994148

标签:Android百度地图,方向感应
0
投稿

猜你喜欢

  • Android中AlertDialog 点击按钮后不关闭对话框的功能

    2023-08-04 22:55:50
  • Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能

    2023-01-29 05:01:41
  • Java基础知识之ByteArrayInputStream流的使用

    2023-10-27 14:37:53
  • Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    2021-12-04 00:04:43
  • Android Wear计时器开发

    2023-04-10 01:22:21
  • Android图像处理之霓虹滤镜效果

    2023-08-11 14:37:41
  • Spring Boot利用Docker快速部署项目的完整步骤

    2022-03-08 18:52:55
  • Opencv基于CamShift算法实现目标跟踪

    2023-02-15 15:39:56
  • Android7.0行为变更之适配File Provider的方法

    2021-09-24 08:02:38
  • Android中监听未接来电的2种方法

    2023-11-02 10:44:48
  • C#调用存储过程详解(带返回值、参数输入输出等)

    2023-12-06 01:06:35
  • 详解Java的Spring框架中的事务管理方式

    2022-02-03 13:57:47
  • java操作elasticsearch的案例解析

    2021-06-27 19:17:13
  • Java线程休眠的5种方法

    2022-02-21 04:49:48
  • Logback动态修改日志级别的方法

    2023-05-30 21:47:01
  • UnityShader使用速度映射图实现运动模糊

    2021-11-23 03:53:21
  • MyBatis Example And与Or混合使用的实例

    2021-11-11 01:53:13
  • C#结束进程及子进程

    2021-06-22 15:18:10
  • java byte数组与int,long,short,byte的转换实现方法

    2023-09-08 12:26:43
  • java实现读取、删除文件夹下的文件

    2021-12-06 20:07:48
  • asp之家 软件编程 m.aspxhome.com