2011-11-08 56 views
5

在我的应用程序中,我想使用两个位置提供程序。如何在GPS和网络提供商之间切换?

这意味着,如果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()的状态。 事实证明,这种方法将用于第一次更改(禁用网络),但是当我再次启用网络时,它不会显示任何内容。为什么?监听器不会一直检测到状态?

请帮助我,最好是在代码中发布您的解决方案...谢谢!

+0

看看我的新评论。 – user370305

+0

伙计们,新的解决方案是user370305和Fedor工作的结合。 Fedor做了很大的工作来初始化和选择合适的位置提供商。并在user370305的帮助下。我们可以启动一个线程来检测网络/ gps状态。因为,如果你执行'removeUpdates()',侦听器将不再工作。所以,'案件LocationProvider.AVAILABLE'是无用的。你只能使用这个线程来提出一个新的请求(我知道它不是一个很好的请求,所以如果你有更好的解决方案,请告诉我,我很乐意看到这个!!谢谢!) – alvan

回答

2

你的答案在这里What is the simplest and most robust way to get the user's current location in Android?。在这Fedor很好地解释了如何在位置提供商之间切换的例子。

谢谢。

+0

I认为Fedor的工作只是确定了在初始阶段可以使用哪个提供商。你是说我应该新建一个线程来检测'isProviderEnabled'吗? – alvan

+0

好吧,[如何切换供应商到GPS_provider如果android手机没有互联网连接?](http://stackoverflow.com/questions/7776049/how-to-switch-provider-into-gps-provider-if- android-phone-doesnt-have-internet/7776108#7776108)在这看我的答案。并让我知道它对你有没有帮助。 – user370305

+0

谢谢,您的代码给出了提示,我应该启动一个线程来检查CONNECTIVITY_SERVICE。 – alvan

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); 
    } 
}