博客为 有时个哥 原创,如需转载请标明出处: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