大概十天前安卓课程需要做一个百度地图的基本定位。跟着郭老师的一行代码来的,讲的很详细,一步一步跟着来应该是没问题的。但是出现了一个errorcode -11总是提示我的API KEY授权失败。卡了三四五天、终于在结合了上个月的实验后、突然顿悟。所以觉得:应该写个博客来纪念一下这漫长的征途。(我也不知道为什么每次实验我都能遇到别人遇不到的雷点(╯‵□′)╯炸弹!•••*~●)
就每一步大概分两个部分讲一下:关于怎么操作、操作中应该注意或遇到的雷点。
1.注册百度地图API Key
百度地图开放平台(http://lbsyun.baidu.com/)->开发文档->Android地图SDK->获取密钥->创建应用
然后就到了下面这个页面
应用名称自己填一个自己想填的应用名即可(此处雷点:如果你对于同一个项目申请了多个key,那你这个应用名就应该有所区别)
发布版SHA1和开发版SHA1其实时不同的,没有发布版SHA1,这里申请key我们可以先都填上开发版的SHA1,如图所示找到signingReport双击等待运行完毕后就会看到我们要的SHA1
至于包名要与Manifest文件下的package一致、然后提交就可以获取到我们要的AK了
此处雷点:如果包名和SHA1值没有填写正确的话,加载百度地图API时会授权失败的,具体表现就是授权失败的信息提示了(当然不同的授权失败会有不同的errorcode提示,得根据不同的提示信息分析,出现网格不一定就是包名和SHA1错误)
2.导入百度API的jar包和相关更新
申请完以后我们要去下载相应的SDK,大家根据自己需求下载即可,我下载的是基础地图和基本定位。
然后解压后将jar包和其余五个文件夹复制到libs目录下,并更新gradle(这样我们的jar包才可以使用,更新gradle:File->Sync Project with gradle file),如果是单独将五个文件夹放置在main->jniLibs下,那还要去build.gradle里面更新相应的资源(这个百度的demo里面有说、如果要这样做可以去跟着demo看看)
3.在manifest文件中提供相应的用户权限和相关组件
这是实现百度地图所需要的权限
此处雷点:这段权限要放在application标签的前面、不然也会加载地图失败
-
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
-
<uses-permission android:name="android.permission.ACCESS_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">
</uses-permission>
-
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
-
tools:ignore=
"ProtectedPermissions">
</uses-permission>
-
<uses-permission android:name="android.permission.WAKE_LOCK">
</uses-permission>
获取密钥。<meta-data>里面的value就是我们之前申请到的AK。
为活动注册一个百度地图的service。
4.编写MainActivity.java和activity_main.xml
看郭神的讲解呢是从实现定位开始再来加载地图,百度官方的讲解呢是先从先实现地图的加载再来实现当前位置的定位。个人觉得呢,按百度的来,先实现地图加载。至少你能先验证了自己的AK申请是没问题的,不然跟我一样写完了一大堆后再加载地图发现提示授权失败。
所以,先在.xml里面添加一个mapView控件
-
<com.baidu.mapapi.map.MapView
-
android:id=
"@+id/bdmapview"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
android:clickable=
"true"/>
再在修改.Java文件,定义一个MapView和一个BaiduMap对象。
private MapView mapView; private BaiduMap baiduMap;
进行SDK初始化和实例化MapView,再利用getMap()方法获取地图即可。最后实现生命周期管理。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.bdmapview); baiduMap = mapView.getMap(); }
@Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); }
然后运行你就可以看见北京天安门啦。
5.实现当前位置定位
这个看着一行代码一步一步来的,感觉再讲太细致的话就会太啰嗦了,所以直接奉上我的代码,可以一边看郭神一边消化就好了。这是贴.java文件代码的另一篇博客(因为贴到一起实在是太长了(●ˇ∀ˇ●))。https://blog.csdn.net/weixin_41027614/article/details/105985986
6.雷点了!!!坑坑坑!!!
首先我先说明,如果要做这个实验,最好最好掏出一个安卓机来做测试,因为你根本不知道用模拟器前面有多少坑在等你。
百度地图加载不了,只有网格!!!
如图所示,可以实现当前位置的定位,但是加载不出来地图。
然后报错报错报错errocode -11,可以看出来Unable to resolve host "api.map.baidu.com",是无法解析这个域名所以进入adb shell用getprop|grep net.dns1查看模拟器的dns配置,果然根本没有这个字段。然后觉得可能要切换到root以后才能看见。但是搞了好久root它进不去就是进不去,所以我把我的Android版本从10.0降到了6.0(6.0下Android模拟器的adb shell是默认root用户运行的),然后查看dns,有了!!!
跑起来了我的小百度地图,结果问题又来了:
当前位置漂浮在大西洋中,在几内亚湾!!!
(很遗憾,可能由于太愤怒,忘记截图了,反正就是在海上飘荡)
关于这个我解决了很久,两天,整整两天,最后我没有解决,我只能拿出来了我的华为,一顿猛戳,然后跑起来了,就在我的头顶的位置。(关于连接真机,就按一般博客上面讲的来就行,可能会出现安卓设备不被AS识别为安卓设备的情况,需要确认一下手机是否打开了USB调试,最好咯,装个什么360手机助手的,轻松解决安卓驱动问题)
另外一个小问题:权限很重要,高版本一点的安卓需要手动对运行时权限进行处理,在location、storage、phone_state三个权限要手动添加,或许你的代码里面有处理会出现获取权限的对话框,但有时候它还是没有添加上的,你需要去设置里面手动为应用添加这三个权限。打开GPS也是同理。
搞了这么罗里吧嗦,每次做实验都是感觉无比痛苦,经常卡一些bug,但是每次一写博客其实感觉也还好,就那么几步,这次卡了一个星期,我的五一小长假也都被折腾没了。早日开学是没希望了,望ddup。
转载:https://blog.csdn.net/weixin_41027614/article/details/105964799