前言

我是一个在普通大学上学的孩子,主攻AR方向。我最近要通过unity3d来完成我的科研立项---AR指南针,当我开始这个项目时,我在想怎么做,首先在unity3d中调用AR摄像头不难,难就难在怎么获取到当前的经纬度,最好是能实现百度地图的功能,不要多的可以获取经纬度就行,所以我想到的百度地图的官方API,但是一个又一个的困难阻挡着我,因为百度地图api只提供Android,IOS和JavaScript的接口并没有跟Unity3d有任何联系,但是不能放弃啊,我又想到unity 3d可以跟Android开发融合在一起,于是我又从头开始学习Android开发,在学Android开发的这段日子里头发越来越少,我只要能够调用百度地图的定位功能就行!于是写下了这篇博客,希望能帮助大家!

一、准备工作

1、在eclipse中配置Android的环境,这个就先不说了,之后可能会写博客教大家怎么配置。

2、当我们配置好环境,用手机连一下真机,来试试自己的第一个app—helloAndroid。(记住这个开心的时候,后面掉头发的时候想一想)

3、去百度地图开放平台来注册账号,申请密钥,创建应用,如下图:

 4、反正就是按照百度地图API上来,其他的就自己百度,不是我懒,这是一个学习的过程,所以不要怕麻烦

二、编写代码

(补充)我是照着慕课网上调用百度地图的课程来的,我现在把核心的代码贴出来,你如果也是的话,你会发现照着他打,一定成功不了,所以去下载我的源码,绝逼管用!

代码工程的目录:请注意我的版本号一定要一样!

libs目录:

注意(一定要将jar文件,导入(即build path 一下))接下来开始编写代码!

首先先将地图显示出来,MainActivity.java文件的代码,注意复制时包名(用自己的包名)

package com.test.app02;import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;import android.app.Activity;
import android.os.Bundle;public class MainActivity extends Activity {private MapView mMapView ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext//注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.id_bmapView);}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  mMapView.onResume();  }
@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  mMapView.onPause();  }
@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  mMapView.onDestroy();  }
}

然后就是activity.xml布局文件 ,这个文件就像是一个容器一样,你的各种标签比如button,text,title必须在这个文件定义,根据你的命名,才能在MainActivity.java文件中去调用。

<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="${relativePackage}.${activityClass}" >
<com.baidu.mapapi.map.MapView  android:id="@+id/id_bmapView"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:clickable="true" />
</RelativeLayout>

注意这个是我的文件,你粘贴过去后要看看,你的id是不是和我一样叫id_bmapView,不然会报错。

接下来就是AndroidManifest.xml,注意<meta-data>里面的密钥值,用你自己申请的,上面<uses-permisson>这是给你的应用添加的权

限,注意要写在application标签外面。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.app02"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="28" /><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" /><applicationandroid: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="fudZW3z1ZYibdb9dP83L6DE3QPacUBY3" />  <activityandroid:name=".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></application>
</manifest>

三、成功运行

最后连上手机,打开开发者模式,然后在 eclipse中运行,会自动安装,一定要将手机联网,gps打开,如果报错,说明可能操作有问题,多试试几次。

到这里最最简单的调用百度地图就到处结束!

接下来就是,真正硬货了,实现百度地图的定位功能。

四、百度地图定位功能的实现

如果你是下载的最新版本的百度地图提供的jar包,那么你会绝望,因为,它会一直显示你在非洲的几内亚湾,出现这个的原因就是因为你的经纬度为空,程序没有从你的手机所在的地方获取到经度和纬度的值。所以不要在最新的版本里面调试了,下载我提供的版本,妥妥滴!接下来看代码!

1、libs目录

2、AndroidManifest.xml文件

这个相比较上个,除了添加了更多的权限以外,还有就是service标签,这个一定要添加上去,不然就定位不了

<?xml version="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.test.app03" android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="14"android:targetSdkVersion="27" /><!-- 百度地图API权限 --><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.ACCESS_COARSE_LOCATION" >  </uses-permission>  <!-- 这个权限用于访问GPS定位 -->  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >  </uses-permission>  <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >  </uses-permission>  <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >  </uses-permission>  <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >  </uses-permission>  <!-- 用于读取手机当前的状态 -->  <uses-permission android:name="android.permission.READ_PHONE_STATE" >  </uses-permission>  <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >  </uses-permission>  <!-- 访问网络,网络定位需要上网 -->  <uses-permission android:name="android.permission.INTERNET" />  <!-- SD卡读取权限,用户写入离线定位数据 -->  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >  </uses-permission>  <!-- 允许应用读取低级别的系统日志文件 -->  <uses-permission android:name="android.permission.READ_LOGS" >  </uses-permission>  <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="7EILuUqjsawBtYay8VoKHGzdt7x3V8QO" /><activity android:name="com.test.app03.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><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application>
</manifest>

3、main.xml 文件

接下来就是main.xml 文件,这个文件主要是添加几个选项,和value.xml一样的功能。

为什么我的这里多了一个menu的文件夹,是因为我建立工程时,没有选择empty project,而是默认一直next。如果看不懂就百度吧。

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context="com.test.app03.MainActivity" ><itemandroid:id="@+id/id_map_common"android:showAsAction="never"android:title="普通地图"/><itemandroid:id="@+id/id_map_site"android:showAsAction="never"android:title="卫星地图"/> <itemandroid:id="@+id/id_map_traffic"android:showAsAction="never"android:title="实时交通(off)"/><itemandroid:id="@+id/id_map_location"android:showAsAction="never"android:title="我的位置"/>
</menu>

4、MainActivity.java

最后就是MainActivity.java,注释已经标识清楚,不懂地可以百度。请务必使用我的项目工程!

package com.test.app03;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.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;public class MainActivity extends Activity{/*** 定位SDK核心类*/private LocationClient locationClient;/*** 定位监听*/public MyLocationListenner myListener = new MyLocationListenner();/*** 百度地图控件*/private MapView mapView;//private Context context;private double mLatitude;private double mLongtitude;/*** 百度地图对象*/private BaiduMap baiduMap;boolean isFirstLoc = true; // 是否首次定位@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);/*** 地图初始化*///获取百度地图控件mapView = (MapView) findViewById(R.id.id_bmapView);//获取百度地图对象baiduMap = mapView.getMap();// 开启定位图层baiduMap.setMyLocationEnabled(true);/*** 定位初始化*///声明定位SDK核心类locationClient = new LocationClient(this);//注册监听locationClient.registerLocationListener(myListener);//定位配置信息LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);//定位请求时间间隔locationClient.setLocOption(option);//开启定位locationClient.start();}/*** 定位SDK监听函数*/public class MyLocationListenner implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {// map view 销毁后不在处理新接收的位置if (location == null || mapView == null) {return;}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();//给百度地图对象传入经纬度baiduMap.setMyLocationData(locData);if (isFirstLoc) {isFirstLoc = false;//定义一个经纬度的变量,将获取到的经纬度的值赋给这个变量LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());//获取经度mLatitude = location.getLatitude();//获取纬度值mLongtitude = location.getLongitude();MapStatus.Builder builder = new MapStatus.Builder();//控制缩放的尺寸builder.target(ll).zoom(18.0f);baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}/** 下拉框控制地图的样式*/@Overridepublic 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://调用获取我的位置的方法centerToMyLocation();break;default:break;}return super.onOptionsItemSelected(item);}//将mLatitude值和mLongtitude值传入private void centerToMyLocation() {LatLng latlng = new LatLng(mLatitude,mLongtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latlng);baiduMap.animateMapStatus(msu);    }@Overrideprotected void onPause() {mapView.onPause();super.onPause();}@Overrideprotected void onResume() {mapView.onResume();super.onResume();}@Overrideprotected void onDestroy() {// 退出时销毁定位locationClient.stop();// 关闭定位图层baiduMap.setMyLocationEnabled(false);mapView.onDestroy();mapView = null;super.onDestroy();}
}

 最后,那个layout文件,和之前一样,直接粘贴就行了。

分享一下App的运行成果

相信大家,如果是按照我说的,而且能把代码看懂,就OK了,如果出现问题,看是不是跟我的代码有不一样的地方,不要害怕出现问题,敢于去解决,最最重要的是千万不要挠头发,不然头会很冷,哈哈^_^

下载地址:

https://download.csdn.net/download/lwd23333/10756334

Android开发中调用百度地图SDK相关推荐

  1. Android 调用百度地图sdk 实现路线规划导航

    Android 调用百度地图sdk 实现路线规划导航 功能: 实现实时/需求定位 卫星地图查看 路况 周边poi检索 地点输入提示检索 驾驶 步行 公交 骑行路线规划 注:以上为实现的大概功能 ,接下 ...

  2. Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能

    from: http://blog.csdn.net/y1scp/article/details/49095729 定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址, ...

  3. vue中调用百度地图实现搜索等功能

    vue中调用百度地图实现搜索等功能 在最近做电商项目时用户订单等物流信息想做的更加详细点所以加入了地图这个小功能,不是很难只是在一个未知的领域可能有点迷茫 现在也是体会到了,学新的东西还是得看官方文档 ...

  4. AndroidStudio调用百度地图SDK,报错:errorcode: 200 uid: -1 appid -1 msg: APP不存在

    AndroidStudio调用百度地图SDK,报错:errorcode: 200 uid: -1 appid -1 msg: APP不存在 我傻了,抄了官网的代码没有把开发者key复制到Android ...

  5. Android开发中调用系统窗口的方法

    //直接拨号 Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); start ...

  6. ios项目中调用百度地图iphone版与百度地图HDipad版的坑

    最近在写项目的时候发现了项目中调用百度地图的一个坑,iphone版与ipad版的不同. 一.首先百度地图在ipad上叫百度地图HD,要区分有GPS和没GPS版,也就是说没GPS的没有导航功能,在使用项 ...

  7. vue中调用百度地图 获取经纬度

    项目中,需要实现获取当前位置的经纬度,或者搜索某个位置并获取经纬度信息,我使用的的是vue,地图使用的是百度地图. 默认自动获取当前位置经纬度 拖动小红标 获取经纬度 关键词 查询获取经纬度 前期准备 ...

  8. Android中级篇之百度地图SDK v3.5.0-基础地图[图解百度地图基础教程]

    基础地图[比官方更详细] 简介 开发者可利用SDK提供的接口,使用百度为您提供的基础地图数据.目前百度地图SDK所提供的地图等级为3-19级,所包含的信息有建筑物.道路.河流.学校.公园等内容.所有叠 ...

  9. android 调用百度sdk后运行不了,解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题...

    因为工作的需要,我在做软件的时候用到地图,并且需要从地图中搜索公交.商户等信息,因此选择百度地图.百度地图搜索的poi搜索正好符合我的需求,但是软件完成后发现在软件第一次执行的时候总是出错,百度地图无 ...

最新文章

  1. springmvc xml 空模板
  2. Mysql 乱码的解决
  3. Mathtype写分段函数的方法
  4. 知乎问题:概率图模型是否有必要系统地学习
  5. 面试官问我:如何解决ABA问题?我给出接近满分的回答
  6. vue --- ref属性获取dom元素和子组件的方法
  7. 【STM32】高级定时器、通用定时器和基本定时器---配置寄存器产生PWM
  8. 阿拉伯数字转中文大(小)写的函数
  9. idea ssm打war包_使用idea新建springBoot+Gradle项目(超详细)
  10. 计算机重新如何连接网络打印机,电脑怎样连接打印机,小编教你电脑如何连接网络打印机...
  11. 抖音上python有用吗_专栏 | 如何在抖音上找到漂亮小姐姐?这里有个Python抖音机器人...
  12. DynamipsGUI使用方法
  13. 【OpenCV】-重映射
  14. work_study_plan
  15. HTML+5.2+新特性,HTML 5中的新特性
  16. python内置容器--元组,字典与集合
  17. iPad----------教你如何查询ipad型号
  18. 与文本内容无关的说话人识别概述——从特征到超矢量
  19. 心跳机制 heartbeat
  20. 当前时间显示器(代码屏显)

热门文章

  1. 怎么给黑白照片上色?这几个软件可以给黑白照片上色
  2. 有一说一,外包公司到底值不值得去?
  3. 为什么红黑树查询快_红黑树为什么比二叉查找树更高效
  4. sonix uvc驱动的加入 RT5350支持H264
  5. A-LBS技术,物流平台建设之必需
  6. 使用Golang将十进制数字转化为由A-Z(1-26)表示的形式
  7. bes2300之电源管理(六)
  8. 计算机软件退税,国税发[1995]209号 国家税务总局关于使用出口退税计算机管理软件有关问题的通知...
  9. java计算机毕业设计基于ssm框架的校园闲置二手商品交易平台
  10. 共享农场土地租赁,智慧农业众筹认养小程序定开还是二开合适呢?