[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文件.如下图所示:

    其中该工程包名为com.eample.baidumapshow,libs目录用于存放第三方Jar包,armeabi目录存放NDK生成so文件调用其C/C++函数库.同时需要导入jar包,右键工程->"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

目录
相关文章
|
1天前
|
Dart IDE Linux
开发Android应用程序
开发Android应用程序
5 1
|
1天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
2天前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
4天前
|
安全 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,Android和iOS两大阵营各据一方。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计及市场分布等方面的主要区别。通过比较分析,我们将揭示各自平台的特有优势,并讨论如何根据目标受众和业务需求选择适合的开发平台。
|
5天前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
5天前
|
安全 Java Android开发
探索Android与iOS开发的差异与挑战
在移动应用开发的广阔天地里,Android和iOS两大平台各自占据半壁江山。本文将深入探讨这两个平台的开发环境、工具、语言以及设计理念的差异,并分析这些差异给开发者带来的挑战。我们将从多个角度出发,包括用户界面设计、性能优化、安全性考量、以及市场分布等方面,为读者提供一个全面的视角,以理解在这两个平台上进行开发时需要考虑的关键因素。
|
7天前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
7天前
|
Android开发 Kotlin
kotlin开发安卓应用 如何修改app安装后的名称
在 Android 应用中,要修改安装后的显示名称,需更新 AndroidManifest.xml 文件中 application 标签的 android:label 属性。可直接在该属性内设置新名称,或在 res/values/strings.xml 文件中修改 app_name 并在 manifest 中引用。推荐使用 strings.xml 方式,以便支持多语言和集中管理。
|
7天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
7天前
|
移动开发 安全 Android开发
探索安卓应用开发的新趋势:Kotlin与Jetpack Compose的融合
在移动开发领域,Android系统持续创新,为开发者提供更高效的工具和框架。近年来,Kotlin语言因其简洁性和现代化特性成为Android开发的首选语言。与此同时,Jetpack Compose作为一种新的UI工具集,正改变着Android界面的开发方式。本文将深入探讨Kotlin与Jetpack Compose的结合使用,分析它们如何共同推动Android应用开发进入一个更加高效、可维护和响应式的新时代。