0

私は次のように場所を取得します:

    LocationManager locationManager;
                GeoPoint p; 
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);


                boolean gps_enabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
                if (gps_enabled) {
                    Location location = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                }

ただし、gps_enabled=true場所 = null です。位置情報を取得できないのはなぜですか? 手伝って頂けますか?NETWORK_PROVIDER で取得できれば問題ありません。

4

5 に答える 5

2

まあいろいろありますが。GPS は、「コールド スタート」として知られている場所から発信されている可能性があります。これらの場合、最後の既知の場所は null です。また、位置情報を取得するための信号がない場所にいる可能性もあります。また、お粗末な GPS またはお粗末な GPS ドライバー (samsung) である可能性もあります。これらは正確ではありません。

まず、このドキュメントから始めます。ロケーション取得戦略

次に、ここでロジックを評価してみましょう。はい、GPS が有効になっています。ただし、このコンテキストでは、有効とは、細かい場所のアクセス許可を持つアプリケーションで使用できるようになっていることを意味します。有効になっていても、現在アクティブで場所を取得していることを意味するわけではありません。しかし、良いニュースがあります!リスナーを作成したり、場所の更新を購読したりできます。

他の人が述べたように、マニフェストに権限が設定されていることを確認してください。私はあなたがそうしていると思います。そうでなければ、あなたのアプリはおそらくクラッシュし、getLastKnownLocation()呼び出しの許可の問題で燃えました.

次に、位置情報の更新を受け取るには、LocationListenerクラスを見てください。このインターフェイスを実装することlocationManager.requestLocationUpdates()で、GPS からの位置更新の登録に使用できます。

コードを使用する (アクティビティ内にあり、記述されているメソッドが UI スレッドで呼び出されるなど、いくつかのことを想定しています):

public class MyActivity extends Activity implements LocationListener {
  // The rest of the interface is not really relevant for the example
  public void onProviderDisabled(String provider) { }
  public void onProviderEnabled(String provider) { }
  public void onStatusChanged(String provider, int status, Bundle extras) { }

  // When a new location is available from the Location Provider,
  // this method will be called.
  public void onLocationChanged(Location location) {
        // You should do whatever it was that required the location
        doStuffWithLocation(location);
        // AND for the sake of your users' battery stop listening for updates
        (LocationManager) getSystemService(LOCATION_SERVICE).removeUpdates(this);
        // and cleanup any UI views that were informing of the delay
        dismissLoadingSpinner();
  }

  // Then in whatever code you have
  public void methodA() {
    LocationManager locationManager;
    GeoPoint p; 
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (gps_enabled) {
      Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
      if (location == null) {
            // When it is null, register for update notifications.
            // run this on the UI Thread if need be
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
            // Since this might take some time you should give the user a sense
            // that progress is being made, i.e. an indeterminate ProgressBar 
            showLoadingSpinner();
      } else {
            // Otherwise just use the location as you were about to
            doStuffWithLocation(location);
      }
    }
    ...

これにより、期待どおりにコードが実行され、GPS に位置情報がない場合は、GPS をスピンアップして位置情報を取得するまで待ちます。それが発生したら、それを止めて、計画どおりに使用します。これは一種の単純なアプローチですが、単純な基礎として使用できるはずです。実際のソリューションでは、場所を取得する機会がない場合を考慮に入れ、場所を待っている間に場所プロバイダーが利用できない場合や利用できなくなった場合を処理し、場所の健全性を検証する必要があります。

于 2012-10-16T09:56:30.913 に答える
1

マニフェストに次の権限を追加しましたか?

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

編集:

このリンクを通過します。それは場所を見つけるためのさまざまな戦略を提供します。

于 2012-10-16T09:44:19.317 に答える
1

マニフェストであなたは許可を与えましたか。

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
于 2012-10-16T09:45:28.617 に答える
1

このメソッドgetLastKnownLocation()は、GPS をオンにすることなく、GPS によって取得された最後の位置を返すだけです。たとえば、携帯電話を再起動すると、キャッシュが消去され、GPS を起動して少なくとも 1 つの場所で取得できるようになるまで、返されるキャッシュされた場所がなくなります。

于 2012-10-16T09:46:06.270 に答える
1

使用コード:

    // Get the location manager
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
    System.out.println("Provider " + provider + " has been selected.");
    double lat = (double) (location.getLatitude());
    double lng = (double) (location.getLongitude());

    Log.i(TAG, "Lattitude:" +lat);
    Log.i(TAG, "Longitude:" +lng);

    } else {
      System.out.println("Location not avilable");
    }
  }
于 2012-10-16T09:48:07.500 に答える