Android上子线程中调用GPS功能


今天调试了Android上调用GPS的功能,在网上找了很多文章,方法是: 

  1. locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE );//初始化LocationManager   
  2. if (!locationManager .isProviderEnabled(android.location.LocationManager. GPS_PROVIDER))//检测是否打开了GPS功能,其他的类似,例如NETWORK_PROVIDER    
  3. location = locationManager.getLastKnownLocation( android.location.LocationManager. GPS_PROVIDER );//通过这句来获得Location  

最重要的是设置LocationListener,这样就可以随时监听最新的位置更新和定位功能的开启状态了:

  1. locationManager .requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER,60000,5,locationListener ,Looper.myLooper());//第二个参数和第三个参数设置了更新的频率  

locationListener变量的声明:

  1. private final LocationListener locationListener = new LocationListener() {//根据需求重写下面四个方法   
  2.             public void onLocationChanged(Location loc) {  
  3.             }   
  4.             // provider 被用户关闭后调用   
  5.             public void onProviderDisabled(String p){  
  6.            
  7.             }  
  8.              // provider 被用户开启后调用   
  9.             public void onProviderEnabled(String p){  
  10.                   
  11.             }  
  12.             // provider 状态变化时调用   
  13.             public void onStatusChanged(String provider, int status,Bundle extras){ }  
  14.         };  

通过

  1. locationManager.removeUpdates(locationListener);//来删除listener,因为一直开着很费电  

注意添加权限:

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

具体的细节可以参考:

我主要是在新的线程里调用了这个GPS类,加上对Looper的不熟悉,所以才调试了很长时间:需要注意的是在子线程中注册LocationListener时需要使用

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)方法,Looper需要先调用Looper.prepare()方法,然后调用Looper.loop()方法。如下:

  1. Looper.prepare();//相当于该线程Looper的初始化   
  2. locationManager .requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER,60000,5,locationListener ,Looper.myLooper());//获取该线程的looper   
  3. Looper.loop();//Looper开始执行,注意该语句执行后,这个线程的其他操作就被阻塞,只能响应事件了。

相关内容