您的位置:首页 > 移动开发 > Android开发

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都没有报错!)


一、申请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



自行选择你需要的,我这里选择基础定位








下载之后,压缩包有8.8M,解压后有16M,lib里面有5个so包文件夹,一个jar包

外面一个说明书





要是不知道自己应该选择哪个,就全部拷贝进去吧!





 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

 





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



好了,大家自己试试吧,如果还有报错,来下面留言,我抽空看看怎么解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐