解决用手机自带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貌似有值了,不为空所以第二次获取就可以得到经纬度的值了!
等获取到值后就可以把服务关掉了!
看看哪位大神,帮忙说说为什么?
问题是解决了!但是不知道他真正的具体的过程!
谢谢大神们!
- 解决用手机自带GPS获取经纬度location为空的问题
- 用手机gps定位获得准确的百度地图经纬度
- android:GPS获取location经纬度并用谷歌解析为地理位置名称
- Android 解决GPS室内定位问题(location为null)
- GPS经纬度及谷歌地图坐标转换为百度地图坐标,解决地图显示经纬度的偏移问题
- location.getAddrStr()为空的问题
- 作百度地图定位时,location.getAddrStr()获取到的值一直为空的问题
- 解决调用系统自带摄像头录像时从uri里面拿到的路径为空
- 使用phonegap自带的功能获取本地gps信息
- android 自带gps定位Location相关知识
- 利用手机的GPS获取经纬度
- Android获取当前位置,location为空
- Android获取GPS经纬度
- Unity3d获取GPS 经纬度
- Unity获取经纬度(GPS)
- gps获取经纬度
- GPS 定义获取经纬度
- 使用Gps获取经纬度
- HttpURLConnection:POST和GET 网络请求
- Asterisk拨号方案语法基础
- hadoop的HDFS文件存储
- 苹果Xcode帮助文档阅读指南
- Android AIDL 进程间通信详解
- 解决用手机自带GPS获取经纬度location为空的问题
- opencv安装路径出错
- spring IoC和AOP的原理
- 牛顿法
- CVE-2015-3636
- 一步一步实现iOS微信自动抢红包(非越狱)
- 数据库(二)读写分离
- HT Capability Info 字段的意义
- 前端请求m3u8