Quantcast
Viewing all articles
Browse latest Browse all 5930

Android Studio:10分钟教会你做百度地图定位!并解决SDK22中方法报错的问题!

手机的百度地图的使用很常用!

比如:

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

注册:
Image may be NSFW.
Clik here to view.

激活邮箱

Image may be NSFW.
Clik here to view.

创建应用:

Image may be NSFW.
Clik here to view.


2、我们需要获取SHA1,还要找自己项目的包名,这样才能得到安全码

那么怎么获得SHA1呢?

我们一般都设置好java的环境变量,
那就直接:win+r,cmd,来到dos命令窗口,

输入【keytool -list -v -keystore debug.keystore】回车,
然后提示你输入【秘钥库口令】,输入【android】回车然后就会显示SHA1的值。


Image may be NSFW.
Clik here to view.


在AndroidMainfest.xml找自己的包名

Image may be NSFW.
Clik here to view.


3、输入从DOS获得的SHA1 ,以及自己的项目包名:


Image may be NSFW.
Clik here to view.


提交吧!

一个新鲜的key就 √ 搞定了!
Image may be NSFW.
Clik here to view.



然后我们把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

Image may be NSFW.
Clik here to view.



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


Image may be NSFW.
Clik here to view.




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

外面一个说明书


Image may be NSFW.
Clik here to view.


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


Image may be NSFW.
Clik here to view.


Image may be NSFW.
Clik here to view.


 BaiduLBS_Android.jar (右键) -  Add As Library 

 这个解析能加载到你的build.gradle(app)中

 

三、公布代码,并在android项目中引用百度SDK

基本上就这几个了:

Image may be NSFW.
Clik here to view.


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包啊!

Image may be NSFW.
Clik here to view.


 可以试着运行一下!

一般不会报错 →。→
如果报错了,请看第五点 



四、显示实时交通图(路况图)


百度地图将地图的类型分为两种:普通矢量地图和卫星图。

这里将mBaiduMap改为:bdMap 

  1. mMapView = (MapView) findViewById(R.id.bmapView);   
  2. mBaiduMap = mMapView.getMap();     
  3. //普通地图    
  4. mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);    
  5. //卫星地图    
  6. mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);  
  1. //开启交通图     
  2. mBaiduMap.setTrafficEnabled(true);  

  1. //开启热力图     
  2. 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里面搞定了!

在这里加上几句:

Image may be NSFW.
Clik here to view.


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文件,正常情况下,是可以默认加载的。   
所以要看清自己的目录结构。


Image may be NSFW.
Clik here to view.


六、我们看看效果吧:

也许还会报key的错误,但是一般都可以使用了!


Image may be NSFW.
Clik here to view.

默认的地点是北京

Image may be NSFW.
Clik here to view.


如果离线模式,也能加载附近的一些地点,但是呢,

断网还是不能加载太多的地点,23333


Image may be NSFW.
Clik here to view.


好了,大家自己试试吧,如果还有报错,来下面留言,我抽空看看怎么解决。





作者:ssh159 发表于2017/4/1 9:05:10 原文链接
阅读:92 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles