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


91

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


1
受け入れられた回答は完全に機能しますか?私にとってはうまくいきません... !!!
サミサチャトゥランガ

3
残念ながら、受け入れられた回答は間違っています:-(質問に正しく回答していなくても28票の投票を得たことは素晴らしいです!
David Wasser

@DavidWasser貴重なコメントに感謝します。そして、あなたは実際にはインターネットやGPSを使用せずに場所の詳細を取得する方法はないと思いますか?(そのセル放送メッセージを使用する以外)
Samitha Chathuranga

2
@SamithaChathurangaこれについて考えてください。GPSがなく、インターネットもない場合、どこでこの情報を入手しますか?ネットワークからセルID情報を取得できます。これはIDのみを提供します。次に、IDを実際の座標または名前にマップする方法が必要になります。いつでも独自のセルIDデータベースを構築してアプリケーションに含めることができますが、すべてのデータを収集するにはかなりの作業が必要であり、マッピングは静的ではありません。モバイルオペレーターが新しいセルタワーを設置して番号を付け直すと、マッピングは変化します彼らのネットワーク。基本的に、実際的な答えは「いいえ」です。
David Wasser 2015年

@DavidWasser返信ありがとうございます。また、インターネットやGPSなしで位置を取得する方法にも大きな驚きがありました。しかし、多くのフォーラムにstackoverflowを含めると、これは可能であると言われています。だからこそ可能だと思いました。多くの人も見当違いです。
Samitha Chathuranga

回答:


87

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


1
バッテリーの保存に関する戦略を確認することを忘れないでください。また、アプリケーションによっては、PASSIVE_PROVIDERを使用してgetLastKnownLocationを使用すると、他のアプリケーションがアンテナを使用している場合に多くの作業とバッテリーを節約できます。
Ian

2
@Ianさん、同じコードを使用しました。しかし、私の場合、onLocationChanged()リスナーメソッドは呼び出されませんでした。onResume()メソッドでrequestLocationUpdatesを使用しました。それでも呼ばれることはありません..そこでそこで何が問題でしたか?
MS。

2
ちょっと@lanまたは私が上記のコードを実装するのを手伝ってくれる他の人が、必要なonLocationChangedメソッドが呼び出されて、誰が私を手伝ってくれるのかという問題が発生します...
pareshm

1
インターネットなしでコーディネートを入手することは可能ですか?一部のデバイスでは機能していないようです。
iammilind 2015

20
この答えは間違っています:-( OPは、インターネット接続を使用せずに位置を取得する方法を尋ねました。LOCATION_PROVIDERは、サーバーにアクセスしてCell-IDおよびWIFI MACアドレスのコレクションを地理座標に解決するためにインターネットを使用する必要があります。インターネットがない場合あなたはそれがあなたのために機能することを私に言った場合、それはあなたがインターネット接続を持っているか、あなたがインターネット接続を持っていることを意味します(ロケーションAPIはあなたの周りのエリアについてのいくつかの情報をダウンロードしてキャッシュします) 、または位置情報が古い(したがって不正確)
David Wasser

16

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

私が考えていることは、モバイルネットワークを使用して現在地を取得することは可能ですか
Prabhu M

ドキュメントを読む必要があります。違いを学びPASSIVE_PROVIDERNETWORK_PROVIDERGPS_PROVIDER
hwrdprkns

1
これは理想的ですが、最後の場所の時刻をgetTime()を使用して確認します。次に、これを何歳にするかを決めるだけです。それが古すぎる場合は、私の投稿を使用して新しいポジションを取得します。
Ian

1
@Ian新しい場所または新しい場所を取得する方法?
Archie.bpgc 2013年

5
GPSがオフの場合、位置情報を取得できますか
Prasad

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;
    }
}

4

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

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

理論的には、モバイルプロバイダーはローカルデータサービスのみを提供し、インターネットへのアクセスは提供せず、モバイルデバイスからのロケーションクエリに応答できます。モバイルプロバイダーはこれを行いません。この種の制限されたデータアクセスに対して料金を支払う必要はありません。あなたがあなたのモバイルプロバイダーを通してデータサービスを持っているなら、あなたはインターネットにアクセスできます。

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

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

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

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




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.