android学习:初学百度地图编程
来源:互联网 发布:mfc多线程编程实例 编辑:程序博客网 时间:2024/06/02 05:33
相信对于每个IT人士来说,android的编程大家并不陌生。简单的编程方法这里不赘述。
笔者在实际应用中,运用到百度地图的相关编程,之所以选择百度而不选择谷歌地图,这个大家都懂的。
查阅了很多资料,尤其是这篇文章给我的收获较大:http://blog.csdn.net/xiaanming/article/details/11171581,以下简称“原始教程”。
但是当笔者按照文章的代码运行的时候,却无意外的奔溃。于是结合百度官方提供的例子(官方提供的例子较为复杂),自己完成了百度地图初级的调用,写下此文章,供初学百度地图的朋友们参考。
一 申请API
这个是必须的第一步,网址:http://lbsyun.baidu.com/apiconsole/key,也很简单,只要注册一个百度账号,申请一下就可以了
如图,笔者已经创建了两个应用(百度的规则是一个AK对应一个应用),如果想要创建新的应用,只要点击创建应用就可以了,服务器端的AK是系统自动生成的。
应用名称就填写你所创建应用的名称,笔者这里用smartHome代替,应用类型就选择for Mobile(其他选项没试过),主要就是安全码这个东西,官方的解释是Android签名证书的证书指纹 (SHA1)值 + “;” + 你的应用程序包名,这两个东西如何获取呢:
1.签名证书指纹,在你所使用的eclipse下的:winows -> preferance -> android -> build中即可查看
2.应用程序包名:这个大多数教程解释的比较模糊,其实就是eclipse建立好工程之后,在Andoirdmanifest.xml文件中packet所对应的值,注意是双引号里面的值,不包括双引号,切记!
二.下载百度API的库
下载地址:http://developer.baidu.com/map/sdkandev-download.htm,建议初学者下载完整包,因为百度自带了一个Demo工程,里面百度地图的许多用法都应用上了,可以方便学习。
三.在项目中添加
把里面的库导入,这里我是参考了百度官方自带的Demo例程导入的,依葫芦画瓢,不难
至此,百度地图编程之前的环境就搭建好了。下面真正计入代码部分:
1.布局文件中添加控件:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView"android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /></LinearLayout>
注意此处用的控件是百度jar包中的文件,而不是安卓自带的MapView
2.修改AndroidManifest.xml中,设置相应的权限,笔者一开始依照原始教程中的权限设置,一直处于程序奔溃状态,所以采用百度官方自带的Demo中的权限设置:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.smarthome" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.smarthome.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> <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" /> <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" > </uses-permission> <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.CAMERA" > </uses-permission> <uses-permission android:name="android.permission.RECORD_AUDIO" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 来电消音 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /></manifest>
3. Activity界面代码,注释的很详细,若有不明白的,参考原始教程:
package com.example.smarthome;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.MKEvent;import com.baidu.mapapi.map.MKMapViewListener;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapView;import com.baidu.platform.comapi.basestruct.GeoPoint;import android.app.Activity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends Activity{private static final String strKey = "7mKRrGFcZw6PPhewCjRZqZGQ"; private Toast mToast;//百度地图的三个重要元素private BMapManager mBMapMan = null;private MapView mMapView = null;private MapController mMapCon = null;//MKMapViewListener 用于处理地图事件回调private MKMapViewListener mMapListener = null; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//创建MapManager一定要在 setcontentView之前mBMapMan = new BMapManager(getApplication());mBMapMan.init(strKey, new MyGeneralListener());setContentView(R.layout.activity_main);mMapView = (MapView) findViewById(R.id.bmapView);initMap();double cLat = 32.044382;double cLon = 118.828688;moveToPoint(cLat, cLon);}/** * 将地图移到指定位置,此函数只是显示的中心位置,并非精确到某个定位点 */private void moveToPoint(double cLat ,double cLon){ /** * 将地图移动至指定点 * 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标 * 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口 */GeoPoint p = new GeoPoint((int)(cLat * 1E6),(int)(cLon * 1E6));mMapCon.setCenter(p);}/** * 在布局文件被载入之后,初始化地图 */private void initMap(){//根据mapView获取 mapController,这些都是地图编程必须的mMapCon = mMapView.getController();mMapCon.enableClick(true);//设置地图响应点击事件mMapCon.setZoom(12);//设置地图缩放级别为12//显示内置的缩放控件mMapView.setBuiltInZoomControls(true);}// 常用事件监听,用来处理通常的网络错误,授权验证错误等 class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { showToast("网络错误"); } else if (iError == MKEvent.ERROR_NETWORK_DATA) { showToast("请输入正确的检索条件"); } // ... } @Override public void onGetPermissionState(int iError) { //非零值表示key验证未通过 if (iError != 0) { //授权Key错误: showToast("授权Key错误"); } else{ showToast("key认证成功"); } } } //显示toastpublic void showToast(String msg) {if (mToast == null) {mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);} else {mToast.setText(msg);mToast.setDuration(Toast.LENGTH_SHORT);}mToast.show();}}
值得注意的是,笔者按照原始教程中的代码,一直运行奔溃,经过反复排查才知道原因:
1.对于MapManager,是
mBMapMan = new BMapManager(getApplication());
而原始教程是:
mBMapManager = new BMapManager(this);
笔者没有明白原因,若有知道的朋友,希望能告知,我猜想可能是Android 版本的问题,笔者采用的是Android4.1
2.AndroidManifest.xml设置问题,采用原始教程的权限设置是一直出错的,这个应该也是Android版本的问题
运行结果:
- android学习:初学百度地图编程
- Android 百度地图初学
- Android 百度地图初学
- 百度地图初学二
- Android 百度地图API学习(一) 开始使用百度地图
- android编程——百度地图初探
- 【Android学习】android百度地图开发
- Android学习笔记之百度地图基础知识
- Android学习笔记之百度地图Overlay
- Android学习笔记之百度地图基础知识
- Android 百度地图API学习(二)-------小试牛刀
- Android 百度地图API学习(一)-------磨刀不误砍柴工
- Android学习 - 百度地图开发基础
- Android 百度地图API学习-----坐标
- 百度地图学习笔记(Android版)
- Android学习(20)-百度地图使用
- Android百度地图学习笔记(一)
- Android百度地图学习笔记---poi检索
- 如何通过批处理安装某个文件夹下所有的app
- eclipse界面语言的切换方法
- android webView 4.2 不支持 JS 掉用 系统解决
- [java] android SharedPreferences
- Linux 上的基础网络设备详解
- android学习:初学百度地图编程
- linux下SVN数据迁移
- NAND FLASH学习笔记之nand flash基础(一)
- Quartz的使用
- Struts2开发入门
- Redmine使用
- JAVA中的强引用、弱引用、软引用、虚引用
- 学习笔记7
- 大数据时代,看看这些牛x的单位吧 - TB, PB, EB, ZB, YB, NB, DB, CB