Android 有没有可能通过gps或glonass知道我的位置?
假设设备同时支持gps和glonass(硬件级支持) 现在,当我通过android.location API获取位置信息时,是否有可能知道该位置的硬件来源Android 有没有可能通过gps或glonass知道我的位置?,android,location,Android,Location,假设设备同时支持gps和glonass(硬件级支持) 现在,当我通过android.location API获取位置信息时,是否有可能知道该位置的硬件来源 如果我们像这样使用GPSStatus.Listener: class LocationListener implement LocationListener,GPSStatus.Listener(){ private GPSStatus status; @Override public void onLocation
如果我们像这样使用
GPSStatus.Listener
:
class LocationListener implement LocationListener,GPSStatus.Listener(){
private GPSStatus status;
@Override
public void onLocationChanged(Location location) {
if(status!=null){
//status should be the GPSStatus before get this location
//check the PRN of the satellites from the status
//How it can be granted that the `onGpsStatusChanged` will be called before the `onLocationChanged` by the Android System?
}
}
public void onGpsStatusChanged(int event) {
status = locationManager.getGpsStatus(null);
}
}
该位置的硬件是手机中的GPS/GLONASS芯片。该芯片接收环绕地球运行的卫星发出的信号 GPS和GLONASS卫星在支持这一点的设备上结合使用。要确定GLONASS卫星是否用于确定位置,您可以注册
GpsStatusListener
或调用LocationManager.getGpsStatus()
。对GpsStatus
对象调用getsatellite()
,并对返回列表中的每个GpsSatellite
对象调用getPrn()
。如果该值介于65和88之间,并且usedInFix()
方法返回true
则使用GLONASS卫星计算最后一个位置
正如@DavidWasser所说,我们有可能知道这一点。除了@DavidWasser的答案之外,我还想分享一些代码 您应该具有LocationManager对象:
private LocationManager locationManager;
您可以使用以下命令初始化:
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
使用实现LocationListener,GpsStatus请求位置更新。Listener
类:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
new GPSLocationListener());
GPSLocationListenerClass:
private class GPSLocationListener implements LocationListener,
GpsStatus.Listener {
private boolean isGPSFix;
public void onGpsStatusChanged(int event) {
checkGlonassFeature(); // the method which checks if locations from GLONASS or GPS
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
if (mLastLocation != null)
isGPSFix = (SystemClock.elapsedRealtime() - lastGPStime) < 3000;
if (isGPSFix) { // A fix has been acquired.
Toast toast = Toast.makeText(GPSLocationService.this, "GPS has a fix.", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
} else { // The fix has been lost.
Toast toast = Toast.makeText(GPSLocationService.this, "GPS DOES NOT have a fix.", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
Toast toast = Toast.makeText(GPSLocationService.this, "GPS got first fix.", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
isGPSFix = true;
break;
}
}
@Override
public void onLocationChanged(Location location) {
// Do works here
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
String statusDescription = "unknown";
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
statusDescription = "OUT_OF_SERVICE";
break;
case LocationProvider.AVAILABLE:
statusDescription = "AVAILABLE";
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
statusDescription = "TEMPORARILY_UNAVAILABLE";
break;
}
}
@Override
public void onProviderEnabled(String provider) {
Toast toast = Toast.makeText(GPSLocationService.this, "GPS feature is active", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
@Override
public void onProviderDisabled(String provider) {
Toast toast = Toast.makeText(GPSLocationService.this, "GPS feature is passive", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
私有类GPSLocationListener实现LocationListener,
GpsStatus.Listener{
私有布尔isGPSFix;
公共无效onGpsStatusChanged(内部事件){
checkGlonassFeature();//检查位置是否来自GLONASS或GPS的方法
开关(事件){
案例GpsStatus.GPS\事件\卫星\状态:
如果(mLastLocation!=null)
isGPSFix=(SystemClock.elapsedRealtime()-lastpstime)<3000;
如果(isGPSFix){//已获取修复程序。
Toast Toast=Toast.makeText(GPSLocationService.this,“GPS有一个定位”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}否则{//修复程序已丢失。
Toast Toast=Toast.makeText(GPSLocationService.this,“GPS没有固定位置”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
打破
案例GpsStatus.GPS\u事件\u第一个\u修复:
Toast Toast=Toast.makeText(GPSLocationService.this,“GPS得到第一个修复”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
isGPSFix=true;
打破
}
}
@凌驾
已更改位置上的公共无效(位置){
//你在这里工作吗
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
字符串statusDescription=“未知”;
开关(状态){
案例位置Provider.OUT OF_服务:
statusDescription=“服务中断”;
打破
案例位置Provider.exe提供:
statusDescription=“可用”;
打破
案例位置Provider.u暂时不可用:
statusDescription=“暂时不可用”;
打破
}
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
Toast Toast=Toast.makeText(GPSLocationService.this,“GPS功能处于活动状态”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
Toast Toast=Toast.makeText(GPSLocationService.this,“GPS功能是被动的”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
}
最后是你的控制方法:
public void checkGlonassFeature() {
boolean isGPSFromGlonass = false;
final GpsStatus gs = this.locationManager.getGpsStatus(null);
final Iterable<GpsSatellite> it = gs.getSatellites();
for (GpsSatellite sat : it) {
if(sat.usedInFix()){
if(sat.getPrn() > 65 && sat.getPrn() < 88)
isGPSFromGlonass = true;
else
isGPSFromGlonass = false;
}
else
isGPSFromGlonass = false;
}
if(isGPSFromGlonass){
Toast toast = Toast.makeText(getBaseContext(), "Location from GLONASS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else{
Toast toast = Toast.makeText(getBaseContext(), "Location from GPS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
public void checkGlonassFeature(){
布尔值isGPSFromGlonass=false;
final GpsStatus gs=this.locationManager.getGpsStatus(null);
最终Iterable it=gs.getSatellites();
用于(GpsSatellite卫星:it){
如果(sat.usedInFix()){
如果(sat.getPrn()>65和&sat.getPrn()<88)
isGPSFromGlonass=true;
其他的
isGPSFromGlonass=假;
}
其他的
isGPSFromGlonass=假;
}
if(isGPSFromGlonass){
Toast Toast=Toast.makeText(getBaseContext(),“来自GLONASS的位置”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
否则{
Toast Toast=Toast.makeText(getBaseContext(),“来自GPS的位置”,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
}
请注意,这只是上述答案的补充。
祝你好运。通常,大多数同时支持Glonass和GPS的设备将结合两个星座的测量值来确定位置。你没有得到一个或另一个,你通常得到两个。GPS和Glonass星座的组合将取决于您所在的位置和可见的卫星 正如上面巴图汉所示,判断使用了哪些卫星的方法是浏览报告的卫星列表,找到修复中使用的卫星,然后查看它们的ID号。ID值1至32适用于GPS卫星,65至88适用于Glonass。需要记住的一点是,标准android有一个名为gps.h的脑死亡头文件,它不了解其他星座,比如Glonass,它只喜欢gps。有一个简单的调整,许多制造商在解析从GPS驱动程序中提取的数据时都会这样做,但这需要在应用程序处理器端和GPS驱动程序代码内部完成。你不能一边调整这些东西,另一边却不匹配变化。希望你的设备能有这种变化,这样你就可以看到所有星座的卫星ID号了。
public void checkGlonassFeature() {
boolean isGPSFromGlonass = false;
final GpsStatus gs = this.locationManager.getGpsStatus(null);
final Iterable<GpsSatellite> it = gs.getSatellites();
for (GpsSatellite sat : it) {
if(sat.usedInFix()){
if(sat.getPrn() > 65 && sat.getPrn() < 88)
isGPSFromGlonass = true;
else
isGPSFromGlonass = false;
}
else
isGPSFromGlonass = false;
}
if(isGPSFromGlonass){
Toast toast = Toast.makeText(getBaseContext(), "Location from GLONASS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else{
Toast toast = Toast.makeText(getBaseContext(), "Location from GPS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}