权限:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
一、首先判断并提示用户 是否开启GPS硬件设备
package com.example.hejingzhou.gpsdemo;
import android.content.Context;
import android.location.LocationManager;
import android.util.Log;
/**
* Created by Hejingzhou on 2016/2/28.
*/
public class OpenGPS {
public static boolean isOPen = false;
public static String strIsOpen ;
private String TAG = this.getClass().getSimpleName();
Context context;
public static String getStrIsOpen() {
return strIsOpen;
}
public void OpenGps(Context context){
this.context = context;
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);//创建位置管理对象并且获取位置的系统服务
if(locationManager.isProviderEnabled(locationManager.GPS_PROVIDER)){
Log.i(TAG,"GPS模块已经打开");
isOPen = true;
strIsOpen = "GPS已经打开";
return;
}else {
Log.i(TAG,"请打开GPS模块");
isOPen = false;
strIsOpen = "GPS未开启,请手动开启GPS";
/*Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent,0);*///按说是这样做如果没有打开GPS就会跳转到开启GPS的界面但是我的startActivityForResult参数有问题
}
}
}
二、MainActivity
package com.example.hejingzhou.gpsdemo;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
private long ExitTime;//双击back退出时间标量
/* GpsStatus gpsStatus;
GpsStatus.Listener gpListener;
int firstTime ;
int maxSatellites;*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OpenGPS openGPS = new OpenGPS();
openGPS.OpenGps(this);
Toast.makeText(MainActivity.this, OpenGPS.getStrIsOpen(), Toast.LENGTH_SHORT).show();
if (OpenGPS.getStrIsOpen().equals("GPS已经打开")) {
getLocation();
} else {
return;
}
}
private void getLocation() {
/**
* 获取位置管理服务
*/
final LocationManager locationManager;
String serviceName = Context.LOCATION_SERVICE;
locationManager = (LocationManager) this.getSystemService(serviceName);
/**
* 查找到服务信息
*
* A class indicating the application criteria for selecting a
* location provider. Providers maybe ordered according to accuracy,
* power usage, ability to report altitude, speed,
* and bearing, and monetary cost.
*/
/*
gpListener = new GpsStatus.Listener() {
@Override
public void onGpsStatusChanged(int event) {
gpsStatus = locationManager.getGpsStatus(null);
if(event == GpsStatus.GPS_EVENT_FIRST_FIX){
firstTime = gpsStatus.getTimeToFirstFix();Log.i(TAG, "第一次耗时" + firstTime);
Toast.makeText(MainActivity.this,"耗时"+String.valueOf(firstTime),Toast.LENGTH_LONG).show();
maxSatellites = gpsStatus.getMaxSatellites();Log.i(TAG,"卫星数"+maxSatellites);
}
}
};
*/
/**
* Criteria类表示应用程序选择一个标准位置提供者。供应商可能要求根据精度,用电,能力报告高度,速度,和方向,费用
*/
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
criteria.setAltitudeRequired(true);//设置Provider是否需要高度信息。海拔
criteria.setBearingRequired(true);//设置Provider是否需要方位信息。方向
criteria.setSpeedRequired(true);//允许访问速度
criteria.setCostAllowed(true);//设置Provider是否产生费用
criteria.setPowerRequirement(Criteria.POWER_HIGH);//设置电量消耗等级
String provider = locationManager.getBestProvider(criteria, true);// 根据Criteria返回最适合的LocationProvider
/**
* 判断权限是否允许
*/
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);//通过GPS进行定位
updataToNewLocation(location);
/**
* 设置监听器,自动更新最小的时间为间隔N秒(1秒 = 1*1000)
*/
locationManager.requestLocationUpdates(provider,3000,1,locationListener);
}
private void updataToNewLocation(Location location){
TextView textView1;
textView1 = (TextView)this.findViewById(R.id.GPS_State);
if(location != null){
double lon = location.getLongitude();Log.i(TAG, "经度 " + lon);
double lat = location.getLatitude();Log.i(TAG, "纬度 " + lat);
double high = location.getAltitude();Log.i(TAG, "海拔 " + high);
float accuracy = location.getAccuracy();Log.i(TAG, "精确度:" + accuracy);
double speed = location.getSpeed();Log.i(TAG,"速度 " + speed);
double direction = location.getBearing();Log.i(TAG,"方向:"+direction);
long time = location.getTime();Log.i(TAG, "时间 " + time);
String provider = location.getProvider();Log.i(TAG,"提供者"+provider);
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date(time+(28800000));//8小时*60分钟*60秒*1000毫秒
String TIME;
TIME = format.format(date);
textView1.setText("经度:" + lon + "\n纬度:" + lat + "\n海拔:" + high + "\n速度:" + speed + "\n时间:"
+ TIME+"\n方向:"+direction+"\n精确度:"+String.valueOf(accuracy)+"\n数据提供者:"+provider/*+"\n定位耗时:"+firstTime+"\n卫星:"+maxSatellites*/);
}else {textView1.setText("没有位置信息!!!");}
}
private final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if(location != null){
Log.i(TAG,""+location.getLatitude()+location.getLongitude());
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
};
/**
* 双击Back退出
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
if((System.currentTimeMillis() - ExitTime)>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT).show();
ExitTime = System.currentTimeMillis();
}else {
finish();
onDestroy();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}
还有一些方法没用 ,今天不想弄了。
下边是GpsStatus类中的:
获取首次连接GPS的耗时 public int getTimeToFirstFix()
获取最大卫星数量 public int getMaxStatellites()
获取GPS的卫星状态 public iterable<GpsStatellite> getStatellies()
下边是GpsStatellite类:
获取方位角 public float getAzimuth()
获取高度角 public float getElevation()
获取伪随机数 public int getprm()
获取信噪比 publci float getSnr()
源代码:
http://download.csdn.net/detail/csdnhejingzhou/9448489