百度定位SDK5.0用法
导入库文件
在相关下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中(我只把所有的文件复制到lib文件夹下,即拷贝到libs目录下,如下图所示),建议全部放入,程序兼容性会大大提升,将locSDK_5.0.jar文件拷贝到工程的libs目录下(注意需要在项目属性的java Build Path中加入),这样您就可以在程序中使用百度定位SDK了。
设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
声明使用权限
<!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET" /> <!—SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <!--允许应用读取低级别的系统日志文件 --> <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
导入相关类就不说了,Eclipse到时候会自动帮我们导入
设置AcessKey
使用SDK5.0需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入(具体需要安全码组成:数字签名+;+包名,数字签名在window--preference--Android----Build下的SHA1 fingerprint;包名就不说了)
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="key" />//key:开发者申请的key
完整的Mamifest.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.baidusdk" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" > </uses-permission> <uses-permission android:name="android.permission.READ_LOGS" > </uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".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> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="YI2f1rlaXdxEGFnzuKALtglP" /> </application> </manifest>
相关的功能函数,参见官方文档,下面贴代码
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-05-04 08:35:30*******************************************************************************************************************************************
最近简单的封装了下,上面的百度定位使用方法:
BaiduSDK.java (PS:属性中我只设置了经纬度信息的获取,其他的比如地址什么的,可以参考修改下)
package com.example.baidusdk; import android.content.Context; 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; public class BaiduSDK { private double longitude,latitude; public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } private LocationClient mLocationClient; public BDLocationListener myListener = new MyLocationListener(); // public BaiduSDK(LocationClient mLocationClient) { // super(); // this.mLocationClient = mLocationClient; // } public BaiduSDK() { super(); // TODO Auto-generated constructor stub } public void setup(Context context) { mLocationClient = new LocationClient(context); mLocationClient.setLocOption(setUp());// 设置定位条件 mLocationClient.registerLocationListener( myListener ); } public void sendRequest() { if (mLocationClient == null) { return; } if (mLocationClient.isStarted()) { mLocationClient.stop(); }else { mLocationClient.start(); mLocationClient.requestLocation(); } } public void unRegisterLocationListener() { if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.unRegisterLocationListener(myListener);//取消监听函数 mLocationClient.stop(); mLocationClient =null; } } 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; } public class MyLocationListener implements BDLocationListener {// 实现BDLocationListener接口 @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub if (location == null) return; setLatitude(location.getLatitude());// 获取维度 setLongitude(location.getLongitude());// 获取经度 // System.out.println(getLatitude()+"维度-----经度"+getLongitude()); } } }
简单的使用:
package com.example.baidusdk; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class Test extends Activity { TextView textView; BaiduSDK baiduLocation; Button button, checkButton; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.test); textView = (TextView) findViewById(R.id.textView1); button = (Button) findViewById(R.id.button1); checkButton = (Button) findViewById(R.id.button2); baiduLocation = new BaiduSDK();//实例化类 baiduLocation.setup(this); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub baiduLocation.sendRequest();//发送定位请求 } }); checkButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub System.out.println(baiduLocation.getLatitude() + "<--1--->" + baiduLocation.getLongitude()); } }); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); baiduLocation.unRegisterLocationListener(); } }
**************************************************************************************************************************************************************************************************************************************************************************************
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);