2012-05-09 6 views
23

絶えず位置の更新を確認するルーパを持つ代わりに、GPSに一度アクセスする方法はありますか?GPS Android - 一度だけ測位を取得

私が興味を持っているのは、GPS衛星との連続接続ではなく、現在の座標を見つけることだけです。誰にどのようにこれを行うことができます任意のアイデアを持っていますか?前もって感謝します。

答えて

31

最初に最後に知っている場所が最近のものかどうかを確認します。そうでない場合は、onLocationChangedリスナーを設定する必要があると思いますが、最初に有効な場所を取得すると、常に更新ストリームを停止できます。

追加

public class Example extends Activity implements LocationListener { 
    LocationManager mLocationManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if(location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000) { 
      // Do something with the recent location fix 
      // otherwise wait for the update below 
     } 
     else { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
     } 
    } 

    public void onLocationChanged(Location location) { 
     if (location != null) { 
      Log.v("Location Changed", location.getLatitude() + " and " + location.getLongitude()); 
      mLocationManager.removeUpdates(this); 
     } 
    } 

    // Required functions  
    public void onProviderDisabled(String arg0) {} 
    public void onProviderEnabled(String arg0) {} 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} 
} 
+0

あなたがたを、私はonLocationChangedを設定しました私はちょうど1つの有効な場所を取得したいと思います。更新の流れを止めることはできますか?いくつかのコマンドがありますか?感謝 – progdoc

+0

短い答えはLocationManager.removeUpdates()です。長い答えは、私の更新を参照してください。 – Sam

+0

ありがとうございました – progdoc

7

いけないことがnullまたは古いデータを返すことができたので、getLastKnownLocationを使用しています。

このコードボタンが押されたときにのみ、の位置を取得し、毎回ではありません。人々はすべてのインスタンスに聞く場所リスナーを残すために使用し、はので、私は研究の多くを実行して投稿しているコードスニペットを使用し、バッテリ寿命を殺すこと:正確には、私の質問のthats

// get the text view and buttons from the xml layout 
Button button = (Button) findViewById(R.id.btnGetLocation); 
final TextView latitude = (TextView) findViewById(R.id.textview4); 
final TextView longitude = (TextView) findViewById(R.id.textview5); 
final LocationListener locationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      mlocation = location; 
      Log.d("Location Changes", location.toString()); 
      latitude.setText(String.valueOf(location.getLatitude())); 
      longitude.setText(String.valueOf(location.getLongitude())); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.d("Status Changed", String.valueOf(status)); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.d("Provider Enabled", provider); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.d("Provider Disabled", provider); 
     } 
    }; 

    // Now first make a criteria with your requirements 
    // this is done to save the battery life of the device 
    // there are various other other criteria you can search for.. 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setSpeedRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH); 
    criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH); 

    // Now create a location manager 
    final LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    // This is the Best And IMPORTANT part 
    final Looper looper = null; 

    // Now whenever the button is clicked fetch the location one time 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      locationManager.requestSingleUpdate(criteria, locationListener, looper); 
     } 
    }); 
+0

これは受け入れられる回答である必要があります。すごい仕事。 – seekingStillness