Android中使用GPS和NetWork获取定位信息

来源:互联网 发布:java web三层架构和mvc 编辑:程序博客网 时间:2024/05/22 10:40

在Android中定位是属于危险权限,需要在添加Mainfest.xml中添加。

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

如果在Android6.0级以上系统,需要 动态的申请权限,也可以使用封装好 权限管理库。


定位的几种方式

在Android系统当中,给我们提供了四种定位方式,分别是:

  • network

    它是依靠信号塔或WiFi来定位的。对应的provider字段是LocationManager.NETWORK_PROVIDER,是一种低精度,低耗电的初略定位方式。

  • gps

    它是依靠GPS来定位的。对应的provider字段是LocationManager.GPS_PROVIDER,是高精度,高耗电的精准定位方式。

  • passive

    被动的获取定位信息,通过接受其他APP或service的定位信息。不过需要这个权限ACCESS_FINE_LOCATION。

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

    Google已经将这个定位方式hide了。


获取定位的api封装

public class LocationUtils {    private static final long REFRESH_TIME = 5000L;    private static final float METER_POSITION = 0.0f;    private static ILocationListener mLocationListener;    private static LocationListener listener = new MyLocationListener();    private static class MyLocationListener implements LocationListener {        @Override        public void onLocationChanged(Location location) {//定位改变监听            if (mLocationListener != null) {                mLocationListener.onSuccessLocation(location);            }        }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听        }        @Override        public void onProviderEnabled(String provider) {//定位状态可用监听        }        @Override        public void onProviderDisabled(String provider) {//定位状态不可用监听        }    }    /**     * GPS获取定位方式     */    public static Location getGPSLocation(@NonNull Context context) {        Location location = null;        LocationManager manager = getLocationManager(context);        //高版本的权限检查        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return null;        }        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位            //获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息            location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);        }        return location;    }    /**     * network获取定位方式     */    public static Location getNetWorkLocation(Context context) {        Location location = null;        LocationManager manager = getLocationManager(context);        //高版本的权限检查        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return null;        }        if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位            //获取最后的network定位信息            location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);        }        return location;    }    /**     * 获取最好的定位方式     */    public static Location getBestLocation(Context context, Criteria criteria) {        Location location;        LocationManager manager = getLocationManager(context);        if (criteria == null) {            criteria = new Criteria();        }        String provider = manager.getBestProvider(criteria, true);        if (TextUtils.isEmpty(provider)) {            //如果找不到最适合的定位,使用network定位            location = getNetWorkLocation(context);        } else {            //高版本的权限检查            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED                    && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                return null;            }            //获取最适合的定位方式的最后的定位权限            location = manager.getLastKnownLocation(provider);        }        return location;    }    /**     * 定位监听     */    public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {        addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener);    }    /**     * 定位监听     */    public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) {        if (locationListener != null) {            mLocationListener = locationListener;        }        if (listener == null) {            listener = new MyLocationListener();        }        LocationManager manager = getLocationManager(context);        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        manager.requestLocationUpdates(provider, time, meter, listener);    }    /**     * 取消定位监听     */    public static void unRegisterListener(Context context) {        if (listener != null) {            LocationManager manager = getLocationManager(context);            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                    && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                return;            }            //移除定位监听            manager.removeUpdates(listener);        }    }    private static LocationManager getLocationManager(@NonNull Context context) {        return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);    }    /**     * 自定义接口     */    public interface ILocationListener {        void onSuccessLocation(Location location);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143

获取定位使用实例

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private boolean flag;    private Button gsp_btn;    private Button network_btn;    private Button best_btn;    private static Context context;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        context = getApplicationContext();        initView();        initListener();    }    private void initListener() {        gsp_btn.setOnClickListener(this);        network_btn.setOnClickListener(this);        best_btn.setOnClickListener(this);    }    @Override    protected void onResume() {        super.onResume();        initPermission();//针对6.0以上版本做权限适配    }    private void initView() {        gsp_btn = (Button) findViewById(R.id.gps);        network_btn = (Button) findViewById(R.id.net);        best_btn = (Button) findViewById(R.id.best);    }    private void initPermission() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            //检查权限            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED                    || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                //请求权限                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);            } else {                flag = true;            }        } else {            flag = true;        }    }    /**     * 权限的结果回调函数     */    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 1) {            flag = grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED;        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.gps:                if (flag) {                    getGPSLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;            case R.id.net:                if (flag) {                    getNetworkLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;            case R.id.best:                if (flag) {                    getBestLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;        }    }    /**     * 通过GPS获取定位信息     */    public void getGPSLocation() {        Location gps = LocationUtils.getGPSLocation(this);        if (gps == null) {            //设置定位监听,因为GPS定位,第一次进来可能获取不到,通过设置监听,可以在有效的时间范围内获取定位信息            LocationUtils.addLocationListener(context, LocationManager.GPS_PROVIDER, new LocationUtils.ILocationListener() {                @Override                public void onSuccessLocation(Location location) {                    if (location != null) {                        Toast.makeText(MainActivity.this, "gps onSuccessLocation location:  lat==" + location.getLatitude() + "     lng==" + location.getLongitude(), Toast.LENGTH_SHORT).show();                    } else {                        Toast.makeText(MainActivity.this, "gps location is null", Toast.LENGTH_SHORT).show();                    }                }            });        } else {            Toast.makeText(this, "gps location: lat==" + gps.getLatitude() + "  lng==" + gps.getLongitude(), Toast.LENGTH_SHORT).show();        }    }    /**     * 通过网络等获取定位信息     */    private void getNetworkLocation() {        Location net = LocationUtils.getNetWorkLocation(this);        if (net == null) {            Toast.makeText(this, "net location is null", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(this, "network location: lat==" + net.getLatitude() + "  lng==" + net.getLongitude(), Toast.LENGTH_SHORT).show();        }    }    /**     * 采用最好的方式获取定位信息     */    private void getBestLocation() {        Criteria c = new Criteria();//Criteria类是设置定位的标准信息(系统会根据你的要求,匹配最适合你的定位供应商),一个定位的辅助信息的类        c.setPowerRequirement(Criteria.POWER_LOW);//设置低耗电        c.setAltitudeRequired(true);//设置需要海拔        c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//设置COARSE精度标准        c.setAccuracy(Criteria.ACCURACY_LOW);//设置低精度        //... Criteria 还有其他属性,就不一一介绍了        Location best = LocationUtils.getBestLocation(this, c);        if (best == null) {            Toast.makeText(this, " best location is null", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(this, "best location: lat==" + best.getLatitude() + " lng==" + best.getLongitude(), Toast.LENGTH_SHORT).show();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143

关于GPS定位的信息还有比较多的内容,在API24中GpsStauts类过时,使用GnssStatus类替换,同时在LocationManager中的一些GPS状态的监听,也被新的API退换。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 金钻叶子有黑斑怎么办 怀孕60天没有胎心胎芽怎么办 单位不给交社保怎么办 公司没给足产假怎么办 小公司不给产假怎么办 机关不给陪产假怎么办 刚人流后又怀孕怎么办 怀孕50天不想要怎么办 生了孩子不想要怎么办 刚怀孕不想要孩子怎么办 怀孕一周不想要孩子怎么办 怀孕了不想要孩子怎么办 怀上二胎后悔了怎么办 50岁怀了二胎怎么办 老公那方面太强怎么办 被私人医院骗了怎么办 我特别烦我妈怎么办 刚怀孕了有炎症怎么办 怀孕了但有炎症怎么办 20岁脸上肉松弛怎么办 20岁脸部肉松弛怎么办 脸上肉松弛怎么办16岁 才20岁脸部松弛怎么办 20岁就脸部松弛怎么办 孕妇吃了点薄荷怎么办? 孕妇喝了薄荷水怎么办 怀孕吃了些薄荷怎么办 月经期吃了阿胶怎么办 高血糖怎么办吃什么好 孩子反复发烧4天怎么办 5岁宝宝反复发烧怎么办 6岁儿童反复发烧怎么办 空腹吃核桃胃疼怎么办 空腹吃苹果胃疼怎么办 孕妇吃了灯笼果怎么办 血黏度高怎么办吃啥 3岁宝宝感冒发烧怎么办 买了东西想退货怎么办 被实体店骗了怎么办 在qq买手机被骗怎么办 qq上购物被骗了怎么办