web-dev-qa-db-ja.com

GPSやインターネットを使用せずにAndroidでユーザーの現在位置を取得します

GPSやインターネットを使用せずにユーザーの現在位置を取得することは可能ですか?私はモバイルネットワークプロバイダーの助けを借りて意味します。

89
Prabhu M

あなたがやろうとしているのは、LocationManager.NETWORK_PROVIDERの代わりにLocationManager.GPS_PROVIDERを使用してポジションを取得することです。 NETWORK_PROVIDERは、利用可能なGSMまたはwifiで解決されます。明らかに無線LANをオフにして、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()を実装することもできます。

85
Ian

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

このcouldはプロバイダーを開始できますが、ユーザーが以前に場所を取得したことがある場合は、そうなるとは思いません。ドキュメントはこれについてあまり明確ではありません。

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

指定されたプロバイダーから取得した最後の既知の位置修正からのデータを示すLocationを返します。これは、プロバイダーを起動せずに実行できます。

これが簡単なスニペットです。

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" />
15
hwrdprkns

ここでは、GPSとネットワークプロバイダーを使用せずにユーザーの現在位置を取得できます。

1 Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"

2 . 参照用にここをクリック

3
Mahendran Candy
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;
    }
}
3
Makvin

いいえ、現在、GPSまたはインターネットを使用せずに現在地を取得することはできません。

WiFi、Cellular、またはBluetoothに基づくロケーションテクニックは、常に更新されている大規模なデータベースの助けを借りて機能します。デバイスはトランスミッタIDをスキャンし、クエリで送信しますインターネット経由 Google、Apple、Skyhookなどのサービスに送信します。そのサービスは、既知の場所からの以前のワイヤレス調査に基づいた場所で応答します。インターネットにアクセスできない場合、そのようなデータベースのローカルコピーを保持し、これを最新の状態に保つ必要があります。グローバルに使用する場合、これは非常に実用的ではありません。

理論的には、モバイルプロバイダーはローカルデータサービスのみを提供し、インターネットへのアクセスは提供せず、モバイルデバイスからのロケーションクエリに応答できます。モバイルプロバイダーはこれを行いません。この種類の制限されたデータアクセスに対して支払いを希望する人はいません。モバイルプロバイダーを介したデータサービスがある場合は、インターネットにアクセスできます。

要するに、LocationManager.NETWORK_PROVIDERまたはAndroid.hardware.location.networkを使用して位置を取得するには、インターネットを使用する必要があります。

最後の既知の位置を使用するには、ごく最近にGPSまたはインターネットにアクセスする必要があります。インターネットがあれば、位置や設定を調整して再びインターネットに接続できるでしょう。デバイスにGPSまたはインターネットアクセスがない場合、最後の既知の位置機能は役に立ちません。

GPSまたはインターネットがなければ、次のことができます。

  1. 夜空の写真を撮り、現在の時刻を使用して、星図に基づいて位置を推定します。これにはおそらく、写真の角度を正しく測定するために追加の機器が必要になります。
  2. 加速度計を使用して、既知の位置から開始する位置を追跡します。この種のアプローチではエラーが蓄積するため、ほとんどの状況では実用的ではありません。
3
mattm

Google Maps Geolocation Apiをご覧になりましたか? Google Map Geolocation

これは単純なRestApiです。必要なのはPOSTリクエストだけで、サービスはメートル単位の精度で位置を返します。

1
raditya gumay

TelephonyManagerを使用してそれを行うことができます。

0