获取定位信息,测试前先确定打开,位置信息
package com.example.testactivity.service;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.cosofteck.Can;
import com.cosofteck.CanFrame;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
/*
* GPS 经纬�? 海拔 星数等信息的获取
* @author Ting9
* @Date 20180609
*/
public class GpsService extends Service {
public static Location mLocation = null; // new Location("");
/* GPS相关的数据的全局变量 */
private String longitude = " "; // 经度
private String latitude = " "; // 纬度
private String bearing = " "; // 方位
private String altitude = " "; // 海拔
private String satelliteNum = " "; // 卫星数目
private String gpsSpeed = " "; // 速度
private String gpsTime = " "; // GPS时间
private LocationManager locationManager;
private String provider;
public static GpsService gpsService = null;
class GpsDataAcquire extends Binder {
public GpsService getServiceInstance() {
// 返回实例
return GpsService.this;
}
public String getLongitude() {
return longitude;
}
public String getLatitude() {
return latitude;
}
public String getBearing() {
return bearing;
}
public String getAltitude() {
return altitude;
}
public String getSatelliteNum() {
return satelliteNum;
}
public String getGpsSpeed() {
return gpsSpeed;
}
public String getGpsTime() {
return gpsTime;
}
}
@Override
public IBinder onBind(Intent intent) {
// 此处如果不返回一个Binder实例,onServiceConnected不会调用
return new GpsDataAcquire();
}
@Override
public void onCreate() {
super.onCreate();
gpsService = this;
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 获取有效的provider,并显示出来
List<String> providerList = locationManager.getProviders(true);
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
return;
}
// 获取�?后一次定位信�?
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
System.out.println("location 有值-----");
showLocation(location); //返回位置信息
}
System.out.println("位置信息 ==== " + location);
// gps位置监听设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0�?
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
// GPS状�?�监控,设置状�?�监听回调函数,statusListener是监听的回调函数
locationManager.addGpsStatusListener(statusListener);
// CanStart();
}
// CAN 连接
// public void CanStart() {
// TODO Auto-generated method stub
// 设置比特率
// Can.SetBitrate(250000);
// Can.Start();
// System.out.println("CAN 连接---");
// 接收数据线程
// Can.ReadInit(29, 3, 1); // 接收初始化
// }
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
// --------------------------
@Override
public void onDestroy() {
if (locationManager != null) {
locationManager.removeUpdates(locationListener);
}
super.onDestroy();
}
// 卫星信号
private List<GpsSatellite> numSatelliteList = new ArrayList<GpsSatellite>();
// GpsStatus监听器,处理卫星返回的数�?
private final GpsStatus.Listener statusListener = new GpsStatus.Listener() {
// GPS状�?�变化时的回调,如卫星数
public void onGpsStatusChanged(int event) {
// GPS状�?�变化时的回调,获取当前的状�?
GpsStatus status = locationManager.getGpsStatus(null); // 取当前状�?
// 自己编写的方法,获取卫星状�?�相关数�?
updateGpsStatus(event, status);
}
};
/*
* 获取搜索到的卫星 获取搜索到的卫星数目,主要是通过status.getSatellites()实现。
* 获取到的GpsSatellite对象�? 保存到一个队列里面,用于后面刷新界面。上面是获取GPS状�?�监听器,
* 除了GPS状�?�外,我们还�?要监听一个服务, 就是:LocationListener,定位监听器,监听位置的变化
*/
private String updateGpsStatus(int event, GpsStatus status) {
StringBuilder sb2 = new StringBuilder("");
if (status == null) {
sb2.append("搜索到卫星个数:" + 0);
} else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
// 获取�?大的卫星�?(预设�?)
int maxSatellites = status.getMaxSatellites();
Iterator<GpsSatellite> it = status.getSatellites().iterator();
numSatelliteList.clear();
// 记录实际的卫星数
int count = 0;
while (it.hasNext() && count <= maxSatellites) {
// 保存卫星的数据到�?个队列,用于刷新界面
GpsSatellite s = it.next();
numSatelliteList.add(s);
count++;
}
sb2.append("搜索到卫星个数:" + numSatelliteList.size());
}
satelliteNum = numSatelliteList.size() + ""; // 卫星数目
return sb2.toString();
}
/*
* LocationListener,定位监听器,监听位置的变化 获取到当前的GPS数据。另外我们可以�?�过回调函数提供的location参数�? 获取GPS的地理位置信息,包括经纬度经度、海拔等信息�?
*/
LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// Provider的状态在可用、暂时不可用和无服务三个状�?�直接切换时触发此函�?
}
@Override
public void onProviderEnabled(String provider) {
// Provider被enable时触发此函数,比如GPS被打�?
}
@Override
public void onProviderDisabled(String provider) {
// Provider被disable时触发此函数,比如GPS被关�?
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
// 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触�?
showLocation(location);
mLocation = location;
}
};
/*
* 通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度经度、海拔等信息
*/
/**
* @param location
*/
private void showLocation(Location location) {
// 时间
long GpsTime = location.getTime();
// 利用Date进行时间的转�?
Date date = new Date(GpsTime);
location.getExtras().putString("LOCATION_PROVIDER", "GPS_CFG_GPS");
// 用于格式化十进制数字
DecimalFormat df = new DecimalFormat();
df.applyPattern("###.000000");
// 经度
longitude = df.format(location.getLongitude());
// 纬度
latitude = df.format(location.getLatitude());
System.out.println("经度 == " + longitude + " 纬度 == " + latitude);
if (location.getSpeed() < 2) {
df.applyPattern("####0.00");
// 方向
bearing = df.format(0) + "";
} else {
// 方位
bearing = location.getBearing() + "";
}
// 海拔
altitude = location.getAltitude() + "";
df.applyPattern("####0.00");
// GPS速度
gpsSpeed = df.format(location.getSpeed()* 3.6) + ""; //m/s ---> km/h
// GPS时间
gpsTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
}
MainActivity中开启:
package com.explme.Activity;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "starttest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this, GpsService.class);
startService(intent);
Log.d(TAG, "onCreate0");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
清单文件中;注册GPS
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testactivity"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" /> <!-- 互联网 -->
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher_camera"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testactivity.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.example.testactivity.GpsService"
android:launchMode="singleTask" >
</service>
</application>
</manifest>
转载自原文链接, 如需删除请联系管理员。
原文链接:Android 基于4G模块 GPS定位,转载请注明来源!