91

GPSやインターネットを使わずにユーザーの現在地を取得することはできますか? つまり、モバイルネットワークプロバイダーの助けを借りて.

4

8 に答える 8

87

あなたがしようとしているのは、 のLocationManager.NETWORK_PROVIDER代わりに を使用して位置を取得することですLocationManager.GPS_PROVIDER。はNETWORK_PROVIDER、GSM または Wi-Fi のうち利用可能な方で解決されます。もちろん、wifi をオフにすると、GSM が使用されます。セルネットワークの使用は、基本的に 500m までの精度であることに注意してください。

http://developer.android.com/guide/topics/location/obtaining-user-location.htmlには、非常に優れた情報とサンプル コードがあります。

のほとんどのコードが完成したら、次のコードをOnCreate()追加します。

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

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

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

LocationListenerアクティビティにクラスを実装させて、アクティビティに実装することもできonLocationChanged()ます。

于 2011-07-14T14:55:45.167 に答える
18

取得するgetLastKnownLocationことによって、実際に自分で修正を開始することはありません。

これによりプロバイダーが起動する可能性があることに注意してください。ただし、ユーザーが以前に場所を取得したことがある場合は、そうなるとは思いません。ドキュメントはこれについてあまり明確ではありません。

ドキュメントgetLastKnownLocationによると:

指定されたプロバイダーから取得した最後の既知のロケーションフィックスからのデータを示すロケーションを返します。これは、プロバイダーを起動せずに実行できます。

簡単なスニペットは次のとおりです。

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;

public class UtilLocation {
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Location utilLocation = null;
        List<String> providers = manager.getProviders(enabledProvidersOnly);
        for(String provider : providers){

            utilLocation = manager.getLastKnownLocation(provider);
            if(utilLocation != null) return utilLocation;
        }
        return null;
    }
}

また、に新しい権限を追加する必要がありますAndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
于 2011-07-14T14:05:16.957 に答える
4
boolean gps_enabled = false;
boolean network_enabled = false;

LocationManager lm = (LocationManager) mCtx
                .getSystemService(Context.LOCATION_SERVICE);

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Location net_loc = null, gps_loc = null, finalLoc = null;

if (gps_enabled)
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (gps_loc != null && net_loc != null) {

    //smaller the number more accurate result will
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
        finalLoc = net_loc;
    else
        finalLoc = gps_loc;

        // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)

} else {

    if (gps_loc != null) {
        finalLoc = gps_loc;
    } else if (net_loc != null) {
        finalLoc = net_loc;
    }
}
于 2016-12-14T09:45:26.017 に答える