您的位置:首页 > 移动开发 > Android开发

android典型代码系列(十六)------GPS定位

2015-12-04 14:15 375 查看
13GPS定位 :

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.text.TextUtils;
/** * 保证这个类只存在一个实例 */
public class GPSInfoProvider {
LocationManager manager;
private static GPSInfoProvider mGPSInfoProvider;
private static Context context;
private static MyLoactionListener listener;
//1.私有化构造方法
private GPSInfoProvider(){};
//2. 提供一个静态的方法,可以返回他的一个实例(synchronized:保证这个方法里面的逻辑必须全部执行)
public static synchronized GPSInfoProvider getInstance(Context context){
if(mGPSInfoProvider==null){
mGPSInfoProvider = new GPSInfoProvider();
GPSInfoProvider.context = context;
}
return mGPSInfoProvider;
}
// 3.获取gps 信息
public String getLocation(){
manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//manager.getAllProviders();//获取当前手机支持的定位方式
String provider = getProvider(manager);
/* 注册位置的监听器
第一个参数:定位方式,GPS,AGPS,基站
第二个参数:每隔多长时间(ms)获取一下当前手机的位置(推荐1分钟)
第三个参数:位置每改变多少米获取一下位置信息
第四个参数:当位置发生改变的时候所对应的的回调方法
*/
manager.requestLocationUpdates(provider,60000, 50, getListener());
SharedPreferences sp = context.getSharedPreferences
("config", Context.MODE_PRIVATE);
String location = sp.getString("location", "");
return location;
}
/** @param manager 位置管理服务
* @return 最好的位置提供者*/
private String getProvider(LocationManager manager){
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//经度,这里表示精准定位
criteria.setAltitudeRequired(false);//是否对海拔信息敏感
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//设置GPS定位对耗电性能要求
criteria.setSpeedRequired(true);//设置是否对速度的变化敏感
criteria.setCostAllowed(true);//true:允许产生一些开销,与运行商通信等
//第一个参数:一组查询条件,耗电?经纬度?海拔等
//第二个参数:true:返回那些已经被打开的设备,false:返回全部可以的位置提供者
return  manager.getBestProvider(criteria, true);
}
private synchronized MyLoactionListener getListener(){
if(listener==null){
listener = new MyLoactionListener();
}
return listener;
}
private class MyLoactionListener implements LocationListener{
/**当手机位置发生改变的时候 调用的方法 */
public void onLocationChanged(Location location) {
String latitude ="latitude "+ location.getLatitude(); //纬度
String longtitude = "longtitude "+ location.getLongitude(); //经度
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("location", latitude+" - "+ longtitude);
editor.commit(); //最后一次获取到的位置信息 存放到sharedpreference里面
}
/**某一个设备的状态发生改变的时候 调用 可用->不可用  不可用->可用*/
public void onStatusChanged(String provider, int status, Bundle extras) {   }
/**某个设备被打开*/
public void onProviderEnabled(String provider) {}
/**某个设备被禁用 */
public void onProviderDisabled(String provider) {}
}
// 4. 停止gps监听(很重要)
public void stopGPSListener(){
manager.removeUpdates(getListener());
}
}


补充:

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度
criteria.setAltitudeRequired(false);//不要求海拔信息
criteria.setBearingRequired(false);//不要求方位信息
criteria.setCostAllowed(true);//是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求


它其实是一个条件设定是选择
provider
的用的

String provider = locationManager.getBestProvider(criteria, true);
这个方法是根据你设定的条件找到的最优的
provider


你要是想用network定位你就要改变这个设定条件 或者 直接用设定provider为network类型的了

补充说明:

LocationManager.GPS_PROVIDER
:GPS,精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫星信息,另外设备可能没有GPS模块;

LocationManager.NETWORK_PROVIDER
:通过网络获取定位信息,精度低,耗电少,获取信息速度较快,不依赖GPS模块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: