• [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
        首先,注冊成为一名百度开发人员.

       提交注冊成功后例如以下图所看到的.

       点击"去创建应用>>",例如以下图所看到的,这里显示你的应用列表.

       此时点击“创建应用”就可以申请APIKey,选择类型曾经我们见过的博客书籍一般是选择"for mobile"应用类型,这里已经没有该选项了,故我选择"for Android",同一时候输入安全码!

        这里你可能疑惑"安全码"是什么?

    它是由"数字签名;包名"组成,当中数字签名是我们打包程序时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


       点击"提交"后就可以获取的AK:QwaNhFQ0ty2QmdYh3Nrr0gQx


    二.配置项目调用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文件.例如以下图所看到的:

        当中该project包名为com.eample.baidumapshow,libs文件夹用于存放第三方Jar包,armeabi文件夹存放NDK生成so文件调用其C/C++函数库.同一时候须要导入jar包,右键project->"Properties(属性)"->"Java构建路径",例如以下图所看到的加入JAR.


    三.源码显示百度地图

        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="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="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.执行效果例如以下图所看到的
       
        最后希望文章对大家有所帮助,这是我帮同学做百度地图简单研究的一篇基础性文章,当中后面准备讲讲百度地图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

  • 相关阅读:
    Django上传文件
    Django的模板语言
    LeetCode:268. 缺失数字
    LeetCode:260. 只出现一次的数字 III
    SVN安装使用【转】
    c# 如何给 dataGridView里添加一个自增长列(列名为序号)
    asp.net mvc 使用Ajax调用Action 返回数据【转】
    sql server block如何查询并kill
    软件概要设计文档【转】
    软件详细设计文档【转】
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6916383.html
Copyright © 2020-2023  润新知