关于在Android客户端上百度地图的基本功能实现

转帖请贴明出处:http://blog.csdn.net/yezisuifengbiao/article/details/13019049

首先,毋庸置疑的肯定是先申请百度地图的KEY。

至于申请方法,相信大家都知道。这点就不详述了。

其次,是下载相关的SDK,传送门:http://developer.baidu.com/map/sdkandev-download.htm

然后便是打开开发环境,新建工程,博主使用的是Eclipse.

这工程是从之前公司的项目里分离出来的,所以我写的是Fragment页面的。

下面是我项目的结构:

关于在Android客户端上百度地图的基本功能实现_第1张图片

新建完工程,别忙着干其他,把下载好的SDK,先放到libs文件夹中:

关于在Android客户端上百度地图的基本功能实现_第2张图片

然后在项目 右键---Build Path---Configure Build Path---Libraries---Add JARs 选择 baidumapapi_v2_1_0.jar 这个包---OK

其次,我们需要在AndroidManifest.xml文件里面,添加,我们所需的权限信息。这点,在百度地图的API页面有提到:

 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    
    

    
    
    
    
    
    
    

配置Activity:


            
                

                
            
        

添加屏幕及版本支持:



    


我们需要自定义一个类,继承Appliction,用于存放一些全局的和上下文的变量与方法:

下面是BaiduMapApplication.java的内容:

package com.BaiduMapDemo.Activity;

import android.app.Application;
import android.content.Context;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;

public class BaiduMapApplication extends Application {

	public static BaiduMapApplication mInstance = null;
	public boolean m_bKeyRight = true;
	BMapManager mBMapManager = null;

	public static final String strKey = "此处填写在百度地图申请的授权KEY";

	@Override
	public void onCreate() {
		super.onCreate();
		mInstance = this;
		initEngineManager(this);
	}

	@Override
	// 建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
	public void onTerminate() {
		// TODO Auto-generated method stub
		if (mBMapManager != null) {
			mBMapManager.destroy();
			mBMapManager = null;
		}
		super.onTerminate();
	}

	public void initEngineManager(Context context) {
		if (mBMapManager == null) {
			mBMapManager = new BMapManager(context);
		}

		if (!mBMapManager.init(strKey, new MyGeneralListener())) {
			Toast.makeText(
					BaiduMapApplication.getInstance().getApplicationContext(),
					"BMapManager  初始化错误!", Toast.LENGTH_LONG).show();
		}
	}

	public static BaiduMapApplication getInstance() {
		return mInstance;
	}

	// 常用事件监听,用来处理通常的网络错误,授权验证错误等
	static class MyGeneralListener implements MKGeneralListener {

		@Override
		public void onGetNetworkState(int iError) {
			if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
				Toast.makeText(
						BaiduMapApplication.getInstance().getApplicationContext(),
						"您的网络出错啦!", Toast.LENGTH_LONG).show();
			} else if (iError == MKEvent.ERROR_NETWORK_DATA) {
				Toast.makeText(
						BaiduMapApplication.getInstance().getApplicationContext(),
						"输入正确的检索条件!", Toast.LENGTH_LONG).show();
			}
			// ...
		}

		@Override
		public void onGetPermissionState(int iError) {
			if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
				// 授权Key错误:
				Toast.makeText(
						BaiduMapApplication.getInstance().getApplicationContext(),
						"授权Key错误!", Toast.LENGTH_LONG).show();
				BaiduMapApplication.getInstance().m_bKeyRight = false;
			}
		}
	}
}

自定义了继承Appliction类,需要在AndroidManifest.xml添加支持:

 

这些工作做完,我们便可以真正的来实现我们的地图功能了。由于我是用Fragment效果来实现的,所以我必须先写一个继承FragmentActivity的类来管理Fragment,但在此之前,我们要先写界面:

主页面MainActivity:




    

        

            
        

        

            

                

                
            

            
            

            
        

        
    

接着,便是MainActivity类的内容。

注释都写得很清楚在里面了:

package com.BaiduMapDemo.Activity;

import java.util.ArrayList;
import com.BaiduMapDemo.adapter.MyPagerAdapter;
import com.example.baidumapdemo.R;
import android.os.Bundle;
import android.graphics.BitmapFactory;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends FragmentActivity implements OnClickListener {

	/**
	 * ViewPager是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。android-support-v4.jar
	 */
	private ViewPager mPager;// 页卡内容
	/**
	 * 动画图片
	 */
	private ImageView cursor;
	/**
	 * 页卡头标
	 */
	private TextView txt_Map, txt_Contact;
	/**
	 * tab头的宽度减去动画图片的宽度再除以2(保证动画图片相对tab头居中)
	 */
	private int offsetX;
	/**
	 * 当前页卡编号
	 */
	private int currIndex = 0;
	/**
	 * 每个tab头的宽度
	 */
	private int tabWidth;
	/**
	 * 动画图片宽度
	 */
	private int ivCursorWidth;
	private ArrayList fragmentsList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		InitViewPager();
		InitTextView();
		InitImageView();

	}

	/**
	 * 实例化ViewPager
	 */
	private void InitViewPager() {
		mPager = (ViewPager) findViewById(R.id.vPager);
		fragmentsList = new ArrayList();
		/**
		 * 默认加载左右各0个页面
		 */
		mPager.setOffscreenPageLimit(0);
		/**
		 * 添加两个页面
		 */
		Fragment BaiduMap = new BaiduMapActivity();
		Fragment Contact = new ContactActivity();
		fragmentsList.add(BaiduMap);
		fragmentsList.add(Contact);
		/**
		 * 将FragmentList绑定在ViewPager上
		 */
		mPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),
				fragmentsList));
		/**
		 * 设置默认在第一页
		 */
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
	}

	/**
	 * 实例化TextView
	 */
	private void InitTextView() {

		txt_Map = (TextView) findViewById(R.id.txt_Map);
		txt_Contact = (TextView) findViewById(R.id.txt_Contact);

		txt_Map.setOnClickListener(new MyOnClickListener(0));
		txt_Contact.setOnClickListener(new MyOnClickListener(1));

	}

	/**
	 * 实例化ImageView
	 */
	private void InitImageView() {
		cursor = (ImageView) findViewById(R.id.img_cursor);
		DisplayMetrics dm = getResources().getDisplayMetrics();
		/**
		 * 获取分辨率
		 */
		int screenW = dm.widthPixels;
		/**
		 * 获取图片宽度
		 */
		ivCursorWidth = BitmapFactory.decodeResource(getResources(),
				R.drawable.weizhan_cursor).getWidth();

		tabWidth = screenW / fragmentsList.size();
		if (ivCursorWidth > tabWidth) {
			cursor.getLayoutParams().width = tabWidth;
			ivCursorWidth = tabWidth;
		}
		offsetX = (tabWidth - ivCursorWidth) / 2;
	}

	/**
	 * 头标点击监听
	 */
	public class MyOnClickListener implements View.OnClickListener {
		private int index = 0;

		public MyOnClickListener(int i) {
			index = i;
		}

		@Override
		public void onClick(View v) {
			mPager.setCurrentItem(index);
		}
	};

	/**
	 * 页卡切换监听
	 */
	public class MyOnPageChangeListener implements OnPageChangeListener {

		@Override
		public void onPageSelected(int arg0) {
			/**
			 * 游标动画效果
			 */
			Animation animation = new TranslateAnimation(tabWidth * currIndex
					+ offsetX, tabWidth * arg0 + offsetX, 0, 0);
			currIndex = arg0;
			/**
			 * True:图片停在动画结束位置
			 */
			animation.setFillAfter(true);
			animation.setDuration(100);
			cursor.startAnimation(animation);
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		default:
			break;
		}
	}
}
Fragment效果其实很多人并不陌生,因为它很常用也很好用,不过主要还是为了照顾那些刚刚接触Android的新手,所以我把注释尽可能的写得清楚。

因为做的是Fragment效果,所以我添加了两个页面其中一个便是地图的页面,另一个其实是闲置的老样子,我们需要先实现界面。下面贴出BaiduMapActivity这个类的界面。

地图页面:




    

    

        

        

准备贴出代码的时候,猛然发现实现地图的类的内容写的比较多,代码太长,就不全部贴出来了,不过我会放出下载链接供大家下载参考。


我实现的是基本的导航功能,包含了公交、驾车、步行的各种交通策略。至于导航地点,我定了三个点,分别是天安门、东方明珠及广州塔。在这里给大家推荐个网站,非广告!http://www.gpsspg.com/maps.htm专门用于查询经纬度的。

贴一个行程策略的例子给大家看看:

/**
 * 行程策略。详见API com.baidu.mapapi.
 * search.MKSearch类
 */
strategy = MKSearch.EBUS_NO_SUBWAY;
start.pt = startPoint;
/**
 * 设置起点为地图中心点
 */
mMapController.setCenter(start.pt);
end.pt = endPoint;
mSearch.setTransitPolicy(strategy);
mSearch.transitSearch("广州",start, end);

MKSearch类里面,有根据不同行车策略给出不同的方案,只要调用相对于的函数就可以了。

确定了行程的策略,那就是路线问题了,要知道怎么去目的地,首先得知道自己的位置,及目的地的位置。自己的位置是用定位获得,目的地位置,在我这个Demo里面,是写死,提供选择的。这一点,各位可以根据自己的需求去更改。在这里得说一下,如果你选择的是公交车的行程方案的话


mSearch.transitSearch("广州",start, end);//城市名必须填写

我们看API,里面的这么说的:

API:

transitSearch

public int transitSearch(java.lang.String city, MKPlanNode start, MKPlanNode end)

公交路线搜索.

异步函数,返回结果在MKSearchListener里的onGetTransitRouteResult方法通知 参数: city - 城市名,用于在哪个城市内进行检索 start - 检索的起点,可通过关键字,坐标两种方式指定 end - 检索的终点,可通过关键字,坐标两种方式指定 返回: 成功返回0,否则返回-1 setTransitPolicy public int setTransitPolicy(int policy)

设置路线规划策略.

参数为策略常量。对下次搜索有效 参数: policy - EBUS_TIME_FIRST:时间优先;EBUS_TRANSFER_FIRST:少换乘;EBUS_WALK_FIRST:少步行;EBUS_NO_SUBWAY: 非地铁 返回: 成功返回0,否则返回-1


也就说,我们的起点与终点,必须在同一个城市才能使用公交车,那么这个城市的地点(java.lang.String city)其实我们可以根据定位信息来获取,百度地图的开发者平台上一个Demo,是专门讲定位的,大家可以自行去下载,参考。在这里,为了简便,我就自己填写了所在的城市,呵呵。



点我-下载源码

你可能感兴趣的:(Android例子)