解决用手机自带GPS获取经纬度location为空的问题

来源:互联网 发布:q learning算法介绍 编辑:程序博客网 时间:2024/04/30 12:06

获取经纬度这个功能在现在看来很常见!但是真正获取出来是不容易的!

我这两天有个功能需要用到经纬度,当时一开始想用手机自带的GPS定位获取经纬度,

但是遇到了问题:location为空!在网上各种查,各种忽悠小朋友的代码!最终还是没有解决!又看到一篇博客说用百度,(http://www.tuicool.com/articles/yINfaa)解决是解决了,但是我还是想用Locationmanager 的GPS解决,最终功夫不负有心人,发火大笑吐舌头偷笑


让我给解决了!


// 获取经纬度信息
private  LocationManager locationManager;  
    private String locationProvider;  
    private String locationStr;
    private LocationListener myLocationListener;
    private SharedPreferences sp;
public  void  getJingWeiDu(){
sp = getSharedPreferences("config", MODE_PRIVATE);
        //获取地理位置管理器  
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);  
        //获取所有可用的位置提供器  
        List<String> providers = locationManager.getProviders(true);  
    for (String string : providers) {
System.out.println(string+"4");
}
// 2.2获取最佳的定位方式
Criteria criteria = new Criteria();
// 设置可以定位海拔,true:表示可以定位海拔
criteria.setAltitudeRequired(true);// 只有gps可以定位海拔
// criteria : 设置定位属性
// enabledOnly : 如果定位可以就返回
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println("最佳的定位方式:" + bestProvider);
// 3.定位
myLocationListener = new MyLocationListener();
// provider : 定位方式
// minTime :定位的最小时间间隔
// minDistance : 最小的定位距离
// listener : LocationListener监听
locationManager.requestLocationUpdates(bestProvider, 0, 0,
new MyLocationListener());

}


// 4.创建一个定位的监听
private class MyLocationListener implements LocationListener {
// 定位位置发生变化的时候调用
// location : 当前的位置
@Override
public void onLocationChanged(Location location) {
// 5.获取经纬度
location.getAccuracy();// 获取精确的位置
location.getAltitude();// 获取海拔
double latitude = location.getLatitude();// 获取纬度,平行
double longitude = location.getLongitude();// 获取经度
 String locationStr = "纬度:" + latitude +"\n"   
                + "经度:" + longitude; 
 LogUtils.e("经纬度是:", locationStr);
 System.out.println("getJingWeiDu经纬度是:" + locationStr);
//保存经纬度坐标
Editor edit = sp.edit();
edit.putString("longitude", longitude+"");
edit.putString("latitude", latitude+"");
edit.commit();
// Timer timer = new Timer();
// //task : 定时执行的任务,
// //when:延迟的时间,延迟多长时间执行定时任务
// //period : 每次执行的间隔时间
// timer.schedule(task, when, 1000*60*30)
}


// 定位状态发生变化的时候调用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub


}


// 定位可用的时候调用
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub


}


// 定位不可用的时候调用
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub


}
}
    /** 
     * 显示地理位置经度和纬度信息 
     * @param location 
     */  
    public static String  showLocation(Location location){  
        String locationStr = "纬度:" + location.getLatitude() +"\n"   
                + "经度:" + location.getLongitude();  
        LogUtils.e("经纬度是:", locationStr);
        ToastBasic.showToast("经纬度是:" + locationStr);
        return locationStr;
    } 



这样你会发现  经纬度是出不来的,好多人说等一会坐标就会出来!我在公司阳台上坐了一下午(没敲代码)都没出来,都是瞎扯的!

为什么呢,你打个log  会看出来,因为location为空,或进不去这个方法onLocationChanged;为什么呢

网上各种答案!(都不行)


注意注意注意!

重点来了


我然后在写了个服务

GPSService(这个就是将上面的获取坐标的方法重新走了一遍),开启它,就可以获取到坐标了!

package com.hexun.fund.service.basic;


import java.util.List;
import java.util.Timer;


import com.hexun.fund.util.LogUtils;
import com.hexun.fund.util.ToastBasic;


import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;


public class GPSService extends Service {


// 位置的管理者
private LocationManager locationManager;
private MyLocationListener myLocationListener;
private SharedPreferences sp;


@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}


@Override
public void onCreate() {
super.onCreate();
sp = getSharedPreferences("config", MODE_PRIVATE);
// 1.获取位置的管理者
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// 2.获取定位方式
// 2.1获取所有的定位方式,true:返回可用的定位方式
List<String> providers = locationManager.getProviders(true);
for (String string : providers) {
System.out.println(string+"3");
}
// 2.2获取最佳的定位方式
Criteria criteria = new Criteria();
// 设置可以定位海拔,true:表示可以定位海拔
criteria.setAltitudeRequired(true);// 只有gps可以定位海拔
// criteria : 设置定位属性
// enabledOnly : 如果定位可以就返回
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println("GPSService 最佳的定位方式:" + bestProvider);
// 3.定位
myLocationListener = new MyLocationListener();
// provider : 定位方式
// minTime :定位的最小时间间隔
// minDistance : 最小的定位距离
// listener : LocationListener监听
locationManager.requestLocationUpdates(bestProvider, 0, 0,
new MyLocationListener());
}


// 4.创建一个定位的监听
private class MyLocationListener implements LocationListener {
// 定位位置发生变化的时候调用
// location : 当前的位置
@Override
public void onLocationChanged(Location location) {
System.out.println(location+"oooooooooooooooooo");
// 5.获取经纬度
location.getAccuracy();// 获取精确的位置
location.getAltitude();// 获取海拔
double latitude = location.getLatitude();// 获取纬度,平行
double longitude = location.getLongitude();// 获取经度
//保存经纬度坐标
Editor edit = sp.edit();
edit.putString("longitude", longitude+"");
edit.putString("latitude", latitude+"");
edit.commit();
// Timer timer = new Timer();
// //task : 定时执行的任务,
// //when:延迟的时间,延迟多长时间执行定时任务
// //period : 每次执行的间隔时间
// timer.schedule(task, when, 1000*60*30)
}


// 定位状态发生变化的时候调用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub


}


// 定位可用的时候调用
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub


}


// 定位不可用的时候调用
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub


}


}
@Override
public void onDestroy() {
super.onDestroy();
//5.取消定位
locationManager.removeUpdates(myLocationListener);//在高版本中已经无效了,因为高版本中规定必须由用户自己去打开和关闭gps
}


}





// //1.开启服务
Intent service_intent  = new Intent(Splash.this,GPSService.class);
startService(service_intent);

//2.1获取保存的经纬度坐标
String longitude = sp.getString("longitude", "");
String latitude = sp.getString("latitude", "");

// 获取经纬度
 String locationStr = "纬度:" + latitude +"\n"   
               + "经度:" + longitude; 
 LogUtils.e("经纬度是:", locationStr);
 System.out.println("GPSService经纬度是:" + locationStr);
 ToastBasic.popBaiscToast(Splash.this, locationStr, Toast.LENGTH_LONG);


说实话,我也具体不知道是什么原因,!以我的经验来讲第一次没获取的经纬度坐标值,但是location貌似有值了,不为空所以第二次获取就可以得到经纬度的值了!

等获取到值后就可以把服务关掉了!


看看哪位大神,帮忙说说为什么?

问题是解决了!但是不知道他真正的具体的过程!

谢谢大神们!




1 0
原创粉丝点击