2011-11-08 4 views
5

私のアプリでは、私は両方の場所プロバイダを使用したいと思います。GPSとネットワークプロバイダを切り替えるにはどうすればよいですか?

つまり、gpsが無効になっている場合、私のアプリをネットワークに切り替えることができ、gpsでスイッチバックを有効にすることができます。

私はこれらの2つの要求を処理するために2つの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()'を実行すると、リスナーは動作しなくなるためです。だから、 'case LocationProvider.AVAILABLE'は役に立たない。あなたは新しいリクエストをするためにスレッドを使用することしかできません(私はそれが良いものではないことを知っていますので、より良い解決策があれば、私に教えてください、私はそれを見るのが大好きです!!ありがとう!) – alvan

答えて

2

あなたの答えはWhat is the simplest and most robust way to get the user's current location in Android?です。このFedorでは、ロケーションプロバイダを切り替える方法の例をうまく説明しました。

ありがとうございました。

+0

Fedorの作業は、初期化フェーズでどのプロバイダを使用できるかを確認したばかりだと考えています。あなたは 'isProviderEnabled'を検出するスレッドを新しくすべきだと言っていますか? – alvan

+0

OK、[アンドロイド携帯電話にインターネット接続がない場合、プロバイダをGPS_providerに切り替えるにはどうすればいいですか?](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); 
    } 
} 
関連する問題