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

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模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值