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