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

Android 如何在GPS和网络提供商之间切换?,android,networking,gps,location,Android,Networking,Gps,Location,在我的应用程序中,我想使用两个位置提供商 这意味着,如果gps被禁用,我希望我的应用程序切换到网络,并在启用gps后将其切换回网络 我使用两个LocationListener来处理这两个请求 public void onStatusChanged(String provider, int status,Bundle extras) switch (status) { case LocationProvider.TEMPORARILY_UNAVAILABLE:

在我的应用程序中,我想使用两个位置提供商

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

请帮助我,这将是最好的张贴在代码你的解决方案…谢谢

你的答案在这里。在这个例子中,Fedor很好地解释了如何在位置提供者之间切换

谢谢。

我就是这么做的:

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);
    }
}
公共类LocationActivity扩展活动实现LocationListener{
私有文本视图latituteField;
私有文本视图纵向字段;
私人场所经理场所经理;
私有字符串提供者;
私有文本视图输出字段;
私人位置;
私有滚动视图滚动视图;
私人准则;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_位置);
LattuteField=(TextView)findViewById(R.id.lat_TextView);
longitudeField=(TextView)findViewById(R.id.long\u TextView);
outputField=(TextView)findViewById(R.id.output\u TextView);
scrollView=(scrollView)findViewById(R.id.scrollView1);
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
标准=新标准();
标准.设定准确度(标准.准确度/精细度);
List providers=locationManager.getProviders(标准,true);
append(“提供程序可用…”+“\n”);
for(字符串提供程序:提供程序){
追加(提供程序+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
受保护的void onResume(){
super.onResume();
locationManager.requestLocationUpdates(提供者,400,1,this);
}
受保护的void onPause(){
super.onPause();
locationManager.RemoveUpdate(此);
}
@凌驾
已更改位置上的公共无效(位置){
双纬度=location.getLatitude();
double lng=location.getLongitude();
latituteField.setText(String.valueOf(lat));
longitudeField.setText(字符串值(lng));
append(“新位置:”+String.valueOf(lat)+“+String.valueOf(lng)+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
@凌驾
公共无效onProviderDisabled(字符串dProvider){
append(“提供程序”+dProvider+”已被禁用。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
公共无效onProviderEnabled(字符串eProvider){
append(“提供程序”+eProvider+”已启用。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
outputField.append(“提供程序”+提供程序+”状态更改为“+Integer.toString(状态)+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}

我认为Fedor的工作刚刚确定了在初始化阶段可以使用哪个提供者。你是说我应该新建一个线程来检测
isProviderEnabled
?好的,在这里看看我的答案。谢谢,你的代码提示我应该启动一个线程来检查连接。伙计们,新的解决方案