2016-05-19 6 views
2

私は写真を撮るAndroidとiOS用のアプリを開発しています。デバイスの場所を取得し、そのパッケージをサーバーに送信して処理します。CodenameOneのgetCurrentLocationメソッドの違いは何ですか?

デバイスの場所を取得するには、LocationManagerのgetCurrentLocationメソッドのいずれかを使用する必要があることがわかります。しかし、彼らはすべて私に似ているので、私はそれをピックアップしましたが、私はAndroid(KitKat)でそれがうまく動作しないので(後で説明します)、正しいものを選んだかどうかわかりません。

実際、私は最近報告されたように([How to make an immediate reading location using GPS]と同じくらい奇妙な)奇妙なことを経験しました。たとえば、自宅やオフィスに接続してWifiの場所(ただし、屋内)は正確です。私は、このデバイスがネットワーク上でその結果をベースにしていることを理解しました。しかし、私が空を持って5km(40分)離れ、getCurrentLocationまたはgetCurrentLocationAsyncを使用して位置テストを行ったり、タイムアウトを行ったりしても、デバイスは自宅/オフィスの過去の場所を例えば50mの精度で出力します。

また、時計の近くのAndroidのステータスバーに通常表示される場所のアイコンが表示されないことに気付きました。表示させるために、私は、Googleからマップアプリケーションを起動すると、位置アイコンが表示され、私のアプリは、デバイスを見つけることができたことに気づいた。ここで

は私が場所を取得するために使用される最後のメソッドです。今ここに

`public static final void updateGeolocation(){ 
    Location location = null; 
    try { 
     location = LocationManager.getLocationManager().getCurrentLocation(); 
     setLocation(location); 

     setGeolocationAccuracy(location.getAccuracy() > 0.0f ? location.getAccuracy() : DEFAULT_GEOLOCATION_ACCURACY); 
    } catch (IOException e) { 
     setLocation(null); 
     setGeolocationAccuracy(DEFAULT_GEOLOCATION_ACCURACY); 
    } 
}` 

は私が場所にTimerTaskをのおかげで更新する方法である:

// On lance la mise à jour périodique de la position de l'appareil 
    // la tache se lance en dehors de l'EDT 

    ParametresGeneraux.setCheckTimer(new Timer()); 
    ParametresGeneraux.setCheckTask(new TimerTask(){ 

     @Override 
     public void run() { 
      ParametresGeneraux.updateGeolocation(); 

     } 
    }); 
    ParametresGeneraux.getCheckTimer().schedule(ParametresGeneraux.getCheckTask(), 0, ParametresGeneraux.GEOLOCATION_CHECK_INTERVAL); 

NB:私は説明したビルドのヒントについてヒントios.locationUsageDescription とGPSを必要とし、android.captureRecordのヒントを無効にしました。私はそれが必要で、なぜキャプチャレコードが必要なのか疑問を抱かせたくありませんでした。

だから私の質問は以下のとおりです。

  • 私は自分の携帯電話のハードウェアを責めることができるように、私は適切な方法でgetCurrentLocationを使うのですか、私はそれが間違って使用していますか?

  • 私のアプリではなくGoogleマップを起動した場合にのみ、画面の上部にある位置アイコンが表示されるのはなぜですか(アプリがその場所をトリガーしなかった場合)。 ?

    • タイムアウトを使用せず、その場所に10分かかる場合はどうなりますか?何が起こるか ?タイムアウトを10秒に設定し、その場所が10分後に来る場合(たとえば私がトンネル内にいる場合)は、どのような違いがありますか?

    • デバイスの場所が変更されたときにだけトリガーすることができますが、LocationListenerを使用することをお勧めしますか?

私の心にこれをより明確にすることができます誰に事前のおかげで、

編集:すべて作るために@ShaiAlmogアドバイスに続いては、スムーズに私が持っていた作品:

  • 無行います上記のupdateGeolocation()メソッドを使用する
  • LocationListenerを実装し、オーバーライドされたupdateLocationで自分のものを実行するGeolocationListenerリスナーを作成するHOD(下記参照)
  • は今、更新された位置が利用可能であり、期待通りの場所のアイコンが表示され、メインクラスのinitメソッドで私のGeolocationListenerへ

をLocationListenerを設定します。

マイGeolocationListenerは、次のコードのように簡単です:あなたは常に、あなたのようお知らせしますあなたはsetLocationListenerを使用する必要がある場所を監視する必要がある場合は

public class GeolocationListener implements LocationListener{ 

@Override 
public void providerStateChanged(int newState) { 


} 

/** 
* Met à jour les valeur de la position et la précision de la géolocalisation si le service de géoloc est dispo. Sinon met à jour les valeurs avec null pour la position 
* et DEFAULT_GEOLOCATION_ACCURACY pour la précision 
*/ 
@Override 
public void locationUpdated(Location location) { 
    // Par défaut 
    ParametresGeneraux.setLocation(null); 
ParametresGeneraux.setGeolocationAccuracy(ParametresGeneraux.DEFAULT_GEOLOCATION_ACCURACY); 

/*On met à jour la position et la précision 
*/ 
if (location != null && (location.getStatus() == LocationManager.AVAILABLE)){ 

      ParametresGeneraux.setLocation(location); 
      if (location.getAccuracy() > 0.0f) { 
       ParametresGeneraux.setGeolocationAccuracy(location.getAccuracy()); 
      } 

     } // fin de la mise à jour de la position 
} 

}

よろしく

答えて

2

場所の変更。 Google PlayのハイブリッドロケーションAPIを使用すると、GPSの使用効率が向上し、必要に応じて起動するだけです。

GPS信号を受信するには数分かかる可能性があり、不正確/利用できない可能性があるため、これはアドホックな要求に対してより簡単な方法です。あなたがサービスをGoogle Playに、おかげでリスナーを使用し、それはあなたが移動すると場所がゆっくりと自分自身を絞り込む必要があります開いたままなら、それはどちらか...

あなたは使うべきではありませんが、そのくらいのバッテリーを取るべきではありませんgetCurrentLocationまたはgetCurrentLocationSyncこのアプローチを使用します。

+0

ありがとうございます@ShaiAlmogは確かに行く方法です。確かに位置アイコンが現れ、私が移動するとその場所が更新されます! – HelloWorld

関連する問題