Android获取当前位置,location为空
16lz
2021-01-26
通过最后一次的地理位置来获得Location对象:location = locationManager.getLastKnownLocation(provider);得出location为空。查看各种资料发现,getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,不可能一次就能获取,那唯有location为空的时候继续获取,采用locationManager.requestLocationUpdates("gps", 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 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); } }
更多相关文章
- 深入浅出RxJava1(四:在Android中使用响应式编程)
- Android(安卓)Volley使用之二:Volley请求网络图片
- 获取高德key
- Android之GridView视图实现
- android paint画笔 设置透明度setAlpha及 canvas画布
- Android获取View的内容图片
- [置顶] Android(安卓)fragment 获取id,findViewById为空
- android Listview 获取任意指定item数据 getChildAt 挂起 解决办
- android选择一张本机图片