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

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

我这两天有个功能需要用到经纬度,当时一开始想用手机自带的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貌似有值了,不为空所以第二次获取就可以得到经纬度的值了!

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

 

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

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

谢谢大神们!

 

已解决问题,是因为室内没有GPS信号,所以定位不到,我这边昨天和以为码友一起研究,然后带上手机去室外,一会功夫就可以定位到信息了。

有问题可随时联系,QQ  : 1136346879

 

 

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要定时获取Android自GPS信息,首先需要使用Android开发工具,如Android Studio进行开发。以下是实现的步骤: 1. 添加权限:在AndroidManifest.xml文件中,添加ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION权限,以获取GPS信息。 2. 设置定位请求:使用LocationManager类,创建一个LocationManager对象,并调用requestLocationUpdates()方法,设置定位请求。传入的参数包括GPS_PROVIDER(GPS定位提供者)、最小时间和最小距离。最小时间是指设定两次定位之间的最小时间间隔,最小距离是指设定两次定位之间的最小距离间隔。 3. 实现LocationListener接口:创建一个名为MyLocationListener的类,实现LocationListener接口,并重写onLocationChanged()方法。在这个方法里,你可以获取并处理定位信息。在需要的属性中,可以访问经度、纬度、车速等。 4. 启动GPS定位:在你的应用程序中,实例化LocationManager对象,并将其与MyLocationListener对象进行关联。然后,调用LocationManager的requestLocationUpdates()方法以启动GPS定位。 5. 在MyLocationListener接口中,你可以在onLocationChanged()方法中处理获取到的信息。例如,你可以将经度、纬度、车速等数据存储在变量中,以便在其他地方使用。 6. 在需要的时候,通过访问已存储的变量来获取GPS信息。可以根据需要将这些信息展示在界面上或者进行其他处理操作。 需要注意的是,为了提高精确度和准确度,可以在代码中设置相关参数,例如最小时间和最小距离。定时处理定位信息时,要注意内存和电池使用情况,可以合理调整参数以平衡精确度和资源消耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值