Android 有没有可能通过gps或glonass知道我的位置?

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

假设设备同时支持gps和glonass(硬件级支持)

现在,当我通过android.location API获取位置信息时,是否有可能知道该位置的硬件来源


如果我们像这样使用
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();
    }
}