我们先来看看我们需要哪些包:
这几个包都可以在百度地图API官网下载链接。
给一个百度地图API官网
package com.jzlg.excellentwifi.activity;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.jzlg.excellentwifi.R;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MapActivity extends BaseActivity {
private Context context;
private MapView mMapView;
private BaiduMap mbaiduMap;
// 定位相关
private LocationClient mLocationClient;
private MyLocationListener mLocationListener;
private boolean isFirstIn = true;
private double mLatitude;//纬度
private double mLongitude;//经度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要在setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.layout_map);
this.context = this;
// 初始化组件
initView();
// 初始化定位
initLocation();
}
// 定位初始化
private void initLocation() {
mLocationClient = new LocationClient(this);
// 定位监听器
mLocationListener = new MyLocationListener();
// 注册
mLocationClient.registerLocationListener(mLocationListener);
// 设置一些必要的配置
setLocationOption();
mLocationClient.start();
}
//定位设置
private void setLocationOption(){
LocationClientOption option = new LocationClientOption();
option.setCoorType("db09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setAddrType("all");//返回的定位结果包含地址信息
option.setIsNeedAddress(true);// 位置,一定要设置,否则后面得不到地址
option.setOpenGps(true);// 打开GPS
option.setScanSpan(10000);// 多长时间进行一次请求
option.setLocationMode(LocationMode.Battery_Saving);// 网络定位优先
mLocationClient.setLocOption(option);// 使用设置
}
private void initView() {
// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.map_bmapView);
mbaiduMap = mMapView.getMap();
// 设置地图放大缩小参数
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mbaiduMap.setMapStatus(msu);
}
// 菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_map, menu);
return true;
}
// 菜单点击方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// 普通
case R.id.map_common:
mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
// 卫星
case R.id.map_site:
mbaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
// 实时
case R.id.map_traffic:
// 是否显示了实时地图
if (mbaiduMap.isTrafficEnabled()) {
mbaiduMap.setTrafficEnabled(false);
item.setTitle("实时交通off");
} else {
mbaiduMap.setTrafficEnabled(true);
item.setTitle("实时交通on");
}
break;
case R.id.map_location:
centerToMyLocation();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
// 定位到我的位置
private void centerToMyLocation() {
LatLng latLng = new LatLng(mLatitude, mLongitude);
// 设置经纬度
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mbaiduMap.animateMapStatus(msu);
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mbaiduMap.setMyLocationEnabled(false);
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
@Override
protected void onResume() {
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
super.onResume();
}
@Override
protected void onStart() {
// 开启定位允许
mbaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted()) {
mLocationClient.start();
}
super.onStart();
}
@Override
protected void onStop() {
// 停止定位
mbaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
super.onStop();
}
@Override
protected void onPause() {
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
super.onPause();
}
private class MyLocationListener implements BDLocationListener {
// 定位成功之后的回调
@Override
public void onReceiveLocation(BDLocation location) {
MyLocationData data = new MyLocationData.Builder()// 经度
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
//设置我的定位
mbaiduMap.setMyLocationData(data);
//取出经纬度
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
//是否是第一次定位
if (isFirstIn) {
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
// 设置经纬度
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mbaiduMap.animateMapStatus(msu);
isFirstIn = false;
}
Toast.makeText(
context,
"定位成功:纬度" + location.getLatitude() + "经度:"
+ location.getLongitude() + "地址是:"
+ location.getAddrStr()+"城市是:"+location.getCity(), 0).show();
}
}
}
以上是Activity的代码,下面就是我们的布局文件了
我取名是:layout_map.xml
当然了,大家可以自己取名
<?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="match_parent" android:orientation="vertical" >
<com.baidu.mapapi.map.MapView android:id="@+id/map_bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
</LinearLayout>
那么说完了布局,我们来看看我们的清单文件AndroidManifest.xml是怎么写的,需要注意哪些事项,呈上我们的清单文件AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jzlg.excellentwifi" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14" />
<!-- 以下是使用wifi访问网络所需的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 使用百度地图所需的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<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.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<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" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="qkGCDjO9o5Ey62NINwYra7nS" />
<!-- 注册MapActivity -->
<activity android:name="com.jzlg.excellentwifi.activity.MapActivity" >
<!-- 设置主活动 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册LocationDemo -->
<activity android:name="com.jzlg.excellentwifi.activity.LocationDemo">
</activity>
<!-- 定位服务 -->
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" />
</intent-filter>
</service>
</application>
</manifest>
这里需要注意的是,wifi访问网络所需的权限和百度地图所需权限都需要,之所以我分了两个说明,但是需要全部写上,否则会定位失败!
y1笑而过的CSDN博客
y1笑而过的博客园
y1笑而过的新浪博客
y1笑而过的安卓巴士博客
y1笑而过的51CTO技术博客