Android 获取地理位置的经度和纬度

       在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息。看如下实例:新建android应用程序TestLocation。

1、activity_main.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TextView
        android:id="@+id/positionView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>
    用于显示获取到的位置信息。

2、MainActivity.java

package com.example.testlocation;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private TextView postionView;
	
	private LocationManager locationManager;
	private String locationProvider;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//获取显示地理位置信息的TextView
		postionView = (TextView) findViewById(R.id.positionView);
		//获取地理位置管理器
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		//获取所有可用的位置提供器
		List<String> providers = locationManager.getProviders(true);
		if(providers.contains(LocationManager.GPS_PROVIDER)){
			//如果是GPS
			locationProvider = LocationManager.GPS_PROVIDER;
		}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
			//如果是Network
			locationProvider = LocationManager.NETWORK_PROVIDER;
		}else{
			Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
			return ;
		}
		//获取Location
		Location location = locationManager.getLastKnownLocation(locationProvider);
		if(location!=null){
			//不为空,显示地理位置经纬度
			showLocation(location);
		}
		//监视地理位置变化
		locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
		
	}
	
	/**
	 * 显示地理位置经度和纬度信息
	 * @param location
	 */
	private void showLocation(Location location){
		String locationStr = "维度:" + location.getLatitude() +"\n" 
				+ "经度:" + location.getLongitude();
		postionView.setText(locationStr);
	}
	
	/**
	 * LocationListern监听器
	 * 参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器
	 */
	
	LocationListener locationListener =  new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle arg2) {
			
		}
		
		@Override
		public void onProviderEnabled(String provider) {
			
		}
		
		@Override
		public void onProviderDisabled(String provider) {
			
		}
		
		@Override
		public void onLocationChanged(Location location) {
			//如果位置发生变化,重新显示
			showLocation(location);
			
		}
	};
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(locationManager!=null){
			//移除监听器
			locationManager.removeUpdates(locationListener);
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
   从上面可以看出,获取地理位置信息主要分如下步骤:

   (1)获取LocationManager实例,通过getSystemService方法,传入Context.LOCATION_SERVICE参数。

   (2)获取可用的位置提供器,有GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER三种,前两种比较常用。

   (3)将(2)获取到的位置提供器传入LocationManager的方法getLastKnownLocation,即可获取Location信息。

    如果移动设备地理位置不断发生变化,则实时更新需要进行如下步骤:

   (4)调用LocationManager的requestLocationUpdates方法,第一个参数是位置提供器,第二个参数是监听位置变化的时间间隔(毫秒),第三个参数是监听位置变化的距             离间隔(米),第四个参数是LocationListener监听器

    (5)当位置发生变化后,就会调用监听器的onLocationChanged方法。

    (6)为了省电,节约资源,当程序关闭后,调用LocationManager的removeUpdates方法移除监听器。

3、获取权限

    修改AndroidManifest.xml,添加如下代码:

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
   
4、效果

   使用模拟器进行测试:点击send

                                                                                                                           

   可以使用Geocoding API查找具体对应的位置。如下:

(1)修改MainActivity.java

package com.example.testlocation;

import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private TextView postionView;
	
	private LocationManager locationManager;
	private String locationProvider;
	
	public static final int SHOW_LOCATION = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//获取显示地理位置信息的TextView
		postionView = (TextView) findViewById(R.id.positionView);
		//获取地理位置管理器
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		//获取所有可用的位置提供器
		List<String> providers = locationManager.getProviders(true);
		if(providers.contains(LocationManager.GPS_PROVIDER)){
			//如果是GPS
			locationProvider = LocationManager.GPS_PROVIDER;
		}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
			//如果是Network
			locationProvider = LocationManager.NETWORK_PROVIDER;
		}else{
			Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
			return ;
		}
		//获取Location
		Location location = locationManager.getLastKnownLocation(locationProvider);
		
		if(location!=null){
			//不为空,显示地理位置经纬度
			
			showLocation(location);
		}else{
			Toast.makeText(this, "location为空", Toast.LENGTH_SHORT).show();
		}
		//监视地理位置变化
		locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);
		
	}
	
	private Handler handler = new Handler(){
		public void handleMessage(Message msg){
			switch(msg.what){
			case SHOW_LOCATION:
				String position = (String) msg.obj;
				postionView.setText(position);
				break;
			default:
				break;
			}
		}
	};
	/**
	 * 显示地理位置经度和纬度信息
	 * @param location
	 */
	private void showLocation(final Location location){
		/*String locationStr = "维度:" + location.getLatitude() +"\n" 
				+ "经度:" + location.getLongitude();
		postionView.setText(locationStr);*/
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try{
					//组装反向地理编码的接口位置
					StringBuilder url = new StringBuilder();
					url.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");
					url.append(location.getLatitude()).append(",");
					url.append(location.getLongitude());
					url.append("&sensor=false");
					HttpClient client = new DefaultHttpClient();
					HttpGet httpGet = new HttpGet(url.toString());
					httpGet.addHeader("Accept-Language","zh-CN");
					HttpResponse response = client.execute(httpGet);
					if(response.getStatusLine().getStatusCode() == 200){
						HttpEntity entity = response.getEntity();
						String res = EntityUtils.toString(entity);
						//解析
						JSONObject jsonObject = new JSONObject(res);
						//获取results节点下的位置信息
						JSONArray resultArray = jsonObject.getJSONArray("results");
						if(resultArray.length() > 0){
							JSONObject obj = resultArray.getJSONObject(0);
							//取出格式化后的位置数据
							String address = obj.getString("formatted_address");
							
							Message msg = new Message();
							msg.what = SHOW_LOCATION;
							msg.obj = address;
							handler.sendMessage(msg);
						}
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	/**
	 * LocationListern监听器
	 * 参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器
	 */
	
	LocationListener locationListener =  new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle arg2) {
			
		}
		
		@Override
		public void onProviderEnabled(String provider) {
			
		}
		
		@Override
		public void onProviderDisabled(String provider) {
			
		}
		
		@Override
		public void onLocationChanged(Location location) {
			//如果位置发生变化,重新显示
			showLocation(location);
			
		}
	};
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(locationManager!=null){
			//移除监听器
			locationManager.removeUpdates(locationListener);
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
(2)修改AndroidManifest.xml

	
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.INTERNET"/>
     




  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值