公司项目有用到百度地图,登录的时候需要定位一次,获取登录的地址信息,在手机无法连接外网的情况,也就无法访问百度定位服务器的时候,定位的回调函数要30秒以上才能返回结果,于是去仔细查百度api,发现没有设置回调函数时间的方法或者属性.
解决办法就是把回调函数参数赋值给实例变量
/**
* 实现实位回调监听,如果访问百度定位服务器成功就会把结果赋值给location
* 否则这个location为null
*/
public class mylocationlistener implements bdlocationlistener {
@override
public void onreceivelocation(bdlocation db) {
location=db;
}
}
开启一个延时2.5秒的线程,在线程中判断回调函数有没有调用......如果手机能连接外网并且能成功访问百度服务器的话,2秒左右能返回结果
//延迟2.5秒执行locationresult()
//正常情况下访问百度定位服务器只需要2秒
new handler().postdelayed(new runnable() {
public void run() {
if(null==location){//为空表示百度sdk定位失败
}else{//定位成功
}
}, 2500);
完整代码如下:
package com.baidu.baidulocationdemo;
import com.baidu.location.bdlocation;
import com.baidu.location.bdlocationlistener;
import com.baidu.location.locationclient;
import com.baidu.location.locationclientoption;
import android.os.bundle;
import android.os.handler;
import android.app.activity;
import android.util.log;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.textview;
public class mainactivity extends activity {
public locationclient locationclient;
private bdlocation location;
private textview mlocationresult;
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
mlocationresult=(textview) findviewbyid(r.id.location_result);
findviewbyid(r.id.start_location).setonclicklistener(clicklistener);
findviewbyid(r.id.stop_location).setonclicklistener(clicklistener);
locationclientoption option = new locationclientoption();
option.setcoortype("bd09ll");//设置坐标类型
locationclient = new locationclient(this);
locationclient.registerlocationlistener(new mylocationlistener());
locationclient.setlocoption(option);
private onclicklistener clicklistener=new onclicklistener(){
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.start_location:
locationclient.start();
//延迟2.5秒执行locationresult()
//正常情况下访问百度定位服务器只需要2秒
new handler().postdelayed(new runnable() {
@override
public void run() {
locationresult();
}
}, 2500);
break;
case r.id.stop_location:
distory();
}
};
/**
* 实现实位回调监听,如果访问百度定位服务器成功就会把结果赋值给location
* 否则这个location为null
*/
public class mylocationlistener implements bdlocationlistener {
public void onreceivelocation(bdlocation db) {
location=db;
private void locationresult(){
location=new bdlocation();
//receive location
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 (mlocationresult != null)
mlocationresult.settext(sb.tostring());
log.i("baidulocationapidem", sb.tostring());
distory();
private void distory(){//关闭定位
if (locationclient != null && locationclient.isstarted()) {
locationclient.stop();
}
效果图如下:
推荐下自己创建的android qq群:202928390 欢迎大家的加入.