• Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/yanglfree/article/details/33333413

    一、概述

    最新版的百度地图SDK3.0,改动了非常多方法,之前的非常多方法被简化了,正好在做地图这一块,顺便就使用了最新版的sdk。

    下载官方给的demo,发现变化还是挺大的,之前的一些方法都换了,地图的初始化也进行了调整。多了好几个类,具体使用方法參考以下的样例。具体的说明可參照官方的说明文档。

    二、效果图

    标注覆盖物效果图:


    弹出窗覆盖物:


    三、实现过程

    大部分是依据官方给的demo来的。

    A、配置文件:

     第一步:在project里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar复制到libs根文件夹下。将libBaiduMapSDK_vX_X_X.so复制到libsarmeabi文件夹下(官网demo里已有这两个文件,假设要集成到自己的project里,就须要自己加入)。拷贝完毕后的project文件夹例如以下图所看到的。

        注:liblocSDK3.so和locSDK_3.1.jar为百度定位SDK所使用资源,开发人员可依据实际需求自行加入。

    andorid_dev1.png

        第二步:在project属性->Java Build Path->Libraries中选择“Add External JARs”。选定baidumapapi_vX_X_X.jar,确定后返回。

        通过以上两步操作后,您就能够正常使用百度地图SDK为您提供的所有功能了。

    注意:因为adt插件升级,若您使用Eclipse adt 22的话。须要对开发环境进行对应的设置,方法例如以下:

    1. 在Eclipse 中选中project,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态。

    2. Project -> clean-> clean all .

    B、在AndroidManifest中加入开发密钥、所需权限等信息;

    <application
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="开发人员 key" />
    </application>
    

    C、加入一些对应的权限

    <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" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <ses-permission android:name="android.permission.READ_PHONE_STATE" />
    


    D、在布局文件里,加入百度地图的自己定义控件

      <com.baidu.mapapi.map.MapView
            android:id="@id/mapview_baidu_address"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

    E、在应用程序创建时初始化 SDK引用的Context 全局变量

    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); 
            //在使用SDK各组件之前初始化context信息。传入ApplicationContext
            //注意该方法要再setContentView方法之前实现
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.activity_main);
        }
    }
    

    注意:在SDK各功能组件使用之前都须要调用

    SDKInitializer.initialize(getApplicationContext());。因此我们建议该方法放在Application的初始化方法中

    F、创建地图Activity 

    不同之前的版本号。3.0版的sdk中,mapview对象须要先获取BaiduMap对象才干由BaiduMap对象进行兴许的加入覆盖物的操作。

    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	setContentView(R.layout.d1_activity_address);
    	super.onCreate(savedInstanceState);
    	mMapView = (MapView) findViewById(R.id.mapview_baidu_address);
    	mBaiduMap = mMapView.getMap();//获取BaiduMap类 BaiduMap类才干够加入自己定义的图层
    	MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);//设置地图的缩放比例
    	mBaiduMap.setMapStatus(msu);//将前面的參数交给BaiduMap类
    	
    	initOverLay(latitude, longitude);// 绘制图层
    	showPop();// 弹出popup
    }

    管理地图生命周期

    	@Override
    	protected void onPause() {
    		// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		mMapView.onPause();
    		super.onPause();
    	}
    
    	@Override
    	protected void onResume() {
    		// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
    		mMapView.onResume();
    		super.onResume();
    	}
    
    	 @Override
    	 protected void onDestroy() {
    	 // MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
    	 mLocClient.stop();
    	 // 关闭定位图层
    	 mBaiduMap.setMyLocationEnabled(false);
    	 if (mMapView!=null) {
    	 mMapView.onDestroy();
    	 mMapView = null;
    	 }
    	 // 回收 bitmap 资源
    	 bitmap.recycle();
    	 }

    当中绘制覆盖物,也就是图层的方法代码例如以下:

    LatLng这个类 官方文档的说明是:地理坐标基本数据结构

    	public void initOverLay(double latitude, double longitude) {
    		// 定义Maker坐标点
    		LatLng ll = new LatLng(latitude, longitude);
    		// 构建Marker图标
    		BitmapDescriptor bd1 = BitmapDescriptorFactory
    				.fromResource(R.drawable.pin_green);
    		// 构建MarkerOption,用于在地图上加入Marker
    		OverlayOptions option = new MarkerOptions().position(ll).icon(bd1);
    		// 在地图上加入Marker,并显示
    		mBaiduMap.addOverlay(option);//加入当前分店信息图层
    		MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
    		mBaiduMap.setMapStatus(u);
    	}

    弹出窗覆盖物  点击覆盖物。弹出导航选择列表

    	public void showPop() {
    		// 创建InfoWindow展示的view
    		View popup = View.inflate(this, R.layout.pop, null);
    		TextView title = (TextView) popup.findViewById(R.id.tv_title);
    		TextView content = (TextView) popup.findViewById(R.id.tv_content);
    		title.setText(name);
    		content.setText(addr);
    
    		// 定义用于显示该InfoWindow的坐标点
    		LatLng pt = new LatLng(latitude, longitude);
    //		Point p = mBaiduMap.getProjection().toScreenLocation(pt);
    		// 创建InfoWindow的点击事件监听者
    		OnInfoWindowClickListener listener = new OnInfoWindowClickListener() {
    			public void onInfoWindowClick() {
    				// 加入点击后的事件响应代码
    				Uri uri = Uri.parse("geo:" + latitude + "," + longitude + "");
    				Intent it = new Intent(Intent.ACTION_VIEW, uri);
    				startActivity(it);
    			}
    		};
    		// 创建InfoWindow
    		InfoWindow mInfoWindow = new InfoWindow(popup, pt, listener);
    		// 显示InfoWindow
    		mBaiduMap.showInfoWindow(mInfoWindow);
    	}


    弹出框pop布局

    <?xml version="1.0" encoding="utf-8"?

    > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/ic_map_marker" > <LinearLayout android:id="@+id/ll_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:layout_marginTop="10dip" android:orientation="vertical" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:ellipsize="end" /> <TextView android:id="@+id/tv_content" android:layout_width="300dip" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:ellipsize="end" android:textColor="@color/black" android:textSize="12sp" /> </LinearLayout> <!-- <ImageView android:id="@+id/iv_navi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dip" android:layout_toRightOf="@+id/ll_text" android:background="@drawable/ic_arrow_right" /> --> </LinearLayout>




    四、总结

    利用百度地图sdk开发的几个步骤:

    1、导入jar包和so文件

    2、布局文件里加入百度地图控件。manifest清单文件里,加入响应的权限,application节点下加入key

    3、主activity中setContentView之前加入SDKInitializer.initialize(getApplicationContext());进行初始化

    4、得到地图mapView对象。然后进行其它操作


    5、生成覆盖物(见上面的代码)


    6、生成弹出窗覆盖物 (见上面的代码)


    转载请注明出处  http://blog.csdn.net/csr_yang/article/details/33333413

    
  • 相关阅读:
    还不知道spring的RestTemplate的妙用吗
    【学习笔记】机器学习之特征工程
    《饥饿的盛世》总结
    我是如何解决java.security.cert.CertPathValidatorException异常的
    《机器学习
    2018年总结
    元类实现ORM
    元类
    python中的装饰器
    python中的闭包
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10745987.html
  • Copyright © 2020-2023  润新知