如何在GPS和网络提供商之间切换?

5

在我的应用程序中,我希望同时使用两种定位提供程序。

也就是说,如果 GPS 被禁用,我希望我的应用程序切换到网络,并在启用 GPS 时切换回来。

我正在使用两个 LocationListener 来处理这两个请求。

public void onStatusChanged(String provider, int status,Bundle extras) 
    switch (status) {
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
             ......
            break;
        case LocationProvider.OUT_OF_SERVICE
             .....
            break;
        case LocationProvider.AVAILABLE
             .....
            break;   
}

在每个侦听器中,我在onStatusChanged()中检测这些状态。结果证明,这个方法将在第一次改变(禁用网络)时使用,但当我再次启用网络时,它什么都不显示。为什么会这样?侦听器不会一直检测状态吗?
请帮帮我,最好能够将解决方案发布为代码...谢谢!

大家好,新的解决方案是用户370305和Fedor的工作的结合。Fedor在初始化和选择正确的位置提供程序方面做得非常出色。在用户370305的帮助下,我们可以启动一个线程来检测网络/GPS状态。因为如果你执行removeUpdates(),监听器将不再起作用。所以,case LocationProvider.AVAILABLE是无用的。你只能使用线程来发出新的请求。(我知道这不是一个很好的解决方案,所以如果你有更好的解决方案,请告诉我,我会很乐意看到的!谢谢!) - alvan
2个回答

4

这是我的工作内容:

public class LocationActivity extends Activity implements LocationListener{

    private TextView latituteField;
    private TextView longitudeField;
    private LocationManager locationManager;
    private String provider;
    private TextView outputField;
    private Location location;
    private ScrollView scrollView;
    private Criteria criteria;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);

        latituteField = (TextView) findViewById(R.id.lat_textView);
        longitudeField = (TextView) findViewById(R.id.long_textView);
        outputField = (TextView) findViewById(R.id.output_textView);
        scrollView = (ScrollView) findViewById(R.id.scrollView1);

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

        criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);

        List<String> providers = locationManager.getProviders(criteria, true);
        outputField.append("Providers available..." + "\n");
        for (String provider : providers) {
            outputField.append(provider + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }

        provider = locationManager.getBestProvider(criteria, true);
        locationManager.requestLocationUpdates(provider, 400, 1, this);

        if (provider != null) {
            outputField.append("Provider " + provider + " has been selected." + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);

            if (location != null) {
                onLocationChanged(location);
            } else {
                latituteField.setText("Location not available");
                longitudeField.setText("Location not available");
            }
          } else {
            outputField.append("No provider selected" + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
          }
    }

    @Override
      protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
      }

    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
      }

    @Override
    public void onLocationChanged(Location location) {
        double lat =location.getLatitude();
        double lng =location.getLongitude();
        latituteField.setText(String.valueOf(lat));
        longitudeField.setText(String.valueOf(lng));
        outputField.append("New Location: " + String.valueOf(lat) + " " + String.valueOf(lng) + "\n");
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);
    }

    @Override
    public void onProviderDisabled(String dProvider) {
        outputField.append("Provider " + dProvider + " has been disabled." + "\n");
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);

        provider = locationManager.getBestProvider(criteria, true);
        locationManager.requestLocationUpdates(provider, 400, 1, this);

        if (provider != null) {
            outputField.append("Provider " + provider + " has been selected." + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);

            if (location != null) {
                onLocationChanged(location);
            } else {
                latituteField.setText("Location not available");
                longitudeField.setText("Location not available");
            }
          } else {
            outputField.append("No provider selected" + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
          }
    }

    @Override
    public void onProviderEnabled(String eProvider) {
        outputField.append("Provider " + eProvider + " has been enabled." + "\n");
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);

        provider = locationManager.getBestProvider(criteria, true);
        locationManager.requestLocationUpdates(provider, 400, 1, this);

        if (provider != null) {
            outputField.append("Provider " + provider + " has been selected." + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);

            if (location != null) {
                onLocationChanged(location);
            } else {
                latituteField.setText("Location not available");
                longitudeField.setText("Location not available");
            }
          } else {
            outputField.append("No provider selected" + "\n");
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
          }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        outputField.append("Provider " + provider + " status changed to: " + Integer.toString(status) + "\n");
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);
    }
}

2

我认为Fedor的工作只是确定了在初始化阶段可以使用哪个提供程序。你是说我应该新建一个线程来检测isProviderEnabled吗? - alvan
好的,如果安卓手机没有网络连接,如何将提供者切换到GPS_provider?请查看我的答案,并告诉我是否对您有帮助。 - user370305
谢谢,你的代码给了我提示,我应该启动一个线程来检查CONNECTIVITY_SERVICE。 - alvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接