2012-12-11 3 views
5

OK、私はこのウェブサイトだけでなく、検索と読書に多くの時間を費やしました。ほとんどのスレッドはGPSを処理したり、エミュレータで動作させようとします。 developer.android.comのドキュメントでは、ポイントまでしか説明していません。私は仕事が簡単ではありません。この問題を抱えているほとんどの人のように、私はちょうどネットワークプロバイダから最後に知られている場所を取得したいと思います。私はGoogleマップを使用した直後(GPSがオフになったのでネットワークプロバイダを使用しています)わずか1/8~1/4マイル離れたところにあります。それで、 "プロバイダ"(携帯電話のタワー/ Wi-Fiがオンになっている場合)がGoogleマップの修正を取得しています。私は私のアプリを試して、最後の知られている場所を取得することはできません。私はマップでそれを表示しようとしていない、私はそれが位置を取得するためにボタンを押した後に、画面に緯度と経度を印刷することです。ドキュメントでは、同じアクティビティから最後の場所を作成する必要はありません。指定されたプロバイダから最後に知られている場所を返します。私はNETWORK_PROVIDERを指定しています。ドキュメントにはセルタワーとWi-Fiがあります。 (そして、はい、私はマニフェストでそれをカバーしています)電話でNETWORK_PROVIDERからgetLastKnownLocationを入力するとヌルが返されます。

これはどのように動作するのですか?私はまだGoogleのサイトでも良い説明を見ています。あなたが言うことができないなら、私は不満です。それは明らかに私がやっていること(またはそうではない)なので、私の必要性にはあまりにも足りないドキュメンテーションを除いて、私は誰か/誰かを責めることはない。

更新:現在、ロケーションリスナーを使用していて、ロケーションを取得しています。私は最後のロケーションを推測しています。ロケーションリスナーを介してロケーション更新を開始せずに最後のロケーションを取得できることは論理的ですが、私はそうではありませんでしたが、今はロケーションリスナーと一緒にいます。

私の問題は私が場所を変更することができないということです。私のコードは、リスナーを介して位置情報の更新を試みることを除いて、現在何もしていません。また、最後に知られている位置を取得するためにボタンを押すこともできます。 Googleマップで私の現在地が表示されますが、私は自分のコードで20マイル離れた場所を探し続けています。私は実際に新しい場所を取得している可能性があるという気持ちがありますが、最終的な/静的な宣言の誤った使用により、必要なときにその場所を保存して使用することができない場合があります。私のマニフェストはインターネットとfine_locationパーミッションを持ち、アクティビティのxmlはうまくいきます - 場所のライブ検索をオン/オフするボタン、lastknownlocationを手動で取得するボタン、緯度と経度を表示するためのテキストビューを提供します。私は、これが長すぎるのを避けるために、本質的でないものを取り除こうとしました。

public class RMain extends Activity { 

public boolean islivesearchon; 
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters 
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters 

private static Location currentlocation; 
private LocationManager locationManager; 
private LocationListener locationListener; 
public static Criteria criteria; 
public TextView latview; 
public TextView longview; 

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

    latview = (TextView) findViewById(R.id.display_latitude); 
    longview = (TextView) findViewById(R.id.display_longitude); 

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

    // setup bestProvider 
    criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestprovider = locationManager.getBestProvider(criteria, true); 

    // get an initial current location 
    currentlocation = locationManager.getLastKnownLocation(bestprovider); 
    latview.setText(Double.toString(currentlocation.getLatitude())); 
    longview.setText(Double.toString(currentlocation.getLongitude())); 

    // Define locationListener interface 
    locationListener = new LocListener(); 

    // React to LiveSearch toggle button press 
    final Button livesearch = (Button) findViewById(R.id.button_livesearch); 
    livesearch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      TextView livesearchview = (TextView) findViewById(R.id.button_livesearch); 
      boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
      boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      if(islivesearchon) { 
       locationManager.removeUpdates(locationListener); 
       islivesearchon = false; 
       livesearchview.setText("Live Search is OFF"); 
      } 
      else { 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isNetEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isGpsEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
      } 
     } 
    }); 

    // Respond to Get Location button click to get last known location 
    final Button getlocation = (Button) findViewById(R.id.button_getlocation); 
    getlocation.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      String bestprovider = locationManager.getBestProvider(criteria, true); 
      Location lastlocation = locationManager.getLastKnownLocation(bestprovider); 

      latview.setText(Double.toString(lastlocation.getLatitude())); 
      longview.setText(Double.toString(lastlocation.getLongitude())); 
     } 
    }); 

} 

private class LocListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location latestlocation) { 
     // Called when a new location is found by the network location provider. 
     currentlocation.set(latestlocation); 
     latview.setText(Double.toString(currentlocation.getLatitude())); 
     longview.setText(Double.toString(currentlocation.getLongitude())); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onProviderDisabled(String provider) {} 
}; 

}

+1

あなたの携帯電話の中でシムはありますか? –

+1

アプリケーションを最初に起動した時点で任意の場所を設定してから、getLastKnownLocationを取得してください。 –

+0

ありがとうございます。はい、私は自分の電話の中でシムだけ - Eclipseのエミュレータは、常に私のために適切に実行されていません。 – crispy

答えて

7

onLocationChangeが呼び出されたら、それ以降は古い値を使用して最後の既知の場所を取得できます。

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

     location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location != null) { 

      old_latitude=location.getLatitude(); 
      old_longitude=location.getLongitude(); 
      Log.d("old","lat : "+old_latitude); 
      Log.d("old","long : "+old_longitude); 

      this.onLocationChanged(location); 
     } 
+0

私はまだonlocationchangeメソッドを入れていません。ドキュメントで説明されているように、NETWORK_PROVIDERから最後の既知の場所を取得できるはずですが、それも取得できません。私は今すぐすべてに行き、最後、最善、最新などに基づいて場所を取得するためのすべてのコードを入れて、それがどうなるか見てみようと思います。私はJAVAを勉強しており、ドキュメンテーションがそうするべきであるように聞こえるようにしようとするのは、ちょっとイライラしています。私はこの単純なコマンドを抜けても、他の場所のものをすべて忘れることができないと思います... – crispy

+0

これは一度onlocationchanged()を使用すると、その後、毎回最後のknownlocation()が取得されます。場所が再び変わるまでこれは確かに動作します:) – Rahul

4

サービスは設定で無効になっているとき、それはだからそれはかなり頻繁に発生する可能性がネットワークを介して、場所とセキュリティ>場所

>「nullを」を返します。

+0

ありがとうございます。私の電話には、現在選択されていない「スタンドアロンGPSサービス」とチェックされている「VZWロケーションサービス」(Verizonが提供するロケーションサービス)がチェックされた「Googleロケーションサービス」があります。再び、Googleはwi-fiの有無にかかわらず(Wi-Fiの方が良い)、GPSなしで修正を得る予定です。私はすぐに私のアプリに入ると、私は最後の場所を取得することはできません - 常に0.0緯度と0.0長い。私はそれが指定されたプロバイダからMYアプリケーションが取得した最後の場所を提供していると思っています。私は誰かがセキュリティ上の理由によりこれが起こった可能性があると言及した別のスレッドを見つけました。 – crispy

+0

私のansにしてください。質問を閉じる –

+0

良い答え..私はMicromaxとSamsungでこれをテストしました。完璧。 – Siddharth

関連する問題