使用GPS 定位,首先,需要在清单文件(AndroidManifest.xml)中注册获取定位的权限:
1.获取位置管理器对象LocationManager
import android.location.LocationManager;
LocationManager lm; //
lm =(LocationManager) this.getSystemService(Context`.LOCATION_SERVICE); //
2.一般使用LocationManager的getLastKnownLocation(LocationManager.GPS_PROVIDER);方法获取Location对象
String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法
Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息
不过不建议用这种方法,有几点原因:
一,在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 。
二,当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。
关于这个问题,参考链接:
1.android定位的实现
2.Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息
3.Android开发获取GPS位置,包含apn\wifi\gps 几种方法
3.推荐locationManager.requestLocationUpdates();
方法LocationManager中设定监听位置变化的代码如下:
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10,new MyLocationListener());
接下来介绍上面这行代码的各个参数,第一个参数是我们之前指定LocationManager的定位方法,GPS定位或网络定位,第二个参数指的是产生位置改变事件的时间间隔,单位为微秒,第三个参数指的是距离条件,单位为米,第四个参数是回调函数,用于处理位置改变事件,即设置LocationListener监听器。总的来说,那一行代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。
4.使用location对象具有的getLongitude()和getLatitude()获取经纬度数据
tv_01.setText("经度:"+loc.getLongitude());
tv_02.setText("纬度:"+loc.getLatitude());
5.具体实现的简单demo代码如下
package introduction.android.gpsLocationin;
/*
* 本工程GPSLocation的功能是使用GPS实时定位,实时显示手机的经纬度
*/
import introduction.android.gpsLocation.R;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager; //
import android.location.Location; //
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btn_listen;
private TextView tv_01,tv_02;
LocationManager lm; //
Location loc; //
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lm =(LocationManager) this.getSystemService(Context.LOCATION_SERVICE); //
//检测GPS状态(是否开启)
if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){ //若未打开GPS
Toast.makeText(MainActivity.this,"请开启GPS服务",Toast.LENGTH_LONG).show();
Intent myintent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myintent); //运行手机的设置程序
}
btn_listen=(Button) findViewById(R.id.btn_listen);
tv_01=(TextView) findViewById(R.id.tv_01);
tv_02=(TextView) findViewById(R.id.tv_02);
btn_listen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,new MyLocationListener());
}
});
}
//位置监听器方法
class MyLocationListener implements LocationListener{ //位置监听器,作为方法参数
@Override
public void onLocationChanged(Location loc) {
// TODO Auto-generated method stub
tv_01.setText("经度:"+loc.getLongitude());
tv_02.setText("纬度:"+loc.getLatitude());
}
@Override
public void onProviderDisabled(String provider) {
//当provider被用户关闭时调用
Log.i("GpsLocation","provider被关闭!");
}
@Override
public void onProviderEnabled(String provider) {
//当provider被用户开启后调用
Log.i("GpsLocation","provider被开启!");
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//当provider的状态在OUT_OF_SERVICE、TEMPORARILY_UNAVAILABLE和AVAILABLE之间发生变化时调用
Log.i("GpsLocation","provider状态发生改变!");
}
}
}
6,通过经纬度获取城市位置
getPosition(double longitude, double latitude){
// 通过经纬度获取地址,由于地址会有多个,这个和经纬度精确度有关
// 本实例中定义了最大的返回数2,即在集合对象中有两个值
List<Address> list = null;
Geocoder ge = new Geocoder(getActivity());
try {
list = ge.getFromLocation(latitude, longitude, 2);
} catch (IOException e) {
e.printStackTrace();
}
if (list !=null && list.size()>0){
for (int i = 0; i < list.size(); i++){
Address ad = list.get(i);
cityName = ad.getLocality();//获取城市
}
}
}
————————————————
转载于:https://blog.csdn.net/Bruce_shan/article/details/50536203