Android简单定位实例

21 篇文章 0 订阅
4 篇文章 0 订阅

原文地址:http://blog.csdn.net/limb99/article/details/18819925


很多应用对定位的要求并不是那么高,也许只是确认一下当前位置大概在城市的那个方向或者临时需要一个当前的经纬度,这时候定位速度应该是第一位的。下面就说说简单定位需求的实现。


步骤

1.启动应用的时候同时启动一个定位服务

2.定位服务获取到定位信息后通过广播告知UI层(activity)

3.UI层处理显示

在下面的的例子中,在获取了当前的位置信息后,便停掉了的定位服务,并没有进行实时定位,当然也可以进行实时定位。


实现代码

定位服务(LocationSvc)代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.sc.demo.locate;  
  2.   
  3. import com.sc.demo.common.Common;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.location.Location;  
  8. import android.location.LocationListener;  
  9. import android.location.LocationManager;  
  10. import android.os.Bundle;  
  11. import android.os.IBinder;  
  12. import android.util.Log;  
  13. import android.widget.Toast;  
  14.   
  15. /** 
  16.  * @author SunnyCoffee 
  17.  * @date 2014-1-19 
  18.  * @version 1.0 
  19.  * @desc 定位服务 
  20.  *  
  21.  */  
  22. public class LocationSvc extends Service implements LocationListener {  
  23.   
  24.     private static final String TAG = "LocationSvc";  
  25.     private LocationManager locationManager;  
  26.   
  27.     @Override  
  28.     public IBinder onBind(Intent intent) {  
  29.         return null;  
  30.     }  
  31.   
  32.     @Override  
  33.     public void onCreate() {  
  34.         locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);  
  35.     }  
  36.   
  37.     @Override  
  38.     public void onStart(Intent intent, int startId) {  
  39.         if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) locationManager  
  40.                 .requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 00,  
  41.                         this);  
  42.         else if (locationManager.getProvider(LocationManager.GPS_PROVIDER) != null) locationManager  
  43.                 .requestLocationUpdates(LocationManager.GPS_PROVIDER, 00,  
  44.                         this);  
  45.         else Toast.makeText(this"无法定位", Toast.LENGTH_SHORT).show();  
  46.     }  
  47.   
  48.     @Override  
  49.     public boolean stopService(Intent name) {  
  50.         return super.stopService(name);  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onLocationChanged(Location location) {  
  55.         Log.d(TAG, "Get the current position \n" + location);  
  56.   
  57.         //通知Activity  
  58.         Intent intent = new Intent();  
  59.         intent.setAction(Common.LOCATION_ACTION);  
  60.         intent.putExtra(Common.LOCATION, location.toString());  
  61.         sendBroadcast(intent);  
  62.   
  63.         // 如果只是需要定位一次,这里就移除监听,停掉服务。如果要进行实时定位,可以在退出应用或者其他时刻停掉定位服务。  
  64.         locationManager.removeUpdates(this);  
  65.         stopSelf();  
  66.     }  
  67.   
  68.     @Override  
  69.     public void onProviderDisabled(String provider) {  
  70.     }  
  71.   
  72.     @Override  
  73.     public void onProviderEnabled(String provider) {  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onStatusChanged(String provider, int status, Bundle extras) {  
  78.     }  
  79.   
  80. }  

UI处理层代码

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.sc.demo;  
  2.   
  3. import com.sc.demo.common.Common;  
  4. import com.sc.demo.locate.LocationSvc;  
  5.   
  6. import android.os.Bundle;  
  7. import android.widget.TextView;  
  8. import android.app.Activity;  
  9. import android.app.ProgressDialog;  
  10. import android.content.BroadcastReceiver;  
  11. import android.content.Context;  
  12. import android.content.Intent;  
  13. import android.content.IntentFilter;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     private TextView text;  
  18.     private ProgressDialog dialog;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         text = (TextView) findViewById(R.id.text);  
  25.   
  26.         // 注册广播  
  27.         IntentFilter filter = new IntentFilter();  
  28.         filter.addAction(Common.LOCATION_ACTION);  
  29.         this.registerReceiver(new LocationBroadcastReceiver(), filter);  
  30.   
  31.         // 启动服务  
  32.         Intent intent = new Intent();  
  33.         intent.setClass(this, LocationSvc.class);  
  34.         startService(intent);  
  35.   
  36.         // 等待提示  
  37.         dialog = new ProgressDialog(this);  
  38.         dialog.setMessage("正在定位...");  
  39.         dialog.setCancelable(true);  
  40.         dialog.show();  
  41.     }  
  42.   
  43.     private class LocationBroadcastReceiver extends BroadcastReceiver {  
  44.   
  45.         @Override  
  46.         public void onReceive(Context context, Intent intent) {  
  47.             if (!intent.getAction().equals(Common.LOCATION_ACTION)) return;  
  48.             String locationInfo = intent.getStringExtra(Common.LOCATION);  
  49.             text.setText(locationInfo);  
  50.             dialog.dismiss();  
  51.             MainActivity.this.unregisterReceiver(this);// 不需要时注销  
  52.         }  
  53.     }  
  54.   
  55. }  


公共类

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.sc.demo.common;  
  2.   
  3. /** 
  4.  * @author SunnyCoffee 
  5.  * @date 2014-1-27 
  6.  * @version 1.0 
  7.  * @desc desc 公共常量 
  8.  *  
  9.  */  
  10. public class Common {  
  11.   
  12.     public static final String LOCATION = "location";  
  13.     public static final String LOCATION_ACTION = "locationAction";  
  14. }  


代码涉及了android的四大组件之三--Activity、Service、BroadcastReceiver 。

Activity启动后启动了Service,Service是用来定位的,在Service定位结束后发送广播到BroadcastReceiver,这里的BroadcastReceiver是作为Activity的内部类,所以并不能过AndroidManifest.xml进行注册,所以采用了方法registerReceiver。而定位就是通过注册监听执行回调获得。


项目源码下载地址http://download.csdn.net/detail/limb99/6888499。注:项目编码utf-8



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用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了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``` lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10,new MyLocationListener()); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值