zoukankan      html  css  js  c++  java
  • Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

    转载请注明地址http://blog.csdn.net/xiaanming/article/details/11171581

    近期自己想研究下地图,本来想研究google Map,可是申请API key比較坑爹,于是从百度地图入手,事实上他们的使用方法都差点儿相同,本篇文章就带领大家在自己的Android项目中增加百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!


    一 申请API key

    • 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/apiconsole/key,自己自行注冊一个百度账号,非常快就能申请到的,例如以下图


    • 点击"创建密钥",系统将为我们自己主动生成密钥,当然我们在使用密钥之前还必须配置,点击"设置"例如以下图



    Key type 选择“for mobile”,安全码是Android签名证书的证书指纹 (SHA1)值 + “;” + 你的应用程序包名,所以当你配置好了API key 你不能任意更换应用程序的包名, 假设更换了包名我们须要又一次配置API key,接下来我们来介绍怎么获取数字签名

    我们知道我们开发的Android程序是须要给他签名的,假设没有签名是不同意被安装到手机或者模拟器的,那么你会有疑问,我寻常开发的应用确实没签名,怎么能在模拟器或者手机上直接执行呢,事实上ADT会自己主动的使用debug密钥为应用程序签名,当然你也能够自己创建一个属于你自己的密钥,直接用Eclipse可视化创建即可了,非常方便的,这里我就不介绍了

    • 这里我们用debug.keystore来生成Android签名证书的证书指纹 (SHA1)值能够在eclipse中直接查看:winows -> preferance -> android -> build。 例如以下图示


    然后我们使用keytool工具来获取签名证书的sha1值,在DOS输入keytool -list -keystore C:Usersds.androiddebug.keystore红色部分为debug.keystore的路径,接下来会要你输入输入密钥库口令,默认输入“android”,这样子我们就能获取证书指纹 (SHA1),例如以下图


    红色框框里面的东西就是我们须要的Android签名证书的证书指纹 (SHA1)值,然后我们复制出来,输入到API key的安全码输入框里面,再用分号隔开加上你的应用程序包名,如  02:5C:80:25:B2:8F:6F:60:54:B9:F4:B2:EF:94:FF:EE:CC:3C:5A:29;com.example.baidumapdemo 这样子我们就配置好了API key


    下载百度地图API库

    要在Android应用中使用百度地图API,就须要在project中引用百度地图API开发包,下载地址http://developer.baidu.com/map/sdkandev-download.htm,下载Android SDKv2.1.3 lib库即可了


    三、在Android项目中引用百度地图

    • 新建Android项目 BaiduMapDemo,然后将百度地图API库增加project,例如以下图


    • 在布局文件里增加百度地图控件,

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
    
    </LinearLayout>

    • Activity界面代码,凝视的非常具体,相信你看得懂

    package com.example.baidumapdemo;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.widget.Toast;
    
    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.MapPoi;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.platform.comapi.basestruct.GeoPoint;
    
    public class MainActivity extends Activity {
    	private Toast mToast;
    	private BMapManager mBMapManager;
    	/**
    	 * MapView 是地图主控件
    	 */
    	private MapView mMapView = null;
    	/**
    	 * 用MapController完毕地图控制
    	 */
    	private MapController mMapController = null;
    	/**
    	 * MKMapViewListener 用于处理地图事件回调
    	 */
    	MKMapViewListener mMapListener = null;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		/**
    		 * 使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
    		 */
    		mBMapManager = new BMapManager(this);
    		
    		//第一个參数是API key,
    		//第二个參数是经常使用事件监听,用来处理通常的网络错误,授权验证错误等,你也能够不增加这个回调接口
    		mBMapManager.init("7ae13368159d6a513eaa7a17b9413b4b", new MKGeneralListener() {
    			
    			//授权错误的时候调用的回调函数
    			@Override
    			public void onGetPermissionState(int iError) {
    				if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
    					showToast("API KEY错误, 请检查!");
    	            }
    			}
    			
    			//一些网络状态的错误处理回调函数
    			@Override
    			public void onGetNetworkState(int iError) {
    				if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
    					Toast.makeText(getApplication(), "您的网络出错啦!", Toast.LENGTH_LONG).show();
    	            }
    			}
    		});
    		
    		
    		setContentView(R.layout.activity_main);
    		
    		mMapView = (MapView) findViewById(R.id.bmapView);
    		
    		  /**
             * 获取地图控制器
             */
            mMapController = mMapView.getController();
            /**
             *  设置地图是否响应点击事件  .
             */
            mMapController.enableClick(true);
            /**
             * 设置地图缩放级别
             */
            mMapController.setZoom(12);
            
            /**
             * 显示内置缩放控件
             */
            mMapView.setBuiltInZoomControls(true);
            
            /**
             * 保存精度和纬度的类,
             */
            GeoPoint p = new GeoPoint((int)(22.547923 * 1E6), (int)(114.067368 * 1E6));
            //设置p地方为中心点
            mMapController.setCenter(p);
            mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
    			
            	/**
            	 * 地图移动完毕时会回调此接口 方法
            	 */
    			@Override
    			public void onMapMoveFinish() {
    				showToast("地图移动完毕!");
    			}
    			
    			/**
    			 * 地图载入完毕回调此接口方法
    			 */
    			@Override
    			public void onMapLoadFinish() {
    				showToast("地图载入完毕!");
    			}
    			
    			/**
    			 *  地图完毕带动画的操作(如: animationTo())后,此回调被触发
    			 */
    			@Override
    			public void onMapAnimationFinish() {
    				
    			}
    			
    			/**
    			 *  当调用过 mMapView.getCurrentMap()后,此回调会被触发
    			 *  可在此保存截图至存储设备
    			 */
    			@Override
    			public void onGetCurrentMap(Bitmap arg0) {
    				
    			}
    			
    			/**
    			 * 点击地图上被标记的点回调此方法
    			 * 
    			 */
    			@Override
    			public void onClickMapPoi(MapPoi arg0) {
    				if (arg0 != null){
    					showToast(arg0.strText);
    				}
    			}
    		});
    	}
    
    
    	
    	@Override
    	protected void onResume() {
        	//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		mMapView.onResume();
    		super.onResume();
    	}
    
    
    
    	@Override
    	protected void onPause() {
    		//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		mMapView.onPause();
    		super.onPause();
    	}
    
    	@Override
    	protected void onDestroy() {
    		//MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
    		mMapView.destroy();
    		
    		//退出应用调用BMapManager的destroy()方法
    		if(mBMapManager != null){
    			mBMapManager.destroy();
    			mBMapManager = null;
    		}
    		
    		super.onDestroy();
    	}
    
    	
    	
    	 /** 
         * 显示Toast消息 
         * @param msg 
         */  
        private 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. BMapManager是地图的引擎类,这个必须在setContentView方法之前被实例化,我们须要使用其方法init(String strKey,MKGeneralListener listener)来增加API key, MKGeneralListener  该接口返回网络状态,授权验证等结果,我们须要实现该接口以处理相应事件
    2. MapView就是我们的地图控件了,MapView有和Activity同步的生命周期,比如onResume() ,onPause() ,onRestoreInstanceState(Bundle state) ,destroy()等,我们能够通过getController()方法获取地图控制器MapController,这个对象可用于控制和驱动平移和缩放等
    3. MapView有两个接口能够注冊,各自是MKMapTouchListener(地图点击事件监听器),MKMapViewListener(地图监听器)上面的Demo我给MapView注冊了MKMapViewListener,也简单实现了里面的几个方法,接下来我会带着大家具体的了解这里面的方法,希望大家到时候关注我的博客

    • 当然,我们在程序执行之前,还必须增加相相应的权限

      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
        <uses-permission android:name="android.permission.INTERNET" />  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    • 执行结果



    好了,今天的解说到此结束,有疑问的朋友请在以下留言。之后会持续介绍百度地图的使用,欢迎大家关注





  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/3982308.html
Copyright © 2011-2022 走看看