手機的百度地圖的使用很常用!
比如:
1、送外賣的定位
2、網購淘寶的定位
3、週末去做兼職,找地點
4、去陌生城市,找住宿....
android 的百度地圖定位,很多人都寫過了,我寫簡單講述自己的經驗,
並解決android 5.1 的報錯!(4.0-4.4,6.0-7.1都沒有報錯!)
一、申請AK(API 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開發包
三、公佈代碼,並在android項目中引用百度SDK
<?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>
<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>
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(); } }
四、顯示實時交通圖(路況圖)
百度地圖將地圖的類型分爲兩種:普通矢量地圖和衛星圖。
這裏將mBaiduMap改爲:bdMap
- //開啓交通圖
- 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
好了,大家自己試試吧,如果還有報錯,來下面留言,我抽空看看怎麼解決。