Android Studio:10分钟教会你做百度地图定位!并解决SDK22中方法报错的问题!
2017-04-01 09:05
351 查看
手机的百度地图的使用很常用!
比如:
1、送外卖的定位
2、网购淘宝的定位
3、周末去做兼职,找地点
4、去陌生城市,找住宿....
android 的百度地图定位,很多人都写过了,我写简单讲述自己的经验,
并解决android 5.1 的报错!(4.0-4.4,6.0-7.1都没有报错!)
要想使用百度地图sdk,就必须申请一个百度地图的api key。申请流程挺简单的。
1、首先注册成为百度的开发者,然后打开
http://lbsyun.baidu.com/apiconsole/key
注册:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/2837c0cd3d950979623aab162c2e5f8e)
激活邮箱
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/4debb13b3b2263a8cec137f178406f76)
创建应用:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/942e761ccfaadb35d4c33bc10f315234)
2、我们需要获取SHA1,还要找自己项目的包名,这样才能得到安全码
那么怎么获得SHA1呢?
我们一般都设置好java的环境变量,
那就直接:win+r,cmd,来到dos命令窗口,
输入【keytool -list -v -keystore debug.keystore】回车,
然后提示你输入【秘钥库口令】,输入【android】回车然后就会显示SHA1的值。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/090dd717d3a8c1ffdf223e68a0117ed5)
在AndroidMainfest.xml找自己的包名
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/09e045b84778087823a97c0b8cfe7b9d)
3、输入从DOS获得的SHA1 ,以及自己的项目包名:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/efd64147b8b128c94adf38f1f6090896)
提交吧!
一个新鲜的key就 √ 搞定了!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/7e611689e2d170e36055788e977a80d7)
然后我们把key输入项目:
http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
外置插件,肯定有些jar包的!
目前新版是4.2.1
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/63401d78d53b5086e1078ecd5b4307ea)
自行选择你需要的,我这里选择基础定位
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/44da63f53dffc7480497109ee3fa6ecd)
下载之后,压缩包有8.8M,解压后有16M,lib里面有5个so包文件夹,一个jar包
外面一个说明书
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/268285330cb3701131cb6a45bc83f3b3)
要是不知道自己应该选择哪个,就全部拷贝进去吧!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/448d2fd6024cb385795a281e885cbd98)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/cb188fc0dd986d687ead58018b72c376)
BaiduLBS_Android.jar (右键) - Add As Library
这个解析能加载到你的build.gradle(app)中
基本上就这几个了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/c0ead6939efb10abbbe1b10c2150ca43)
1、AndroidManifest.xml
key值,大家都是不一样的,照抄没用
2、xml页面:
3、MainActivity.java
这里需要注意一下:initialize方法中必须传入的是ApplicationContext,传入this,或者MAinActivity.this都不行,不然会报运行时异常,所以百度建议把该方法放到Application的初始化方法中。
切换project,lib包放入sdk文件:我这里直接放了5个so包,一个jar包,
记得解析jar包啊!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/af2b99359af28e5a057ce6216bb1d395)
可以试着运行一下!
一般不会报错 →。→
如果报错了,请看第五点
百度地图将地图的类型分为两种:普通矢量地图和卫星图。
这里将mBaiduMap改为:bdMap
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//开启交通图
mBaiduMap.setTrafficEnabled(true);
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(true);
五、SDK22版本的报错:
1、报错一:
Process: com.ds.android, PID: 21200
java.lang.UnsatisfiedLinkError: No implementation found for long com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create()
(tried Java_com_baidu_platform_comjni_map_commonmemcache_JNICommonMemCache_Create and Java_com_baidu_platform_comjni_map_commonmemcache_JNICommonMemCache_Create__)
at com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create(Native Method)
at com.baidu.platform.comjni.map.commonmemcache.a.a(Unknown Source)
at com.baidu.platform.comapi.e.c.b(Unknown Source)
at com.baidu.mapapi.a.c(Unknown Source)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source)
at com.ds.android.MainApplication.onCreate(MainApplication.java:20)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4621)
at android.app.ActivityThread.access$1500(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
2、或者提示方法报错:
SDKInitializer.initialize(getApplicationContext());
都是没有发现so包,或者so包缺失,
为什么so包会没有发现?明明全部导入了?
找了一晚上的论坛,在build.gradle里面搞定了!
在这里加上几句:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/5012e5bcc7aee63b4cde76aec3cd9fe7)
可以看到这里会生成一个文件夹
jniLibs.srcDir 'libs' 这句话的含义,是在gradle编译时,
加载当前与build.gradle文件同目录下的libs文件夹下的so,包含x86、x86_64、armeabi、arm64等。
如果你当前目录下都没有so,那肯定加载失败了。
也就是说so你可以放到其他目录,但是路径一定要指定正确;
其次,当你的src目录下有libs,libs下有各so文件,正常情况下,是可以默认加载的。
所以要看清自己的目录结构。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/263b9f1533527f2e958b99c07ba1f3d2)
六、我们看看效果吧:
也许还会报key的错误,但是一般都可以使用了!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/77e8cd81cc7e659e23d0ca7934e84a77)
默认的地点是北京
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/ee533ca757debe269c5d59d22cfb0cd4)
如果离线模式,也能加载附近的一些地点,但是呢,
断网还是不能加载太多的地点,23333
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/26/45fc34b3b3cd856f915135bc7761a749)
好了,大家自己试试吧,如果还有报错,来下面留言,我抽空看看怎么解决。
比如:
1、送外卖的定位
2、网购淘宝的定位
3、周末去做兼职,找地点
4、去陌生城市,找住宿....
android 的百度地图定位,很多人都写过了,我写简单讲述自己的经验,
并解决android 5.1 的报错!(4.0-4.4,6.0-7.1都没有报错!)
一、申请AK(API Key)
要想使用百度地图sdk,就必须申请一个百度地图的api key。申请流程挺简单的。1、首先注册成为百度的开发者,然后打开
http://lbsyun.baidu.com/apiconsole/key
注册:
激活邮箱
创建应用:
2、我们需要获取SHA1,还要找自己项目的包名,这样才能得到安全码
那么怎么获得SHA1呢?
我们一般都设置好java的环境变量,
那就直接:win+r,cmd,来到dos命令窗口,
输入【keytool -list -v -keystore debug.keystore】回车,
然后提示你输入【秘钥库口令】,输入【android】回车然后就会显示SHA1的值。
在AndroidMainfest.xml找自己的包名
3、输入从DOS获得的SHA1 ,以及自己的项目包名:
提交吧!
一个新鲜的key就 √ 搞定了!
然后我们把key输入项目:
<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="你的key "/>
......</application>
二、下载SDK开发包
http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download外置插件,肯定有些jar包的!
目前新版是4.2.1
自行选择你需要的,我这里选择基础定位
外面一个说明书
BaiduLBS_Android.jar (右键) - Add As Library
这个解析能加载到你的build.gradle(app)中
三、公布代码,并在android项目中引用百度SDK
基本上就这几个了:1、AndroidManifest.xml
key值,大家都是不一样的,照抄没用
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="example.com.baidu_map"> <!-- 百度地图的权限! --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <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.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <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="4jjVdgenC3IZgB98UpKOLG1mP9C1GLrW"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2、xml页面:
<LinearLayout 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" android:orientation="vertical" tools:context="example.com.baidu_map.MainActivity"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapview" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>
3、MainActivity.java
这里需要注意一下:initialize方法中必须传入的是ApplicationContext,传入this,或者MAinActivity.this都不行,不然会报运行时异常,所以百度建议把该方法放到Application的初始化方法中。
package example.com.baidu_map; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.Window; public class MainActivity extends Activity { // 百度地图控件 private MapView mMapView = null; // 百度地图对象 private BaiduMap bdMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); init(); } /** * 初始化方法 */ private void init() { mMapView = (MapView) findViewById(R.id.bmapview); bdMap = mMapView.getMap(); //普通地图 bdMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { mMapView.onDestroy(); mMapView = null; super.onDestroy(); } }
切换project,lib包放入sdk文件:我这里直接放了5个so包,一个jar包,
记得解析jar包啊!
可以试着运行一下!
一般不会报错 →。→
如果报错了,请看第五点
四、显示实时交通图(路况图)
百度地图将地图的类型分为两种:普通矢量地图和卫星图。这里将mBaiduMap改为:bdMap
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//开启交通图
mBaiduMap.setTrafficEnabled(true);
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(true);
五、SDK22版本的报错:
1、报错一:
Process: com.ds.android, PID: 21200
java.lang.UnsatisfiedLinkError: No implementation found for long com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create()
(tried Java_com_baidu_platform_comjni_map_commonmemcache_JNICommonMemCache_Create and Java_com_baidu_platform_comjni_map_commonmemcache_JNICommonMemCache_Create__)
at com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create(Native Method)
at com.baidu.platform.comjni.map.commonmemcache.a.a(Unknown Source)
at com.baidu.platform.comapi.e.c.b(Unknown Source)
at com.baidu.mapapi.a.c(Unknown Source)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source)
at com.ds.android.MainApplication.onCreate(MainApplication.java:20)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4621)
at android.app.ActivityThread.access$1500(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
2、或者提示方法报错:
SDKInitializer.initialize(getApplicationContext());
都是没有发现so包,或者so包缺失,
为什么so包会没有发现?明明全部导入了?
找了一晚上的论坛,在build.gradle里面搞定了!
在这里加上几句:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "example.com.baidu_map" minSdkVersion 22 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } sourceSets { main() { jniLibs.srcDirs = ['libs'] } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' } } dependencies { compile files('libs/BaiduLBS_Android.jar') }
可以看到这里会生成一个文件夹
jniLibs.srcDir 'libs' 这句话的含义,是在gradle编译时,
加载当前与build.gradle文件同目录下的libs文件夹下的so,包含x86、x86_64、armeabi、arm64等。
如果你当前目录下都没有so,那肯定加载失败了。
也就是说so你可以放到其他目录,但是路径一定要指定正确;
其次,当你的src目录下有libs,libs下有各so文件,正常情况下,是可以默认加载的。
所以要看清自己的目录结构。
六、我们看看效果吧:
也许还会报key的错误,但是一般都可以使用了!
默认的地点是北京
如果离线模式,也能加载附近的一些地点,但是呢,
断网还是不能加载太多的地点,23333
好了,大家自己试试吧,如果还有报错,来下面留言,我抽空看看怎么解决。
相关文章推荐
- Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法
- DIV设置float后父容器无法定位高度的问题解决方法
- [Android实例] 最新android studio注意事项打不开等问题6种解决方法
- [工具/PC]计算机中丢失libiconv-2.dll,丢失libintl-8.dll,无法定位程序输入点libiconv于动态链接库libiconv-2.dll上问题解决方法
- Mac系统打开应用程序文件夹的方法+解决Android studio出现fetching android sdk component超时打不开的问题
- win32窗口:关于鼠标定位位置偏移问题的原因及解决方法
- asp.net刷新页面定位问题的解决方法
- jbuilderx 光标定位问题解决方法(转载)
- jbuilderx 光标定位问题解决方法(转载)
- android studio 不能更新问题解决方法
- 百度地图开发中的java.lang.ClassCastException解决方法及定位源码
- 最新android studio注意事项打不开等问题6种解决方法
- 百度地图-解决新版百度定位失败问题
- 安装itunes出现无法定位程序输入点(QTCF)的问题解决方法
- 从源码安装mysql无法定位basedir问题的解决方法
- 打开xshell等无法定位程序输入点*于动态链接库nssock2.dll上的问题解决方法
- keil3 鼠标定位不准问题解决方法
- 解决百度地图定位初始化 先初始化到北京,后定位到所在地的问题
- supermap学习系列之silverlight--添加可拖拽的定位图钉(方法二之超图自带类(Pushpin、InfoWindow)) 续 解决上一篇的问题
- 百度地图-解决新版百度定位失败问题