导入库文件
在相关下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中(我值把所有的文件复制到lib文件夹下),建议全部放入,程序兼容性会大大提升,将locSDK_5.0.jar文件拷贝到工程的libs目录下(注意需要在项目属性的java Build Path中加入),这样您就可以在程序中使用百度定位SDK了。
设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
声明使用权限
设置AcessKey
使用SDK5.0需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入(具体需要安全码组成:数字签名+;+包名,数字签名在window--preference--Build下SHA1 fingerprint;包名就不说了)
MainActivity.java
package com.example.servicedemo;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
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该类
//如果使用地理围栏功能,需要import如下类
public class MainActivity extends Activity {
Button sendButton;
MsgReceiver msgReceiver;
TextView resultView;
public static final String MY_RECEIVER = "com.example.servicedemo.MyService";
/**
* 测试百度定位
*/
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendButton = (Button) findViewById(R.id.button1);
resultView = (TextView)findViewById(R.id.textView1);
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method
// Intent intent = new Intent(MY_RECEIVER);//启动服务
// startService(intent);
//启动定位
if (mLocationClient == null) {
return;
}
if (mLocationClient.isStarted()) {
mLocationClient.stop();
}else {
mLocationClient.start();
mLocationClient.requestLocation();
}
}
});
mLocationClient = new LocationClient(getApplicationContext()); //声明Location
mLocationClient.setLocOption(setUp());//设置定位条件
mLocationClient.registerLocationListener( myListener ); //注册定位监听函数
msgReceiver = new MsgReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.servicedemo.LOCATION");//过滤器
registerReceiver(msgReceiver, intentFilter);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
// Intent intent = new Intent(MY_RECEIVER);//启动服务
// stopService(intent);
// unregisterReceiver(msgReceiver);
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.unRegisterLocationListener(myListener);//取消监听函数
mLocationClient.stop();
mLocationClient =null;
}
super.onDestroy();
}
public class MyLocationListener implements BDLocationListener{//实现BDLocationListener接口
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
if (location == null)
return ;
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());//获取维度
sb.append("\nlontitude : ");
sb.append(location.getLongitude());//获取经度
sb.append("\nradius : ");
sb.append(location.getRadius());//获取定位精度半径,单位是米
if (location.getLocType() == BDLocation.TypeGpsLocation){//获取error code
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
System.out.println(sb.toString());
resultView.setText(sb.toString());
}
}
/**
* 定位参数设置
*/
public LocationClientOption setUp() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
return option;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class MsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// 拿到进度,更新UI
int progress = intent.getIntExtra("progress", 0);
System.out.println(progress);
}
}
}
本来想弄个service的,但是看看开发文档,貌似已经在service中运行了,所以反而觉得没有必要了,不过开始写了就贴下吧,好得也可以复习下Activity和Service之间通过广播通信是咧(注意MainActivity.java中注释的部分):
MyService.java
package com.example.servicedemo;
import com.baidu.location.LocationClient;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
/**
* 进度条的最大值
*/
public static final int MAX_PROGRESS = 100;
/**
* 进度条的进度值
*/
private int progress = 0;
private Intent intent = new Intent("com.example.servicedemo.LOCATION");
/**
* 模拟下载任务,每秒钟更新一次
*/
public void startDownLoad() {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (progress < MAX_PROGRESS) {
progress += 5;
// 发送Action为com.example.communication.LOCATION的广播
intent.putExtra("progress", progress);
sendBroadcast(intent);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onstart service_binder");
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
startDownLoad();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
来张效果图:呵呵,定位效果很快,不想调用系统自带的有时候返回null的结果!
2015年4月7日星期二 更新下,在地图中标记显示的定位信息
用的是百度地图SDK:
工程配置
第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;
第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:
1. 在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;
2. Project -> clean-> clean all .
显示百度地图
百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:
第一步:创建并配置工程(具体方法参见工程配置部分的介绍);
第二步:在AndroidManifest中添加开发密钥、所需权限等信息;
(1)在application中添加开发密钥
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
2)添加所需权限
<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" />
第三步,在布局xml文件中添加地图控件;
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
第四步,在应用程序创建时初始化 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的初始化方法中
第五步,创建地图Activity,管理地图生命周期;
public class MainActivity extends Activity {
MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
完成以上步骤后,运行程序,即可在您的应用中显示如下地图,标记的话参考开发者可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息
//定义Maker坐标点
LatLng point = new LatLng(39.963175, 116.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);

LatLng ll = new LatLng(32.205364, 119.524887);//自定义开始的位置
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.setMapStatus(u);