GPSDmeo
来源:互联网 发布:人工智能发展史 知乎 编辑:程序博客网 时间:2024/05/16 17:32
权限:<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
0 0