Android获取当前位置,location为空
2014-03-06 15:01
866 查看
通过最后一次的地理位置来获得Location对象:location = locationManager.getLastKnownLocation(provider);得出location为空。查看各种资料发现,getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,不可能一次就能获取,那唯有location为空的时候继续获取,采用locationManager.requestLocationUpdates("gps",
60000, 1, locationListener); 这样解决了问题,贴出整合修改的代码。
60000, 1, locationListener); 这样解决了问题,贴出整合修改的代码。
package com.belle.tools; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.List; import android.content.Context; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class LocationUtils { public String cityName; // 此对象能通过经纬度来获取相应的城市等信息 private Geocoder geocoder; private LocationManager locationManager; private String provider; private Location location; private Context context; /* * 通过地理坐标获取城市名 其中CN分别是city和name的首字母缩写 */ public String getCNBylocation(Context context) { geocoder = new Geocoder(context); String serviceName = Context.LOCATION_SERVICE; // 实例化一个LocationManager对象 locationManager = (LocationManager) context.getSystemService(serviceName); // provider的类型 // String provider = LocationManager.NETWORK_PROVIDER; getProvider(); //openGPS(); // 通过最后一次的地理位置来获得Location对象 location = locationManager.getLastKnownLocation(provider); if(location == null){ locationManager.requestLocationUpdates("gps", 60000, 1, locationListener); } String queryed_name = updateWithNewLocation(location); if ((queryed_name != null) && (0 != queryed_name.length())) { cityName = queryed_name; } /** * 第二个参数表示更新的周期,单位为毫秒;第三个参数表示最小距离间隔,单位是米 设定每30秒进行一次自动定位 */ locationManager.requestLocationUpdates(provider, 30000, 50, locationListener); return cityName; } /** * 方位改变时触发,进行调用 */ private final LocationListener locationListener = new LocationListener() { String tempCityName; public void onLocationChanged(Location location) { tempCityName = updateWithNewLocation(location); if ((tempCityName != null) && (tempCityName.length() != 0)) { cityName = tempCityName; } } public void onProviderDisabled(String provider) { tempCityName = updateWithNewLocation(null); if ((tempCityName != null) && (tempCityName.length() != 0)) { cityName = tempCityName; } } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }; /** * 更新location */ private String updateWithNewLocation(Location location1) { String mcityName = ""; double lat = 0; double lng = 0; List<Address> addList = null; if (location1 != null) { lat = location1.getLatitude(); lng = location1.getLongitude(); } else { System.out.println("无法获取地理信息"); } try { addList = geocoder.getFromLocation(lat, lng, 1); } catch (IOException e) { e.printStackTrace(); } if (addList != null && addList.size() > 0) { for (int i = 0; i < addList.size(); i++) { Address add = addList.get(i); mcityName += add.getLocality(); } } if (mcityName.length() != 0) { return mcityName.substring(0, (mcityName.length() - 1)); } else { return mcityName; } } /** * 通过经纬度获取地址信息的另一种方法 */ public String GetAddr(String latitude, String longitude) { String addr = ""; /* * 也可以是http://maps.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s, * 不过解析出来的是英文地址 密钥可以随便写一个key=abc * output=csv,也可以是xml或json,不过使用csv返回的数据最简洁方便解析 */ String url = String.format( "http://maps.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s", latitude, longitude); URL myURL = null; URLConnection httpsConn = null; try { myURL = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); return null; } try { httpsConn = (URLConnection) myURL.openConnection(); if (httpsConn != null) { InputStreamReader insr = new InputStreamReader( httpsConn.getInputStream(), "UTF-8"); BufferedReader br = new BufferedReader(insr); String data = null; if ((data = br.readLine()) != null) { String[] retList = data.split(","); if (retList.length > 2 && ("200".equals(retList[0]))) { addr = retList[2]; } else { addr = ""; } } insr.close(); } } catch (IOException e) { e.printStackTrace(); return null; } return addr; } private void openGPS() { if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER) ){ Toast.makeText(context, " 位置源已设置! ", Toast.LENGTH_SHORT).show(); return; } Toast.makeText(context, " 位置源未设置!", Toast.LENGTH_SHORT).show(); } private void getProvider() { // TODO Auto-generated method stub // 构建位置查询条件 Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); //高精度 criteria.setAltitudeRequired(false); //不查询海拔 criteria.setBearingRequired(false); //不查询方位 criteria.setCostAllowed(true); //不允许付费 criteria.setPowerRequirement(Criteria.POWER_LOW); //低耗 // 返回最合适的符合条件的 provider ,第 2 个参数为 true 说明 , 如果只有一个 provider 是有效的 , 则返回当前 provider provider = locationManager.getBestProvider(criteria, true); } }
相关文章推荐
- 一起学android之底部菜单TabHost的实现(9)
- 【Android自动化测试之Robotium】04. 命令行运行Android Robotium自动化用例或单元测试用例
- Android4.2 G-Sensor工作流程
- 【Android自动化测试之Robotium】03. 当只有一个APK的时候使用robotium进行自动化测试
- Ubuntu 下小米手机驱动
- 【Android自动化测试之Robotium】02. Robotium之用例分析
- android硬件加速android:hardwareAccelerated
- Android4.4 全屏幕模式,沉浸模式 & 在应用内开启透明状态栏和透明虚拟按钮
- 【Android自动化测试之Robotium】01. Robotium环境配置
- android中Camera setDisplayOrientation使用
- Android 4.2 原生系统有哪些方法实现全屏下隐藏导航栏?
- Android的onCreateOptionsMenu()创建菜单Menu详解
- Android学习笔记_59_清除sdcard缓存
- Android Developers:传感器概述
- 【转】android适配各种分辨率的问题
- android开发教程之开机启动服务service示例
- MTK android编译命令
- Android将程序崩溃信息保存本地文件
- Android学习笔记_58_清除手机应用程序缓存
- 【Android】declare-styleable:自定义控件的属性