Android应用开发-------------百度地图的配置和使用

博客为 有时个哥 原创,如需转载请标明出处:http://blog.csdn.net/ls703/article/details/41345321

本人知道文采不行,有些事情用文字表达的不算清楚,但我还是要坚持写,不为别人,只为积累,以后回头看看自己也能想起。

 

1.百度地图的配置

首先要准备百度提供的sdk还有一个文件夹,如下图放在libs文件加下,之所以有两个架包是,一个是定位用的(locSdk),一个是地图(baidumap)。如果只需要定位的话那就

只用定位的包就可以。还有上面的两个so文件不要忘记也考进去。

然后就是在清单文件里配置。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mapdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
	<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" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:name="com.example.mapdemo.appl.MapApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
          <!-- 正式版bdmap key -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="BWm8Yvk6WAXfXs5B0mICtQC0" />
        <activity
            android:name="com.example.mapdemo.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>
        <activity android:name="com.example.mapdemo.activity.LocationActivity"></activity>
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
    </application>

</manifest>

百度的sdk涉及到很多权限,为了方便你就直接从官方demo里吧全有的权限拷到清单文件里就行了。在下面还有一个service不要忘记拷进去。

<service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>


这样初始配置就完成了。记下来就是在应用里开始初始化地图,也就是相当于启动sdk。一般这个实在application里做的。因为application是一个贯穿于整个生命周期的类,在应用启动的时候会自动启动。

package com.example.mapdemo.appl;

import android.app.Application;

import com.baidu.mapapi.SDKInitializer;

public class MapApplication extends Application {
 @Override
 public void onCreate() {
  super.onCreate();
  // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
  System.out.println("=========");
  SDKInitializer.initialize(this);
  
 }
}


不过要注意,一般应用使用的是默认的application。所以你必须在清单文件里改一下application的。上面的清单文件里已经有了。即

上面在application下加一个属性name,然后值为你写的继承application的子类。

下面是百度所需要的key值。每个key是和应用包名绑定的,所以开发时需要到百度那里自己申请key值。如果没有key可能会出现其他问题。我这边是地图显示不出来。获得不到定位的地址等等。

然后就是使用了。我在开发中通过看官方demo,整理了一个activity,给他传值,然后定位,获得当前坐标并在坐标上面显示图层,图层上有获得当前的地址。key值不对的话只能定位,显示地址的图层是不会显示的。下面是我的类的代码。

package com.example.mapdemo.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.example.mapdemo.R;
/******************************************************************************
 * 思路: 进入,分两种一个本人自己定位后发送, 一个是取得坐标之后定位别人的位置,
 * 只要有参数传入就是其他坐标惊醒定位 如果没有就默认自己当前位置定位
 ******************************************************************************/
public class LocationActivity extends Activity  {
	// this
	private LocationActivity INSTANCE;
	// 头部布局控件
	private Button btnBack;// 返回
	private TextView tvText;// 标题
	private TextView tvRight;// 发送

	// 百度地图
	private MapView mMapView;// 地图控件
	private BaiduMap mBaiduMap;// 百度地图操作对象
	private LocationClient mLocClient;// 定位
	public MyLocationListenner myListener = new MyLocationListenner();// 监听
	private boolean isFirstLoc = true;// 初次定位

	private LatLng llinfo;// 坐标
	private String address="";// 地址

	private GeoCoder mSearch;
	private MyLocationData locData;

	String type = TYPE_MYLOCATON;

	private Marker marker;
	private static final String TYPE_MYLOCATON = "MY";
	private static final String TYPE_FRLOCATON = "FR";
	BitmapDescriptor bdA = BitmapDescriptorFactory
			.fromResource(R.drawable.icon_lbs_free);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.chat_share_location);
		//1.接受上一页面传入的坐标
		Intent intent = getIntent();
		//2.坐标存在,则记录下当前坐标,并设置当前定位的类型
		if (intent.hasExtra("lat") && intent.hasExtra("lat")) {
			//2.1 当用intent参数时,设置中心点为指定点
			Bundle b = intent.getExtras();
			llinfo = new LatLng(b.getDouble("lat"), b.getDouble("lng"));
			type = TYPE_FRLOCATON;
		}
		// 3.初始化头布局
		initHeaderView();
		// 4.初始化地图,
		initMaps();

	}

	// 初始化头部布局
	private void initHeaderView() {
		System.out.println("type::"+type);
		btnBack = (Button) findViewById(R.id.btnBack);
		tvText = (TextView) findViewById(R.id.tvText);
		tvRight = (TextView) findViewById(R.id.tvRight);
		tvRight.setVisibility(View.GONE);
		if(type==TYPE_MYLOCATON){
			tvRight.setVisibility(View.VISIBLE);
		}
		tvText.setText("地图");
		btnBack.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		tvRight.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent=new Intent();  
	            intent.putExtra("lat", locData.latitude);  
	            intent.putExtra("lng", locData.longitude);  
	            intent.putExtra("addr", address);  
	            setResult(RESULT_OK, intent);  
	            finish(); 
				
			}
		});
		
	}


	private void initMaps() {
		mMapView = (MapView) findViewById(R.id.b_map);
		mBaiduMap = mMapView.getMap();
		// 开启定位图层
		mBaiduMap.setMyLocationEnabled(true);

		mSearch = GeoCoder.newInstance();
		mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {

			@Override
			public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
				if (result == null
						|| result.error != SearchResult.ERRORNO.NO_ERROR) {
					Toast.makeText(INSTANCE, "抱歉,未能找到结果", 1).show();
				} else {
					showAddress(marker, result.getAddress());
					address =  result.getAddress();
					System.out.println("address====="+address);
				}
			}

			@Override
			public void onGetGeoCodeResult(GeoCodeResult arg0) {

			}
		});
		// 定位初始化
		mLocClient = new LocationClient(this);
		mLocClient.registerLocationListener(myListener);
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 打开gps
		option.setCoorType("bd09ll"); // 设置坐标类型
		option.setScanSpan(5000);
		mLocClient.setLocOption(option);
		mLocClient.start();

	}

	/**
	 * 定位SDK监听函数
	 */
	public class MyLocationListenner implements BDLocationListener {
		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 销毁后不在处理新接收的位置
			if (location == null || mMapView == null)
				return;

			if (type == TYPE_MYLOCATON) {
				locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())
						// 此处设置开发者获取到的方向信息,顺时针0-360
						.direction(100).latitude(location.getLatitude())
						.longitude(location.getLongitude()).build();

			} else {
				locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())
						// 此处设置开发者获取到的方向信息,顺时针0-360
						.direction(100).latitude(llinfo.latitude)
						.longitude(llinfo.longitude).build();
			}
			setLocationShow(locData);
			// 显示覆盖图层
			initOverlay(locData);
			// 得到地址
			getAddressStr(locData);
			// // 显示地址
			 System.out.println("地址:::" + location.getAddrStr());
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}

	// 定位显示
	private void setLocationShow(MyLocationData locData) {
		mBaiduMap.setMyLocationData(locData);
		if (isFirstLoc) {
			isFirstLoc = false;
			LatLng ll = new LatLng(locData.latitude, locData.longitude);
			MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
			mBaiduMap.animateMapStatus(u);
		}
	}

	// 添加图层
	private void initOverlay(MyLocationData locData) {
		LatLng llInfo = new LatLng(locData.latitude, locData.longitude);
		OverlayOptions ooA = new MarkerOptions().position(llInfo).icon(bdA)
				.zIndex(9);
		marker = (Marker) (mBaiduMap.addOverlay(ooA));
	}

	// 显示地址,
	private void showAddress(Marker marker, String address) {
		TextView view = new TextView(getApplicationContext());
		view.setBackgroundResource(R.drawable.bg_locationinfo);
		view.setText(address);
		view.setGravity(Gravity.CENTER);

		final LatLng ll = marker.getPosition();
		Point p = mBaiduMap.getProjection().toScreenLocation(ll);
		p.y -= 47;
		LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
		InfoWindow mInfoWindow = new InfoWindow(view, llInfo, null);
		mBaiduMap.showInfoWindow(mInfoWindow);
	}

	// 得到地址
	private void getAddressStr(MyLocationData locData) {
		LatLng ptCenter = new LatLng(locData.latitude, locData.longitude);
		// 反Geo搜索
		mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
	}

	/*************************************************************************/
	@Override
	protected void onPause() {
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onResume() {
		mMapView.onResume();
		super.onResume();
	}

	@Override
	protected void onDestroy() {
		// 退出时销毁定位
		mLocClient.stop();
		mSearch.destroy();
		// 关闭定位图层
		mBaiduMap.setMyLocationEnabled(false);
		mMapView.onDestroy();
		mMapView = null;
		bdA.recycle();
		super.onDestroy();
	}

}


下面是Demo的源码:

http://download.csdn.net/detail/ls703/8183051


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值