GPSやインターネットを使わずにユーザーの現在地を取得することはできますか? つまり、モバイルネットワークプロバイダーの助けを借りて.
8 に答える
あなたがしようとしているのは、 の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()
ます。
取得する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" />
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;
}
}