Android可以通过多种方式获取用户位置。本文主要将GPS和NETWORK两种方式。
先简单的介绍下怎么在Android设备上获取用户位置。
-
-
LocationManagerlocationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
-
-
-
LocationListenerlocationListener=newLocationListener(){
-
publicvoidonLocationChanged(Locationlocation){
-
-
makeUseOfNewLocation(location);
-
}
-
-
publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){}
-
-
publicvoidonProviderEnabled(Stringprovider){}
-
-
publicvoidonProviderDisabled(Stringprovider){}
-
};
-
-
-
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);
首先要获取LocationManager对象,LocationManager不能直接new出来,他是系统的一项服务。
requestLocationUpdates()方法是来更新用户的位置的。第一个参数是Location Provider(位置提供者)的使用类型。(本例中使用的是基于手机信号塔和Wi_FI基站的网络位置提供者)。二个参数是通知之间的最小时间间隔(单位微秒),第三个是通知之间最小的距离变化(单位米)。将两个的值设置为零可以尽可能频繁的获取位置的通知。最后一个参数是 接受位置更新回调函数LocationListener。
为了使用GPS提供者来获取位置的更新,可以将NETWORK_PROVIDER.更改为GPS_PROVIDER。也可以通过两次调用requestLocationUpdates()(一次 NETWORK_PROVIDER ,一次GPS_PROVIDER.)来同时使用GPS和Network Location 内容提供者获取位置更新。
为了能够接受来自 NETWORK_PROVIDER或者GPS_PROVIDER的位置更新,必须在Android 的mainifest的文件中声明ACCESS_COARSE_LOCATION 或者ACCESS_FINE_LOCATION的用户权限。如果没有这些权限,会报错。NETWORK_PROVIDER需要ACCESS_COARSE_LOCATION权限(粗糙的定位权限),GPS_PROVIDER需要ACCESS_FINE_LOCATION权限(精确的定位权限)。当然,如果有ACCESS_FINE_LOCATION权限,NETWORK_PROVIDER和GPS_PROVIDER都能用。
LocationListener中的四个回调函数
onLocationChanged:当位置变化时调用
onStatusChanged:此方法在Provider的状态在可用、暂时不可用和无服务三个状态直接切换时被调用。试了一下,在位置提供者为network的前提下,联网和断网此方法会被调用
onProviderEnabled和onProviderDisabled:provider被用户开启或关闭后调用。试了一下,在位置提供者为GPS的前提下,打开和关闭GPS此方法会被调用。
最后附上一个Demo:
-
packagecom.tianjf.locationgpsdemo;
-
-
importandroid.app.Activity;
-
importandroid.content.Context;
-
importandroid.content.Intent;
-
importandroid.location.Criteria;
-
importandroid.location.Location;
-
importandroid.location.LocationListener;
-
importandroid.location.LocationManager;
-
importandroid.os.Bundle;
-
importandroid.provider.Settings;
-
importandroid.widget.TextView;
-
importandroid.widget.Toast;
-
-
publicclassMainActivityextendsActivity{
-
-
TextViewmTextView;
-
LocationManagermLocationManager;
-
-
@Override
-
protectedvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
mTextView=(TextView)findViewById(R.id.text_view);
-
-
mLocationManager=(LocationManager)this
-
.getSystemService(Context.LOCATION_SERVICE);
-
openGPSSetting();
-
getLocation();
-
}
-
-
privatevoidopenGPSSetting(){
-
if(mLocationManager
-
.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
-
Toast.makeText(this,"GPS模块正常",Toast.LENGTH_SHORT).show();
-
return;
-
}
-
-
Toast.makeText(this,"请开启GPS!",Toast.LENGTH_SHORT).show();
-
-
Intentintent=newIntent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
-
startActivityForResult(intent,0);
-
}
-
-
privatevoidgetLocation(){
-
-
Criteriacriteria=newCriteria();
-
criteria.setAccuracy(Criteria.ACCURACY_FINE);
-
criteria.setAltitudeRequired(false);
-
criteria.setBearingRequired(false);
-
criteria.setCostAllowed(true);
-
criteria.setPowerRequirement(Criteria.POWER_LOW);
-
-
Stringprovider=mLocationManager.getBestProvider(criteria,true);
-
Locationlocation=mLocationManager.getLastKnownLocation(provider);
-
updateUIToNewLocation(location);
-
-
mLocationManager.requestLocationUpdates(provider,1*1000,0.00001F,
-
locationListener);
-
}
-
-
privatevoidupdateUIToNewLocation(Locationlocation){
-
if(location!=null){
-
mTextView.setText("纬度:"+location.getLatitude()+"\n经度"
-
+location.getLongitude());
-
-
-
-
-
-
-
-
-
-
}else{
-
mTextView.setText("无法获取地理信息");
-
}
-
}
-
-
-
LocationListenerlocationListener=newLocationListener(){
-
publicvoidonLocationChanged(Locationlocation){
-
System.out.println("onLocationChanged");
-
System.out.println("纬度:"+location.getLatitude()+"\n经度"
-
+location.getLongitude());
-
}
-
-
publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){
-
System.out.println("onStatusChanged");
-
System.out.println("privider:"+provider);
-
System.out.println("status:"+status);
-
System.out.println("extras:"+extras);
-
}
-
-
publicvoidonProviderEnabled(Stringprovider){
-
System.out.println("onProviderEnabled");
-
System.out.println("privider:"+provider);
-
}
-
-
publicvoidonProviderDisabled(Stringprovider){
-
System.out.println("onProviderDisabled");
-
System.out.println("privider:"+provider);
-
}
-
};
-
}
转自:http://blog.csdn.net/tianjf0514/article/details/8295099
分享到:
相关推荐
android下的GPs定位,android编程之GPS,很好的参考哦
Android_GPS架构分析,在源码的基础上详细分析
Android的基站、WIFI、GPS定位集合(源码)
ANDROID GPS开发的结构分析,搞GPS开发的可以看一看。
Android_GPS_定位 在Android中进行GPS开发,需要涉及LocationManager、LocationProvider、Location三个核心类。
在Android上通过GPS,获取经纬度、计算距离、方位角
gpsdemo_GPS_android_android监控_android定位_监控.zip
android 手机调用gps程序 获得经纬度的坐标,
Android_GPS架构分析 android GPS的启动过程,以及剖析GPS应用程序如何调用函数来驱动底层硬件,最后分析几个重要的结构体。
gpsdemo_GPS_android_android监控_android定位_监控_源码.zip
android_gps_wifi_基站_定位集合文档
GPStest 软件可以测试GPS性能是否完好,提供经纬度授时等操作
Android支持GPS、WIFI、网络定位
支持地面波动数据处理,全志Android 10调试可用
android development ..........
android_gps
android gps地图及时定位android gps地图及时定位
MTK硬件平台,android4.4 gps 的驱动源码!适合用于北斗呦,另外就是可以这套代码已在很多品牌手机上应用!