简体   繁体   English

如何从 android 获取卫星信息?

[英]How to get information about the satellites from android?


I am trying to get the satellite information from the android and wrote this following code which is not giving any results, could any one point out why is it so?我正在尝试从 android 获取卫星信息,并编写了以下代码,但没有给出任何结果,有人能指出为什么会这样吗?

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gps);

    final LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    GpsStatus gpsStatus = locationManager.getGpsStatus(null);
    if(gpsStatus != null)
    {
         Iterable<GpsSatellite>satellites = gpsStatus.getSatellites();
         Iterator<GpsSatellite>sat = satellites.iterator();
         int i=0;
         while (sat.hasNext()) {
             GpsSatellite satellite = sat.next();


             strGpsStats+= (i++) + ": " + satellite.getPrn() + "," + satellite.usedInFix() + "," + satellite.getSnr() + "," + satellite.getAzimuth() + "," + satellite.getElevation()+ "\n\n";
         }
     }
     TextView tv = (TextView)(findViewById(R.id.Gpsinfo));
     tv.setText(strGpsStats);
}

thanks谢谢
Nohsib诺西布

According to the docs for LocationManager.getGpsStatus(...) ...根据LocationManager.getGpsStatus(...)的文档 ...

This should only be called from the onGpsStatusChanged(int) callback to ensure that the data is copied atomically.这只应从onGpsStatusChanged(int)回调中调用,以确保以原子方式复制数据。

Try implementing GpsStatus.Listener on your Activity and overriding onGpsStatusChanged(int) .尝试在您的 Activity 上实现GpsStatus.Listener并覆盖onGpsStatusChanged(int) Example...例子...

public class MyActivity extends Activity implements GpsStatus.Listener {

    LocationManager locationManager = null;
    TextView tv = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gps);

        tv = (TextView)(findViewById(R.id.Gpsinfo));
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.addGpsStatusListener(this);
    }

    @Override
    public void onGpsStatusChanged(int) {
        GpsStatus gpsStatus = locationManager.getGpsStatus(null);
        if(gpsStatus != null) {
            Iterable<GpsSatellite>satellites = gpsStatus.getSatellites();
            Iterator<GpsSatellite>sat = satellites.iterator();
            int i=0;
            while (sat.hasNext()) {
                GpsSatellite satellite = sat.next();
                strGpsStats+= (i++) + ": " + satellite.getPrn() + "," + satellite.usedInFix() + "," + satellite.getSnr() + "," + satellite.getAzimuth() + "," + satellite.getElevation()+ "\n\n";
            }
            tv.setText(strGpsStats);
        }
    }
}

Try this:尝试这个:

 LocationManager locmgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
     //locmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10L, 5.0f, this);
     Location location = locmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);

     if ( location == null ) {
         location = locmgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

     }
     if ( location == null ) {
         location = locmgr.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

     }

Let me know if any issue.让我知道是否有任何问题。

GpsStatus.Listener is deprecated. GpsStatus.Listener 已弃用。 You should use LocationListener and GnssStatus.Callback instead.您应该改用 LocationListener 和 GnssStatus.Callback。 Here following code:下面的代码:

import android.content.Context.LOCATION_SERVICE
import android.content.pm.PackageManager
import android.location.GnssStatus
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
...

class YourFragment : LocationListener {
    
    private var mGnssStatusCallback : GnssStatus.Callback? = null
    private lateinit var mLocationManager: LocationManager

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        mLocationManager = requireActivity().getSystemService(LOCATION_SERVICE) as LocationManager

        mGnssStatusCallback = object : GnssStatus.Callback() {
            override fun onStarted() {
                Log.e(TAG, "GnssStatus.Callback onStarted")
                super.onStarted()
            }

            override fun onSatelliteStatusChanged(status: GnssStatus?) {
                Log.e(TAG, "GnssStatus.Callback Status: ${status?.toString()}")
                super.onSatelliteStatusChanged(status)
            }

            override fun onStopped() {
                Log.e(TAG, "GnssStatus.Callback onStopped")
                super.onStopped()
            }

            override fun onFirstFix(ttffMillis: Int) {
                Log.e(TAG, "GnssStatus.Callback onFirstFix $ttffMillis")
                super.onFirstFix(ttffMillis)
            }
        }

        if (ActivityCompat.checkSelfPermission(
                requireContext(),
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            return
        }

        mGnssStatusCallback?.let {
            mLocationManager.registerGnssStatusCallback(it)
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0F, this)
        }

    }

    override fun onDestroyView() {
        mLocationManager.removeUpdates(this)
        mGnssStatusCallback?.let {
            mLocationManager.unregisterGnssStatusCallback(it)
        }

        super.onDestroyView()
    }

    override fun onLocationChanged(location: Location?) {
        Log.e(TAG, "onLocationChanged new Location: ${location.toString()}")
    }

    override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) {
        Log.e(TAG, "onStatusChanged p0 ${p0 ?: "null"} - p1 ${p1}")
    }

    override fun onProviderEnabled(p0: String?) {
        Log.e(TAG, "onProviderEnabled p0 ${p0 ?: "null"}")
    }

    override fun onProviderDisabled(p0: String?) {
        Log.e(TAG, "onProviderDisabled p0 ${p0 ?: "null"}")
    }

}

Note: I have observed that the GnssCallback may arrive in some minutes after you request for Location update.注意:我观察到 GnssCallback 可能会在您请求更新位置后的几分钟内到达。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM