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

註冊:

激活郵箱


創建應用:



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
 在CODE上查看代碼片派生到我的代碼片
  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裏面搞定了!

在這裏加上幾句:



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




好了,大家自己試試吧,如果還有報錯,來下面留言,我抽空看看怎麼解決。





發佈了73 篇原創文章 · 獲贊 147 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章