4

GPS機能を介してユーザーの現在地を取得しようとしていますが、

を実装する簡単なクラスを書きましたLocationListener

public class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
    }

    @Override
    public void onProviderDisabled(String provider) { }

    @Override
    public void onProviderEnabled(String provider) { }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    public static double getLatitude() {
        return latitude;
    }

    public static double getLongitude() {
        return longitude;
    }

}

簡単なアクションから、これらの経度と緯度の値にアクセスしています

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** create a TextView and write Hello World! */
    TextView tv = new TextView(this);

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

    LocationListener mlocListener = new LocationManagerHelper();

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');
    } else {
        tv.setText("GPS is not turned on...");
    }

    /** set the content view to the TextView */
    setContentView(tv);

しかし、結果として常に0.0を返します。問題を理解できませんでした。

4

5 に答える 5

19

場所の更新は、実際には非同期です。つまり、API は、新しい場所が利用可能になるまで、呼び出し元のスレッドを待機させません。代わりに、新しい位置が計算されるたびに呼び出される特定のメソッド ( callback ) でオブザーバー オブジェクトを登録します。

Android LocationManager APIでは、オブザーバーはLocationListenerオブジェクトであり、位置更新のメイン コールバックはonLocationChanged()です。

この点を説明するための図を次に示します (混乱するのではなく、役に立てば幸いです!)

シーケンス図

したがって、現在のコードから:

  • Activity サブクラスのメンバーとして mlocListener を宣言します。
  • LocationListener 実装にログ出力 (Logcat 行) を追加します。
  • 残りのコードはそのままにしておきます。
  • まだ行っていない場合は、マニフェストに適切な権限を追加します ( GPS にはFINE_LOCATIONが必要です)。
  • 非常に高速な GPS 修正 (約 30 秒) を取得するために、電話をインターネットに接続し、窓の近くに置いてみてください。

次に、アプリを起動し、logcat で何が起こるかを確認します。最初のリクエストの直後にステータスの変更と場所の更新が行われないことがわかります。したがって、テキストビューに常に (0.0,0.0) が表示される理由が説明されています。

詳細: http://developer.android.com/guide/topics/location/obtaining-user-location.html

于 2011-02-05T09:24:10.393 に答える
3

onCreate() が戻るまで、位置更新コールバックを起動できません。緯度/経度変数をダミー値に初期化すると、おそらくそれらの値を出力していることがわかります。

onLocationChanged にログを記録して、起動されていることを確認してから、コールバックと UI の更新に関して Android アプリケーションがどのように機能するかを少し読んでください。

また、アプリケーションのマニフェストに適切なアクセス許可があることを確認してください。

于 2011-02-05T06:06:11.873 に答える
2

mLocListener を取得したら、以下に示すように基準を設定します。

String mlocProvider;
Criteria hdCrit = new Criteria();
hdCrit.setAccuracy(Criteria.ACCURACY_COARSE);
mlocProvider = mlocManager.getBestProvider(hdCrit, true);

次に getLastKnownLocation を使用します

tv.append("\n\nLocations (starting with last known):");
Location currentLocation = mlocManager.getLastKnownLocation(mlocProvider);

これらがマニフェストに含まれていることを確認してください
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"

エミュレーターを使用している場合 - DDMS パースペクティブで、[エミュレーター コントロール] タブの [ロケーション コントロール] を探します。次に、[手動] タブを使用して経度と緯度を設定し、[送信] をクリックします。プログラムが実行されているときにこれを実行すると、onLocationchanged への呼び出しが表示されます。onLocationChanged にログインすることをお勧めします。

ところで、requestLocationUpdates のパラメーターは "... 0,0..." に設定されています - バッテリーを消耗します - 電話が 6 - 8 時間で切れるのを見ました - "...30000, 100 に変更します..." - 最初のパラメーターはミリ秒単位で、もう 1 つはメートル単位です。

于 2011-02-05T06:55:09.647 に答える
0

エミュレーターで確認すると、0.0 が返されます。場所をエミュレータに渡す必要があります。C:\android-sdk_r06\android-sdk-windows\tools\ddms.bat ファイルからこれを渡すことができます。

ddms には、エミュレーター コントロールという名前のタブがあります。そこから、場所をエミュレータに渡すことができます。これを試して。それがうまくいくことを願っています。

于 2011-02-05T06:06:28.483 に答える
-3

アプリの作成方法は?

アクションによる現在地座標の取得 (get Location) Lat/long

地図上に表示される場所をウェブサーバーに投稿します。(Submit) クリア ボタンで古い場所をクリアします(Clear Location) または (submit) でクリアされます (0.0.0.0)

Android http://developer.android.com/guide/topics/location/obtaining-user-location.htmlで現在の GPS 位置を取得する

于 2012-06-15T15:24:16.270 に答える