[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

知识养成了思想,思想同时又在融化知识。这篇文章主要讲述[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题相关的知识,希望能为你提供帮助。
【[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题】    近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题——仅仅显示网格 而没有显示地图,网络连接和APIKey申请都是正确的,就是不知道为什么不能显示,网上也有非常多人遇到这个问题,有的是SDK更新不兼容.并且网上非常多百度地图都是使用V2.3.1版本号,后来没有办法仅仅有通过baidumapapi_v2_4_1.jar完毕显示地图.
      当中须要注意的是使用2.3.1时调用manager.init(" APIKey" ,null)初始化地图,而2.4.1版本号是通过在AndroidManifest.xml的meta-data中输入AK.
    PS:这不过一篇Android开发百度地图的基础文章,网上资料也非常多,但该方法可行.參考郭神《Android第一行代码》中方法也是v2.3.1只能显示网格 而没有地图.

一.开发前申请APIKey參考资料:
    官方开发SDK指南  http://developer.baidu.com/map/sdkandev-14.htm
    百度地图申请密钥  http://lbsyun.baidu.com/apiconsole/key
    首先,注冊成为一名百度开发人员.

[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片
    提交注冊成功后例如以下图所看到的.
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片

    点击" 去创建应用> > " ,例如以下图所看到的,这里显示你的应用列表.
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片

    此时点击“创建应用”就可以申请APIKey,选择类型曾经我们见过的博客书籍一般是选择" for mobile" 应用类型,这里已经没有该选项了,故我选择" for Android" ,同一时候输入安全码!
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片

    这里你可能疑惑" 安全码" 是什么?
它是由" 数字签名; 包名" 组成,当中数字签名是我们打包程序时keystore的SHA1指纹,通过点击Eclipse的" 窗口(Window)-> 首选项(Preferences)-> Android-> Build" 查看,同一时候也可參照上面官方文档链接通过cmd获取.而包名就是应用程序相应的包名.例如以下:
    E5:BA:71:31:9D:A3:BF:92:8D:2E:8F:3A:6D:0A:93:5B:3D:36:59:08; com.example.baidumapshow
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片

    点击" 提交" 后就可以获取的AK:QwaNhFQ0ty2QmdYh3Nrr0gQx
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片



二.配置项目调用SDK    下载Android SDK地址:
      http://developer.baidu.com/map/sdkandev-download.htm
    在创建好的应用程序BaiduMapShow项目中libs文件夹下复制baidumapapi_v2_4_1.jar文件,同一时候libs文件夹下新建armeabi文件夹,并拷贝libBaiduMapSDK_v2_4_1.so文件.例如以下图所看到的:

[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片
    当中该project包名为com.eample.baidumapshow,libs文件夹用于存放第三方Jar包,armeabi文件夹存放NDK生成so文件调用其C/C+ + 函数库.同一时候须要导入jar包,右键project-> " Properties(属性)" -> " Java构建路径" ,例如以下图所看到的加入JAR.
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片


三.源码显示百度地图    1.activity_main.xml布局文件
    布局文件里通过载入百度地图控件MapView,它是由百度提供的自己定义控件故须要加上完整包名,同一时候该控件须要接受点击事件clickable设置为true.
< FrameLayout xmlns:android=" http://schemas.android.com/apk/res/android" xmlns:tools=" http://schemas.android.com/tools" android:id=" @+id/container" android:layout_width=" match_parent" android:layout_height=" match_parent" tools:context=" com.example.baidumapshow.MainActivity" tools:ignore=" MergeRootFrame" > < com.baidu.mapapi.map.MapView android:id=" @+id/map_view" android:layout_width=" match_parent" android:layout_height=" match_parent" android:clickable=" true" /> < /FrameLayout>

    2.MainActivity.java文件
public class MainActivity extends Activity { //BMapManager 对象管理地图、定位、搜索功能 private BMapManager mBMapManager; //MapView 地图主控件 private MapView mapView = null; //MapController 完毕地图控制 private MapController mMapController = null; //MKMapViewListener 用于处理地图事件回调 MKMapViewListener mMapListener = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * 创建对象BMapManager并初始化操作 * V2.3.1中init(APIKey,null) V2.4.1在AndroidManifest中赋值AK * 注意 初始化操作在setContentView()前 */ mBMapManager = new BMapManager(getApplication()); mBMapManager.init(null); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //获取地图控制器 取得MapController实例 mMapController = mapView.getController(); //设置地图是否响应点击事件 mMapController.enableClick(true); //设置地图缩放级别 3-19级别 级别越高 信息越具体 mMapController.setZoom(16); //显示内置缩放控件 mapView.setBuiltInZoomControls(true); /** * 获取学校经纬度 设置地图中心点 */ GeoPoint point = new GeoPoint((int)(39.96703 * 1E6), (int)(116.323772 * 1E6)); mMapController.setCenter(point); mapView.regMapViewListener(mBMapManager, new MKMapViewListener() {/** * 地图移动完毕时会回调此接口方法 */ @Override public void onMapMoveFinish() { Toast.makeText(MainActivity.this, " 地图移动" , Toast.LENGTH_SHORT).show(); }/** * 地图载入完毕回调此接口方法 */ @Override public void onMapLoadFinish() { Toast.makeText(MainActivity.this, " 地图载入" , Toast.LENGTH_SHORT).show(); }/** *地图完毕带动画的操作(如: animationTo())后,此回调被触发 */ @Override public void onMapAnimationFinish() {}/** *当调用过 mMapView.getCurrentMap()后。此回调会被触发 *可在此保存截图至存储设备 */ @Override public void onGetCurrentMap(Bitmap arg0) {}/** * 点击地图上被标记的点回调此方法 * */ @Override public void onClickMapPoi(MapPoi arg0) { if (arg0 != null){ Toast.makeText(MainActivity.this, arg0.strText, Toast.LENGTH_SHORT).show(); } } }); }@Override protected void onResume() { mapView.onResume(); if (mBMapManager != null) { mBMapManager.start(); } super.onResume(); }@Override protected void onDestroy() { mapView.destroy(); if (mBMapManager != null) { mBMapManager.destroy(); mBMapManager = null; } super.onDestroy(); } @Override protected void onPause() { mapView.onPause(); if (mBMapManager != null) { mBMapManager.stop(); } super.onPause(); } }

    3.AndroidManifest.xml中申明权限和APIKey
    当中最重要的是加入APIKey,方法mBMapManager.init(null)调用.
      < meta-data 
            android:name=" com.baidu.lbsapi.API_KEY"  
          android:value=https://www.songbingjia.com/android/" QwaNhFQ0ty2QmdYh3Nrr0gQx" >
      < /meta-data>  
< ?xml version=" 1.0" encoding=" utf-8" ?> < manifest xmlns:android=" http://schemas.android.com/apk/res/android" package=" com.example.baidumapshow" android:versionCode=" 1" android:versionName=" 1.0" > < uses-sdk android:minSdkVersion=" 19" android:targetSdkVersion=" 19" /> < !-- 获取网络状态--> < uses-permission android:name=" android.permission.ACCESS_NETWORK_STATE" /> < !-- 訪问网络 --> < uses-permission android:name=" android.permission.INTERNET" /> < !-- 获取WiFi状态 --> < uses-permission android:name=" android.permission.ACCESS_WIFI_STATE" /> < uses-permission android:name=" android.permission.CHANGE_WIFI_STATE" /> < !-- 同意程序写入外部存储,如SD卡上写文件 --> < uses-permission android:name=" android.permission.WRITE_EXTERNAL_STORAGE" /> < uses-permission android:name=" android.permission.WRITE_SETTINGS" /> < !-- 读取电话状态 --> < uses-permission android:name=" android.permission.READ_PHONE_STATE" /> < uses-permission android:name=" android.permission.CALL_PHONE" /> < !-- 获取精确位置 GPS芯片接收卫星的定位信息,定位精度达10米以内 --> < uses-permission android:name=" android.permission.ACCESS_FINE_LOCATION" /> < !-- 通过WiFi或移动基站的方式获取用户错略的经纬度信息 --> < uses-permission android:name=" android.permission.ACCESS_COARSE_LOCATION" /> < !-- 获取模拟定位信息 --> < uses-permission android:name=" android.permission.ACCESS_MOCK_LOCATION" /> < uses-permission android:name=" android.permission.ACCESS_GPS" /> < application android:allowBackup=" true" android:icon=" @drawable/ic_launcher" android:label=" @string/app_name" android:theme=" @style/AppTheme" > < meta-data android:name=" com.baidu.lbsapi.API_KEY" android:value=https://www.songbingjia.com/android/" QwaNhFQ0ty2QmdYh3Nrr0gQx" > < /meta-data> < activity android:name=" com.example.baidumapshow.MainActivity" android:label=" @string/app_name" > < intent-filter> < action android:name=" android.intent.action.MAIN" /> < category android:name=" android.intent.category.LAUNCHER" /> < /intent-filter> < /activity> < /application> < /manifest>

    4.执行效果例如以下图所看到的
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片
   
[android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题

文章图片

      最后希望文章对大家有所帮助,这是我帮同学做百度地图简单研究的一篇基础性文章,当中后面准备讲讲百度地图POI兴趣搜索和加入标注等功能吧!对于前面的问题我也不知道为什么总是显示网格 而没有地图,可是通过V2_4_1能显示地图.
    我推測其原因是曾经申请的APIKey调用方法能够实现显示地图,可是因为百度新更新的SDK方法不兼容,如今申请的APIKey须要使用新的方法,故上面的才干显示,个人意见,不知道是否正确啊!
      (By:Eastmount 2014-12-22 夜2点  http://blog.csdn.net/eastmount/)
參考资料:
      1.郭霖大神《Android第一行代码》第11章基于百度地图的开发
      2.xiaanming大神文章  http://blog.csdn.net/xiaanming/article/details/11171581
      3.百度官方文档和文库  http://wenku.baidu.com/view/86bab0b3f524ccbff12184bd.html












































    推荐阅读