如何从Gps切换到网络提供商?

时间:2015-05-29 15:35:32

标签: android gps

需要一些帮助。我正在创建一个应用程序,我从gps或网络提供商处获取位置更新。如果没有启用gps,那么我给了按钮以启用gps。现在我需要做的是从gps获取更新,如果gps无法获得信号,那么我切换到网络提供商并进行位置更新,一旦gps可用,再次切换到gps并计算距离用户已经旅行过。我有多个问题。

  

getProvider和getBestProvider方法有什么作用?我认为它提供了手机可用的最佳提供商(如果我错了,请纠正我)以及如何使用它来获取位置更新。

     

我需要知道用户启动应用时启用了哪些提供商。我怎样才能做到这一点?我使用了isProviderEnabled,但在启用或禁用wifi时却感到困惑,它什么都没给我。

     

如果未启用gps,我尝试了一些条件,然后切换到网络提供商,但这没有做任何事情。我阅读了很多关于此的帖子,但无法弄清楚如何在我的代码中使用它。任何帮助将不胜感激。谢谢。这是我的代码。

public class MainActivity extends Activity {
public boolean getLocation() {

    try {
        isGps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
    }
    try {
        isNetwork_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
    }

    //don't start listeners if no provider is enabled
    if (!isGps_enabled && !isNetwork_enabled)
        return false;

    if (isGps_enabled)
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    if (isNetwork_enabled)
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    return true;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    accu = (TextView) findViewById(R.id.accu);
    speed1 = (TextView)findViewById(R.id.speed);
    t = (TextView)findViewById(R.id.t);
    prevLatLon = (TextView) findViewById(R.id.prevLatLon);
    distance = (TextView)findViewById(R.id.distance);
    listView = (ListView)findViewById(R.id.listView);
    listText = (TextView)findViewById(R.id.listText);
    settings = (Button)findViewById(R.id.settings_button);
    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    });

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    List<String> providers = locationManager.getProviders(criteria, true);
    for (String provider: providers){
        distance.setText("Providers: " + provider);
    }
    provider = locationManager.getBestProvider(criteria, false);

    /*isGps_enabled = locationManager.isProviderEnabled(provider);
    Toast.makeText(this, isGps_enabled + "", Toast.LENGTH_SHORT).show();

    isNetwork_enabled = locationManager.isProviderEnabled(provider);
    Toast.makeText(this, isNetwork_enabled + "", Toast.LENGTH_SHORT).show();*/

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location loc) {
            //locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

            getLocation();
            int accuracy = (int) loc.getAccuracy();
            speed = (int) loc.getSpeed();

            accu.setText("Accuracy: " + accuracy);
            speed1.setText("Speed: " + speed);
            t.setText("Time: " + loc.getTime());

            listView.setAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.activity_simplelist, R.id.listText, list));

            DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            Date date = new Date(loc.getTime());
            String formatted = format.format(date);

            if (flag == 0) {
                latitude = loc.getLatitude();
                longitude = loc.getLongitude();
                speed = (int) loc.getSpeed();
                time = formatted;
                distanceInMeters = 0;
                distanceTo = 0;
                distanceBetween = 0;
                timestamp = loc.getTime();
                timestampmsec = 0;
                hours = 0;
                minutes = 0;
                seconds = 0;
                startTime = loc.getTime();

                flag = 1;
                list.add("latitude: " + latitude + " longitude: " + longitude +
                        " \nspeed: " + speed + " Time: " + time + "\nDistance: " + distanceInMeters + " meters"
                        + "\ntimestamp: " + timestamp);
            }

            else {
                prevLatitude = latitude;
                prevLongitude = longitude;
                prevSpeed = speed;
                prevTime = time;
                prevDistanceInMeters = distanceInMeters;
                prevDistanceTo = distanceTo;
                prevDistanceBetween = distanceBetween;
                //prevTimestamp = timestamp;
                prevTimestampmsec = timestampmsec;
                prevHours = hours;
                prevMinutes = minutes;
                prevSeconds = seconds;

                prevLatLon.setText("Previous Latitude: " + prevLatitude + "\nPrevious Longitude: " + prevLongitude +
                        " \nPrevious speed: " + prevSpeed + " \nTime: " + prevTime + "\nPrevious Timestamp: " + prevTimestamp);

                latitude = loc.getLatitude();
                longitude = loc.getLongitude();
                speed = (int) loc.getSpeed();
                time = formatted;
                timestamp = loc.getTime();

                if (loc.hasSpeed()) {
                    Toast.makeText(MainActivity.this, "true", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "false", Toast.LENGTH_SHORT).show();
                }

                getDistance();
                distanceTo = androidDistanceTo(prevLatitude, prevLongitude, latitude, longitude);
                Location.distanceBetween(prevLatitude, prevLongitude, latitude, longitude, results);
                distanceBetween = results[0];

                list.add("latitude: " + latitude + " longitude: " + longitude +
                        " \nspeed: " + speed + " Time: " + time + "\nDistance: " + distanceInMeters + " meters"
                        + "\nTimestamp: " + timestamp);

                speed = prevSpeed + speed;
                distanceInMeters = prevDistanceInMeters + distanceInMeters;
                distanceTo = prevDistanceTo + distanceTo;
                distanceBetween = prevDistanceBetween + distanceBetween;

                timestampmsec = (long) (timestamp - startTime);
                seconds = TimeUnit.MILLISECONDS.toSeconds(timestampmsec);

                if(seconds >= 60) {
                    minutes = (int) seconds / 60;
                    seconds = seconds % 60;
                }

                if(minutes >= 60){
                    hours = (int) minutes / 60;
                    minutes = minutes % 60;
                }

            }

            distance.setText("Distance: " + distanceInMeters + " meters" + "\nDistanceTo: " + distanceTo + " meters" +
                    "\nDistanceBetween: " + distanceBetween + " meters" + "\nTime: " + hours + " hours " +
                    minutes + " minutes " + seconds + " seconds");

            Toast.makeText(MainActivity.this, "Location Changed", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onProviderDisabled(String arg0) {
            //TODO auto generated method stub
            Toast.makeText(MainActivity.this, provider + " disabled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderEnabled(String arg0) {
            //TODO auto generated method stub
            Toast.makeText(MainActivity.this, provider + " enabled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            //TODO auto generated method stub
        }
    };
}

public void getDistance(){
    double dLat = Math.toRadians(latitude - prevLatitude);
    double dLon = Math.toRadians(longitude - prevLongitude);
    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(Math.toRadians(prevLatitude))
            * Math.cos(Math.toRadians(latitude)) * Math.sin(dLon / 2)
            * Math.sin(dLon / 2);
    double c = 2 * Math.asin(Math.sqrt(a));
    distanceInMeters = (6372800 * c);
}

public static double androidDistanceTo(double lat_a, double lng_a, double lat_b, double lng_b) {
    Location locationA = new Location("Point A");
    locationA.setLatitude(lat_a);
    locationA.setLongitude(lng_a);

    Location locationB = new Location("Point B");
    locationB.setLatitude(lat_b);
    locationB.setLongitude(lng_b);

    return (locationA.distanceTo(locationB));
}

public void resetButton(View view) {
    list.clear();
    listView.setAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.activity_simplelist, R.id.listText, list));
}

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 30000, 0, locationListener);
}

@Override
protected void onPause() {
    super.onPause();
    //locationManager.removeUpdates(locationListener);
} 

1 个答案:

答案 0 :(得分:1)

getBestProvider执行以下操作:

  

返回最符合给定条件的提供程序的名称。   仅允许通过调用访问的提供程序   活动将被退回。如果有几家提供商符合标准,那么   返回最准确的一个。如果没有提供商满足   标准,标准按以下顺序放宽:功率要求,精度,方位,速度,高度

getProvider执行以下操作:

  

返回与该位置提供者关联的信息   给定名称,如果该名称不存在提供者,则返回null。

以外行人的术语,您选择getProvider的提供者,系统选择提供者getBestProvider

通过查看isProviderEnabled

,您可以了解哪些提供商已启用

启动监听器的代码看起来很好。但是,您实际上不会在getLocation()onResume()之外的任何地方拨打onLocationChanged()您需要将该呼叫从onLocationChanged()移出并将其置于onCreate()的末尾}