Android上子线程中调用GPS功能
Android上子线程中调用GPS功能
今天调试了Android上调用GPS的功能,在网上找了很多文章,方法是:
- locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE );//初始化LocationManager
- if (!locationManager .isProviderEnabled(android.location.LocationManager. GPS_PROVIDER))//检测是否打开了GPS功能,其他的类似,例如NETWORK_PROVIDER
- location = locationManager.getLastKnownLocation( android.location.LocationManager. GPS_PROVIDER );//通过这句来获得Location
最重要的是设置LocationListener,这样就可以随时监听最新的位置更新和定位功能的开启状态了:
- locationManager .requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER,60000,5,locationListener ,Looper.myLooper());//第二个参数和第三个参数设置了更新的频率
locationListener变量的声明:
- private final LocationListener locationListener = new LocationListener() {//根据需求重写下面四个方法
- public void onLocationChanged(Location loc) {
- }
- // provider 被用户关闭后调用
- public void onProviderDisabled(String p){
- }
- // provider 被用户开启后调用
- public void onProviderEnabled(String p){
- }
- // provider 状态变化时调用
- public void onStatusChanged(String provider, int status,Bundle extras){ }
- };
通过
- locationManager.removeUpdates(locationListener);//来删除listener,因为一直开着很费电
注意添加权限:
- <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()方法。如下:
- Looper.prepare();//相当于该线程Looper的初始化
- locationManager .requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER,60000,5,locationListener ,Looper.myLooper());//获取该线程的looper
- Looper.loop();//Looper开始执行,注意该语句执行后,这个线程的其他操作就被阻塞,只能响应事件了。
评论暂时关闭