使用LocationManager来获取移动设备所在的地理位置信息
在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息。看如下实例:新建android应用程序TestLocation。
1、activity_main.xml布局文件
[html] view plaincopyprint?- <LinearLayoutxmlns: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
[java] view plaincopyprint?- packagecom.example.testlocation;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.location.Location;
- importandroid.location.LocationListener;
- importandroid.location.LocationManager;
- importandroid.os.Bundle;
- importandroid.view.Menu;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassMainActivityextendsActivity{
- privateTextViewpostionView;
- privateLocationManagerlocationManager;
- privateStringlocationProvider;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- 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;
- }elseif(providers.contains(LocationManager.NETWORK_PROVIDER)){
- //如果是Network
- locationProvider=LocationManager.NETWORK_PROVIDER;
- }else{
- Toast.makeText(this,"没有可用的位置提供器",Toast.LENGTH_SHORT).show();
- return;
- }
- //获取Location
- Locationlocation=locationManager.getLastKnownLocation(locationProvider);
- if(location!=null){
- //不为空,显示地理位置经纬度
- showLocation(location);
- }
- //监视地理位置变化
- locationManager.requestLocationUpdates(locationProvider,3000,1,locationListener);
- }
- /**
- *显示地理位置经度和纬度信息
- *@paramlocation
- */
- privatevoidshowLocation(Locationlocation){
- StringlocationStr="维度:"+location.getLatitude()+"\n"
- +"经度:"+location.getLongitude();
- postionView.setText(locationStr);
- }
- /**
- *LocationListern监听器
- *参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器
- */
- LocationListenerlocationListener=newLocationListener(){
- @Override
- publicvoidonStatusChanged(Stringprovider,intstatus,Bundlearg2){
- }
- @Override
- publicvoidonProviderEnabled(Stringprovider){
- }
- @Override
- publicvoidonProviderDisabled(Stringprovider){
- }
- @Override
- publicvoidonLocationChanged(Locationlocation){
- //如果位置发生变化,重新显示
- showLocation(location);
- }
- };
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- if(locationManager!=null){
- //移除监听器
- locationManager.removeUpdates(locationListener);
- }
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- }
从上面可以看出,获取地理位置信息主要分如下步骤:
(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,添加如下代码:
[html] view plaincopyprint?- <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
- <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
4、效果
使用模拟器进行测试:点击send
可以使用Geocoding API查找具体对应的位置。如下:
(1)修改MainActivity.java
[java] view plaincopyprint?- packagecom.example.testlocation;
- importjava.util.List;
- importorg.apache.http.HttpEntity;
- importorg.apache.http.HttpResponse;
- importorg.apache.http.client.HttpClient;
- importorg.apache.http.client.methods.HttpGet;
- importorg.apache.http.impl.client.DefaultHttpClient;
- importorg.apache.http.util.EntityUtils;
- importorg.json.JSONArray;
- importorg.json.JSONObject;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.location.Location;
- importandroid.location.LocationListener;
- importandroid.location.LocationManager;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.view.Menu;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassMainActivityextendsActivity{
- privateTextViewpostionView;
- privateLocationManagerlocationManager;
- privateStringlocationProvider;
- publicstaticfinalintSHOW_LOCATION=0;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- 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;
- }elseif(providers.contains(LocationManager.NETWORK_PROVIDER)){
- //如果是Network
- locationProvider=LocationManager.NETWORK_PROVIDER;
- }else{
- Toast.makeText(this,"没有可用的位置提供器",Toast.LENGTH_SHORT).show();
- return;
- }
- //获取Location
- Locationlocation=locationManager.getLastKnownLocation(locationProvider);
- if(location!=null){
- //不为空,显示地理位置经纬度
- showLocation(location);
- }else{
- Toast.makeText(this,"location为空",Toast.LENGTH_SHORT).show();
- }
- //监视地理位置变化
- locationManager.requestLocationUpdates(locationProvider,3000,1,locationListener);
- }
- privateHandlerhandler=newHandler(){
- publicvoidhandleMessage(Messagemsg){
- switch(msg.what){
- caseSHOW_LOCATION:
- Stringposition=(String)msg.obj;
- postionView.setText(position);
- break;
- default:
- break;
- }
- }
- };
- /**
- *显示地理位置经度和纬度信息
- *@paramlocation
- */
- privatevoidshowLocation(finalLocationlocation){
- /*StringlocationStr="维度:"+location.getLatitude()+"\n"
- +"经度:"+location.getLongitude();
- postionView.setText(locationStr);*/
- newThread(newRunnable(){
- @Override
- publicvoidrun(){
- try{
- //组装反向地理编码的接口位置
- StringBuilderurl=newStringBuilder();
- url.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");
- url.append(location.getLatitude()).append(",");
- url.append(location.getLongitude());
- url.append("&sensor=false");
- HttpClientclient=newDefaultHttpClient();
- HttpGethttpGet=newHttpGet(url.toString());
- httpGet.addHeader("Accept-Language","zh-CN");
- HttpResponseresponse=client.execute(httpGet);
- if(response.getStatusLine().getStatusCode()==200){
- HttpEntityentity=response.getEntity();
- Stringres=EntityUtils.toString(entity);
- //解析
- JSONObjectjsonObject=newJSONObject(res);
- //获取results节点下的位置信息
- JSONArrayresultArray=jsonObject.getJSONArray("results");
- if(resultArray.length()>0){
- JSONObjectobj=resultArray.getJSONObject(0);
- //取出格式化后的位置数据
- Stringaddress=obj.getString("formatted_address");
- Messagemsg=newMessage();
- msg.what=SHOW_LOCATION;
- msg.obj=address;
- handler.sendMessage(msg);
- }
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }).start();
- }
- /**
- *LocationListern监听器
- *参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器
- */
- LocationListenerlocationListener=newLocationListener(){
- @Override
- publicvoidonStatusChanged(Stringprovider,intstatus,Bundlearg2){
- }
- @Override
- publicvoidonProviderEnabled(Stringprovider){
- }
- @Override
- publicvoidonProviderDisabled(Stringprovider){
- }
- @Override
- publicvoidonLocationChanged(Locationlocation){
- //如果位置发生变化,重新显示
- showLocation(location);
- }
- };
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- if(locationManager!=null){
- //移除监听器
- locationManager.removeUpdates(locationListener);
- }
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- }
(2)修改AndroidManifest.xml
[html] view plaincopyprint?- <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
- <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
更多相关文章
- Activity设置为对话框属性时(Theme.Dialog)时,改变其在屏幕中的位置
- Android(安卓)N(7.0) 遇到 android.os.FileUriExposedException: f
- Android沉浸式状态栏 + actionBar渐变 + scrollView顶部伸缩
- 注册谷歌地图 API 密钥和显示谷歌地图
- Android学习笔记-ProgressBar和ListView使用方法(一)
- 8.3facebook分享后不回调结果原因,java标签代码
- 从零开始学android:Android事件处理—监听日期与时间的改变
- Android(安卓)LocationManager 使用
- Android(安卓)UI学习 Linear Layout, RelativeLayout