工程架包目录如图片所示
百度地图定位的实现
1.要用百度地图定位,那么无可争议我们需要导入百度地图的架包
2.同时我们还需要注册百度开发者帐号
3.我们还要用自己的sha1值和包名生成我们的apkey值
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="mG20b0N3APQeuY0NX8ZUn11x3rP7u3nM" />
网络权限的设置
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_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.INTERNET" />
百度地图的service
如果没有设置百度地图的service,则拿不到数据
<application>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
</application>
以上就是我们在开始之前的准备工作
接下来我们就开始实现定位的代码逻辑部分
首先我们自定义一个MpApppplication继承自application
,我们想在这里实现百度地图的初始化,在刚启动应用的时候就初始化百度地图,因为Application是一个生命周期最长的活动
代码逻辑如下
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(this);
}
- 写一个location的类
- 写一个主activity的类
- 在location中实现定位,把位置信息发送到主activity中显示
接下来就实现上面的三步
第一步:location类
public class LocationDemo extends Activity {
// 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
MapView mMapView;
BaiduMap mBaiduMap;
boolean isFirstLoc = true; // 是否首次定位
BDLocation location;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.location);
// 地图初始化
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
option.setAddrType("all");//此处必须设置全部为all,要不然得不到具体的位置,发送的时候位置信息为空
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;
}
LocationDemo.this.location = location;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
public void sendMessage(View v){
if (location == null || mMapView == null) {
return;
}
Intent intent = new Intent();
intent.putExtra("getLatitude",location.getLatitude()+"");
intent.putExtra("getLongitude",location.getLongitude()+"");
intent.putExtra("getAddress",location.getAddrStr());
setResult(RESULT_OK,intent);
finish();
}
}
//location的布局文件如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/send"
android:onClick="sendMessage"
android:text="发送位置"
/>
</RelativeLayout>
第二步主activity类的编写和实现
public class MainActivity extends Activity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(new Intent(MainActivity.this,LocationDemo.class),0);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
btn.setText(data.getStringExtra("getLatitude")+"\n"+data.getStringExtra("getLongitude")+"\n"+data.getStringExtra("getAddress"));
}
}
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</RelativeLayout>
在这个定位的过程中,遇到以下几个问题
1.定位不准定位到非洲,不知道为什么
2.发送位置信息的时候,总还是为空
第一个问题没有解决掉,模拟器上面很多的时候都是定位到非洲
第二个问题已经解决就是在设置属性的时候
option.setAddrType(“all”);//此处必须设置全部为all,要不然得不到具体的位置,发送的时候位置信息为空
总体上还算很顺利,就遇到这两个问题,其它一切ok