本人用Android Studio做百度地图开发,调试了一整天,始终无法通过。然后怀疑代码有问题,就换Eclipse进行代码编写,毕竟网上关于Eclipse的资料多一些,出了问题容易解决,后来按照百度的地图文档写的简单的地图展示程序仍是无法通过,经过两个小时的查资料、调试,已经成功解决,要点也已经在上篇文章中写了出来。今天将Eclipse中的代码手工移植到android studio中,结果仍是无法运行,提示mBMapMan = new BMapManager(getApplication());这一句异常,原因是无法加载baidumapSDk。然后狂查资料,试了很多办法,终于成功解决,下面说明完整的步骤和代码。
这个就不详细说了,起好名字,一路next即可,需要注意的是,工程名字尽量保持与申请百度key的应用名称相一致。
打开AndroidManiFest.xml,此处若看百度地图文档,不要复制文档代码,复制demo代码。代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.dddd" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.android.bjshxian.MainActivity" //一下两行加入的代码 android:configChanges="orientation|keyboardHidden" android:screenOrientation="sensor" //加入的代码结束 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="false" android:resizeable="true" android:smallScreens="true" /> </manifest>
在activity_main.xml中加入如下代码,此处注意是com.baidu.mapapi.map.MapView,不是android自带的MapView,也不是com.baidu.mapapi.map.mapview,我曾因为误将MapView写成mapview调试了将近半个小时。
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"> </com.baidu.mapapi.map.MapView>
3、MainActivity.java,增加相关引用
//以下为baidu地图类 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; //以下为用到的android类 import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.widget.Toast; //声明变量: private static final String strKey = "XSKUnDZQHrKDuteH234cR3Zt";//此处是百度key,记得换成自己的key private Toast mToast; //百度地图的三个重要元素 private BMapManager mBMapMan = null; private MapView mMapView = null; private MapController mMapCon = null; //MKMapViewListener 用于处理地图事件回调 private MKMapViewListener mMapListener = null; @Override protected 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查询地理坐标 * 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至[email protected]申请坐标转换接口 */ 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认证成功"); } } } //显示toast public 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(); }
原文地址:http://tieba.baidu.com/p/2912208014