`
喧嚣求静
  • 浏览: 580791 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android location 位置定位

 
阅读更多
实现功能:定位当前位置并显示详细信息,扩展了googleMap地图

package com.ld.gps;

import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
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.provider.Settings;
import android.widget.TextView;
import android.widget.Toast;

public class AppLocationGpsActivity extends Activity {

	private static final int TWO_MINUTES = 1000 * 60 * 2;
	private LocationManager locationManager;

	private String providerName;

	private Location currentBestLocation;

	private Location location;
	
	private Address address;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 获取 LocationManager 服务

		locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

		// 获取 Location Provider

		providerName=getProviderName();

		// 如果未设置位置源,打开 GPS 设置界面

		openGPS();

		// 获取位置

		currentBestLocation= locationManager.getLastKnownLocation(providerName);
		
		location=new Location(LocationManager.GPS_PROVIDER);
		
		if(isBetterLocation(location,currentBestLocation)){
			// 显示位置信息到文字标签

			updateWithNewLocation(location);
			providerName=location.getProvider();

		}else{
			// 显示位置信息到文字标签

			updateWithNewLocation(currentBestLocation);

		}
			
		
		// 注册监听器 locationListener ,第 2 、 3 个参数可以控制接收 gps 消息的频度以节省电力。第 2 个参数为毫秒,

		// 表示调用 listener 的周期,第 3 个参数为米 , 表示位置移动指定距离后就调用 listener

		locationManager.requestLocationUpdates(providerName, 2000, 10,locationListener);
	}

	// 判断是否开启 GPS ,若未开启,打开 GPS 设置界面

	private void openGPS() {

		if (locationManager
				.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)

				|| locationManager
						.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)

		) {

			Toast.makeText(this, " 位置源已设置! ", Toast.LENGTH_SHORT).show();

			return;

		}

		Toast.makeText(this, " 位置源未设置! ", Toast.LENGTH_SHORT).show();

		// 转至 GPS 设置界面

		Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);

		startActivityForResult(intent, 0);

	}

	// 获取 Location Provider

	private String getProviderName() {

		// 构建位置查询条件

		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

		return locationManager.getBestProvider(criteria, true);

	}

	// Gps 消息监听器

	private final LocationListener locationListener = new LocationListener() {

		// 位置发生改变后调用

		public void onLocationChanged(Location location) {

			updateWithNewLocation(location);

		}

		// provider 被用户关闭后调用

		public void onProviderDisabled(String provider) {

			updateWithNewLocation(null);

		}

		// provider 被用户开启后调用

		public void onProviderEnabled(String provider) {
		}

		// provider 状态变化时调用

		public void onStatusChanged(String provider, int status,

		Bundle extras) {
		}

	};

	// Gps 监听器调用,处理位置信息

	private void updateWithNewLocation(Location location) {

		String latLongString;

		TextView myLocationText = (TextView) findViewById(R.id.text);

		if (location != null) {

			double lat = location.getLatitude();

			double lng = location.getLongitude();

			latLongString = " 纬度 :" + lat + "\n 经度 :" + lng;

		} else {

			latLongString = " 无法获取地理信息 ";

		}
		List<Address> addrList=getAddressbyGeoPoint(location);
		String addr="当前详细地址:";
		if(addrList!=null && !addrList.isEmpty())
			addr+=parseAddr(addrList.get(0));
		myLocationText.setText(" 您当前的位置是 :\n" +

		latLongString + "\n" + addr);

	}

	private String parseAddr(Address address){
		
		return address.getAddressLine(0)+address.getAddressLine(1)+address.getAddressLine(2)+address.getFeatureName();
	}
	// 获取地址信息

	private List<Address> getAddressbyGeoPoint(Location location) {

		List<Address> result = null;

		// 先将 Location 转换为 GeoPoint

		// GeoPoint gp =getGeoByLocation(location);

		try {

			if (location != null) {

				// 获取 Geocoder ,通过 Geocoder 就可以拿到地址信息

				Geocoder gc = new Geocoder(this, Locale.getDefault());

				result = gc.getFromLocation(location.getLatitude(),
						location.getLongitude(), 1);

			}

		} catch (Exception e) {

			e.printStackTrace();

		}

		return result;

	}

	/**
	 * Determines whether one Location reading is better than the current
	 * Location fix
	 * 
	 * @param location
	 *            The new Location that you want to evaluate
	 * @param currentBestLocation
	 *            The current Location fix, to which you want to compare the new
	 *            one
	 */
	protected boolean isBetterLocation(Location location,
			Location currentBestLocation) {
		if (currentBestLocation == null) {
			// A new location is always better than no location
			return true;
		}

		// Check whether the new location fix is newer or older
		long timeDelta = location.getTime() - currentBestLocation.getTime();
		boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
		boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
		boolean isNewer = timeDelta > 0;

		// If it's been more than two minutes since the current location, use
		// the new location
		// because the user has likely moved
		if (isSignificantlyNewer) {
			return true;
			// If the new location is more than two minutes older, it must be
			// worse
		} else if (isSignificantlyOlder) {
			return false;
		}

		// Check whether the new location fix is more or less accurate
		int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation
				.getAccuracy());
		boolean isLessAccurate = accuracyDelta > 0;
		boolean isMoreAccurate = accuracyDelta < 0;
		boolean isSignificantlyLessAccurate = accuracyDelta > 200;

		// Check if the old and new location are from the same provider
		boolean isFromSameProvider = isSameProvider(location.getProvider(),
				currentBestLocation.getProvider());

		// Determine location quality using a combination of timeliness and
		// accuracy
		if (isMoreAccurate) {
			return true;
		} else if (isNewer && !isLessAccurate) {
			return true;
		} else if (isNewer && !isSignificantlyLessAccurate
				&& isFromSameProvider) {
			return true;
		}
		return false;
	}

	/** Checks whether two providers are the same */
	private boolean isSameProvider(String provider1, String provider2) {
		if (provider1 == null) {
			return provider2 == null;
		}
		return provider1.equals(provider2);
	}
}
分享到:

相关推荐

    Android Google 位置定位

    总的来说,Android Google 位置定位服务通过LocationRequest、LocationCallback或FusedLocationProviderClient提供了高效、准确的位置信息获取方式。在实际应用中,开发者需要考虑权衡定位精度、更新频率与电池消耗...

    Android地图定位googleSDK使用

    在Android开发中,集成Google Maps SDK和Google Location SDK是实现地图展示、定位功能的重要环节。本文将详细讲解如何使用这两个SDK来实现相应的功能,并提供一些关键知识点。 首先,我们需要在项目中添加Google ...

    android 百度地图定位自己位置

    在Android平台上,使用百度地图API实现定位用户自身位置是一项常见的需求。这涉及到移动开发、地理信息系统(GIS)以及网络服务的集成。以下是一些关于如何在Android应用中使用百度地图API来定位用户位置的关键知识...

    Android Wifi Lbs 定位

    Android WiFi LBS(Location-Based Services,基于位置的服务)定位是通过结合WiFi网络信号和移动通信基站信息来确定设备的位置。这种定位方式在GPS信号不可用或者信号弱的室内环境尤为实用。下面将详细介绍Android ...

    ArcGIS For Android Location Demo

    【ArcGIS For Android Location Demo】是一个基于Android Studio开发的示例项目,它利用Esri的ArcGIS for Android 10.2.6 SDK,展示了如何在Android设备上集成和使用地理定位功能。这个Demo旨在帮助开发者理解如何在...

    android基于Gps 定位和基站定位获取经纬度

    在Android平台上,获取设备位置信息是一项关键功能,通常可以通过GPS(全球定位系统)和基站定位两种方式实现。本文将深入探讨这两种方法,并结合提供的源码分析其工作原理和实现细节。 1. GPS定位: GPS定位是...

    Android Location

    在Android系统中,Location服务是开发者获取设备地理位置信息的关键组件。这个服务允许应用程序访问GPS(全球定位系统)、网络定位(如Wi-Fi和移动网络)以及其他传感器数据,来确定设备的位置。在"Android Location...

    Android获取GPS定位示例程序

    在Android平台上,获取GPS定位是移动应用开发中的基础功能,尤其对于那些依赖地理位置信息的应用,如导航、社交、天气预报等。本示例程序"LocationDemo"是专门为开发者设计的,用于展示如何在Android Studio环境下...

    Android Studio定位

    总结,Android Studio定位涉及了Google Play服务的Location API,FusedLocationProviderClient的使用,权限管理,位置请求与更新,以及异常处理和优化。开发者需要理解这些基础知识,并结合实际应用需求进行合理配置...

    Android_Location_V1.3.0.jar

    在Android应用开发中,位置服务是一项至关重要的功能,它允许应用程序获取设备的地理位置信息,用于导航、定位服务、社交应用等多种用途。`Android_Location_V1.3.0.jar` 文件是针对这一需求的一个特定版本的库,...

    Android平台GPS定位

    总的来说,掌握Android平台上的GPS定位技术,以及如何解决location为null的问题,对于构建涉及位置服务的应用至关重要。这不仅要求开发者理解定位机制,还需要熟悉Android的权限管理和异常处理,从而提供稳定且用户...

    android简单定位实例

    在Android平台上,实现简单的定位功能是一项常见的任务,它涉及到Android系统的地理位置服务,主要依赖于GPS(全球定位系统)以及网络定位技术。本实例将详细解析如何在Android应用中集成定位功能,让应用能够获取到...

    Android GPS获得定位数据源代码

    在Android开发中,获取GPS定位数据是常见的需求,主要用于实现地图导航、位置服务等功能。本文将详细介绍如何通过源代码在Android设备上获取GPS定位信息,并将其存储到SQLite本地数据库中。 首先,Android系统提供...

    android后台定时定位

    在Android平台上,实现“后台定时定位”涉及到多个关键知识点,包括Android服务(Service)、位置API、后台运行限制以及电量和性能优化。以下是对这些概念的详细说明: 1. **Android服务(Service)**:Android ...

    Android-Android定位基于百度基础定位sdk封装

    同时,为了优化用户体验,还可以结合Google Play服务的Fused Location Provider API,根据设备状态智能选择最合适的定位服务。 总的来说,“Android-Android定位基于百度基础定位sdk封装”项目是Android开发者快速...

    Android项目GPS实时定位位置共享源码

    这个“Android项目GPS实时定位位置共享源码”提供了一个完整的解决方案,经过实际测试,利用了百度地图API来获取和展示用户的位置信息。 首先,我们要了解Android中的定位服务。Android系统提供了多种定位方式,...

    Android-Android仿微信发送位置

    在Android平台上,仿微信发送位置是一项常见的功能,它涉及到地理定位、地图显示、以及与服务器交互等多个技术领域。本文将详细解析如何在Android应用中实现类似微信的位置分享功能。 首先,我们需要了解Android中...

    Android获取网络定位封装工具类

    在Android开发中,获取地理位置是常见的需求,网络定位是一种常用的方法。本篇文章将详细解析如何在Android中封装一个网络定位工具类,以便快速、高效地获取到设备的经纬度坐标。 首先,我们要引入必要的依赖。在`...

Global site tag (gtag.js) - Google Analytics