android GPS定位

android 一般手机都带GPS定位模块的,在项目中我们有时候也是需要获取用户当前的位置的,当然你可以用百度定位或者高德的定位,这两个都不错的,我这里就讲一下android 自带的GPS定位方式。
二话不说先上代码,测试可用。

package view_demo.jf.com.viewdemo.Activity;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import view_demo.jf.com.viewdemo.R;

public class GpsActivity extends Activity {
    private LinearLayout mLl_containt;
    private String       provider;
    private List<GpsSatellite> numSatelliteList = new ArrayList<GpsSatellite>(); // 卫星信号

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gps);
        initView();
        initEvent();
    }

    private void initView() {
        mLl_containt = (LinearLayout) findViewById(R.id.ll_containt);
    }

    private void initEvent() {
        final LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        List<String> allProviders = locationManager.getAllProviders();//获取所有的位置信息提供器
        for (int i = 0; i < allProviders.size(); i++) {
            if (allProviders.contains(LocationManager.GPS_PROVIDER)) {
                //GPS定位
                provider = LocationManager.GPS_PROVIDER;
                Toast.makeText(GpsActivity.this, "GPS==" + provider, Toast.LENGTH_SHORT).show();
            } else if (allProviders.contains(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
                Toast.makeText(GpsActivity.this, "NET==" + provider, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(GpsActivity.this, "没有可以定位的!", Toast.LENGTH_SHORT).show();
            }
        }
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location lastKnownLocation = locationManager.getLastKnownLocation(provider);
        locationManager.requestLocationUpdates(provider, 2000, 0, new MyListener());
        locationManager.addGpsStatusListener(new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
                GpsStatus gpsStatus = locationManager.getGpsStatus(null);
                TextView textView = new TextView(GpsActivity.this);
                TextView textView2 = new TextView(GpsActivity.this); 
                switch (event) {
                    case GpsStatus.GPS_EVENT_FIRST_FIX: {
                        //第一次定位时间UTC gps可用
                        //Log.v(TAG,"GPS is usable");
                        int i = gpsStatus.getTimeToFirstFix();
                        textView.setText("第一次定位时间!" + i);
                        break;
                    }
                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS: {//周期的报告卫星状态
                        //得到所有收到的卫星的信息,包括 卫星的高度角、方位角、信噪比、和伪随机号(及卫星编号)
                        Iterable<GpsSatellite> allSatellites;
                        allSatellites = gpsStatus.getSatellites();
                        Iterator<GpsSatellite> iterator = allSatellites.iterator();
                        int numOfSatellites = 0;
                        int inuser = 0;
                        int maxSatellites = gpsStatus.getMaxSatellites();
                        while (iterator.hasNext() && numOfSatellites < maxSatellites) {
                            numOfSatellites++;
                            GpsSatellite next = iterator.next();
                            if (next.getSnr() != 0) {
                                inuser++;
                            }
                        }
                        if (numOfSatellites < 3) {
                            // Utils.DisplayToastShort(GPSService.this, "***卫星少于3颗***");
                        } else if (numOfSatellites > 7) {
                        }
                        textView2.setText("收到卫星数量!" + numOfSatellites);
                        textView.setText("可用卫星数量!" + inuser);
                        break;
                    }
                    case GpsStatus.GPS_EVENT_STARTED: {
                        textView.setText("卫星数量!" + "GPS_EVENT_STARTED");
                        break;
                    }
                    case GpsStatus.GPS_EVENT_STOPPED: {
                        textView.setText("卫星数量!GPS_EVENT_STOPPED");
                        break;
                    }
                    default:
                        break;
                }
                mLl_containt.addView(textView);
                mLl_containt.addView(textView2);
            }

        });
    }
    public class MyListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            double latitude = location.getLatitude(); //精度
            double longitude = location.getLongitude(); // 纬度
            double speed = location.getSpeed();    // 速度
            double altitude = location.getAltitude();    // 海拔
            double bearing = location.getBearing();    // 方位
            TextView textView = new TextView(GpsActivity.this);
            textView.setText("精度" + latitude + '\n' +
                    "纬度" + longitude + '\n' +
                    "速度" + speed + "m/s" + '\n' +
                    "海拔" + altitude + "m" + '\n' +
                    "方位" + bearing + '\n');
            mLl_containt.addView(textView);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    }
}

//布局就一个线性布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context="view_demo.jf.com.viewdemo.Activity.GpsActivity">
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:id="@+id/ll_containt"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>
</ScrollView>
</LinearLayout>

代码就上面那些了,没多少,主要干的事情呢,就是获取GPS可用的数量和第一次定位花的时间,获取经纬度,速度,高度,等数据

下面来分析一下代码
1.首先我们获取GPS的管理器对象也就是LocationManager

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

2.获取手机可以提供的定位的方式,有2种,GPS和Net

List<String> allProviders = locationManager.getAllProviders();//获取所有的位置信息提供器
        for (int i = 0; i < allProviders.size(); i++) {
            if (allProviders.contains(LocationManager.GPS_PROVIDER)) {//GPS定位
                provider = LocationManager.GPS_PROVIDER;
            } else if (allProviders.contains(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
            } else {
                Toast.makeText(GpsActivity.this, "没有可以定位的!", Toast.LENGTH_SHORT).show();
            }
        }

3.请求定位信息更新

 locationManager.requestLocationUpdates(provider, 2000, 0, new MyListener());//第一个是可提供定位的方式,请求的时间间隔,多远距离 更新一次,数据回调
public class MyListener implements LocationListener {
        @Override
        public void onLocationChanged(Location location) {
            double latitude = location.getLatitude(); //精度
            double longitude = location.getLongitude(); // 纬度
            double speed = location.getSpeed();    // 速度
            double altitude = location.getAltitude();    // 海拔
            double bearing = location.getBearing();    // 方位
            TextView textView = new TextView(GpsActivity.this);
            textView.setText("精度" + latitude + '\n' +
                    "纬度" + longitude + '\n' +
                    "速度" + speed + "m/s" + '\n' +
                    "海拔" + altitude + "m" + '\n' +
                    "方位" + bearing + '\n');
            mLl_containt.addView(textView);
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
    }

4.一般很少用但是确是很实用的,获取GPS的状态,比如GPS多少颗在线,可见多少颗,什么时候定位成功,定位耗时等

 locationManager.addGpsStatusListener(new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
                GpsStatus gpsStatus = locationManager.getGpsStatus(null);
                String s = updateGpsStatus(event, gpsStatus);
                TextView textView = new TextView(GpsActivity.this);
                TextView textView2 = new TextView(GpsActivity.this);
                textView.setText(s);
                switch (event) {
                    case GpsStatus.GPS_EVENT_FIRST_FIX: {
                        //第一次定位时间UTC gps可用
                        int i = gpsStatus.getTimeToFirstFix();
                        textView.setText("第一次定位时间!" + i);
                        break;
                    }
                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS: {//周期的报告卫星状态
                        //得到所有收到的卫星的信息,包括 卫星的高度角、方位角、信噪比、和伪随机号(及卫星编号)
                        Iterable<GpsSatellite> allSatellites;
                        allSatellites = gpsStatus.getSatellites();
                        Iterator<GpsSatellite> iterator = allSatellites.iterator();
                        int numOfSatellites = 0;
                        int inuser = 0;
                        int maxSatellites = gpsStatus.getMaxSatellites();
                        while (iterator.hasNext() && numOfSatellites < maxSatellites) {
                            numOfSatellites++;
                            GpsSatellite next = iterator.next();
                            if (next.getSnr() != 0) {//这个呢,请一定注意咯,GPS的数量,你会看到2种,一种是你已经收到的GPS数量,一种是已经使用的GPS数量,这两者是不一样的,打个比方,你在室外收到12卫星,到室内去,其实你的收到的GPS数量还是12的,变化的是GPS可用的数量,这里我就根据是否有噪声是否为空判断是否可用
                                inuser++;
                            }
                        }
                        textView2.setText("收到卫星数量!" + numOfSatellites);
                        textView.setText("可用卫星数量!" + inuser);
                        break;
                    }
                    case GpsStatus.GPS_EVENT_STARTED: {
                        textView.setText("状态" + "GPS_EVENT_STARTED");//启动GPS
                        break;
                    }
                    case GpsStatus.GPS_EVENT_STOPPED: {
                        textView.setText("状态!GPS_EVENT_STOPPED");//GPS服务结束
                        break;
                    }
                    default:
                        break;
                }
                mLl_containt.addView(textView);
                mLl_containt.addView(textView2);
            }
        });

5,最后就是取消定位了。

  MyListener listener=new MyListener();
  locationManager.removeUpdates(listener);

好了,这个博客就写完了,各位看客觉得好呢,就点个赞咯。明天就国庆节了,提前祝大家国庆快乐。苦逼的我要开车回家,唉,想着马上要堵在路上,心情就顿时不好了,完

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值