web-dev-qa-db-ja.com

Androidデバイス上のモックの場所?

物理デバイス(Nexus One)で自分の場所をモックするにはどうすればよいですか? Emulator Controlパネルのエミュレータでこれを実行できることは知っていますが、これは物理デバイスでは機能しません。

141
Isaac Waller

行う唯一の方法は、モックロケーションプロバイダーを使用することです。

設定の開発パネルでモックの場所を有効にし、追加する必要があります

   <uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION" /> 

あなたのマニフェストに。

これで、コードに移動して、独自のモックロケーションプロバイダーを作成し、このプロバイダーのロケーションを設定できます。

159
Janusz

この電話を開発ラボでのみ使用する場合、GPSチップをはんだ付けし、シリアルポートに他のデバイスからのNMEAシーケンスを直接供給することができます。

102
tomash

ケーブルが手元にあればいいのに。エミュレータにtelnetで接続して場所を変更できることを知っています

$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK

デバイスにTelnet接続できるかどうかは思い出せませんが、できると思います。これがお役に立てば幸いです。

これには、adb(Androidデバッグブリッジ)が必要です(CLI)。

32
Tim Green

位置情報サービスの権限を使用して、場所を模擬することができます...

"Android.permission.ACCESS_MOCK_LOCATION"

そしてJavaコードで、

// Set location by setting the latitude, longitude and may be the altitude...
String[] MockLoc = str.split(",");
Location location = new Location(mocLocationProvider);            
Double lat = Double.valueOf(MockLoc[0]);
location.setLatitude(lat);
Double longi = Double.valueOf(MockLoc[1]);
location.setLongitude(longi);
Double alti = Double.valueOf(MockLoc[2]);
location.setAltitude(alti);
28
Vishwanath

次のコードで成功しました。何らかの理由で単一のロックを取得しましたが(別のLatLngペアを試した場合でも)、それは私のために機能しました。 mLocationManagerLocationManagerに接続されるLocationListenerです:

private void getMockLocation()
{
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    mLocationManager.addTestProvider
    (
      LocationManager.GPS_PROVIDER,
      "requiresNetwork" == "",
      "requiresSatellite" == "",
      "requiresCell" == "",
      "hasMonetaryCost" == "",
      "supportsAltitude" == "",
      "supportsSpeed" == "",
      "supportsBearing" == "",

      Android.location.Criteria.POWER_LOW,
      Android.location.Criteria.ACCURACY_FINE
    );      

    Location newLocation = new Location(LocationManager.GPS_PROVIDER);

    newLocation.setLatitude (/* TODO: Set Some Lat */);
    newLocation.setLongitude(/* TODO: Set Some Lng */);

    newLocation.setAccuracy(500);

    mLocationManager.setTestProviderEnabled
    (
      LocationManager.GPS_PROVIDER, 
      true
    );

    mLocationManager.setTestProviderStatus
    (
       LocationManager.GPS_PROVIDER,
       LocationProvider.AVAILABLE,
       null,
       System.currentTimeMillis()
    );      

    mLocationManager.setTestProviderLocation
    (
      LocationManager.GPS_PROVIDER, 
      newLocation
    );      
}
24
Dr1Ku

Dr1Kuが投稿したものは動作します。今日はコードを使用しましたが、locを追加する必要がありました。改善点は次のとおりです。

オプション:LocationManager.GPS_PROVIDER文字列を使用する代わりに、独自のconstat PROVIDER_NAMEを定義して使用することもできます。場所の更新を登録するときは、文字列として直接指定するのではなく、基準を使用してプロバイダーを選択します。

最初:removeTestProviderを呼び出す代わりに、最初に削除するプロバイダーがあるかどうかをチェックします(IllegalArgumentExceptionを回避するため)。

if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
  mLocationManager.removeTestProvider(PROVIDER_NAME);
}

2番目:複数の場所を公開するには、場所の時間を設定する必要があります。

newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);

MockLocationProvidersを使用するgoogleテストもあるようです: http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/1.5_r4/Android/location /LocationManagerProximityTest.Java

別の優れた実例は次の場所にあります: http://pedroassuncao.com/blog/2009/11/12/Android-location-provider-mock/

別の良い記事は次のとおりです。 http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-Android/#comment-1358 また、エミュレータで実際に動作するコードを見つけてください。

14
icyerasor

Androidマーケットには、デバイスの「モックGPSロケーション」を指定できるアプリがあります。

https://market.Android.com を検索すると、「My Fake Location」というアプリが見つかりました。

上記のポールが言及したモックGPSプロバイダー( http://www.cowlumbus.nl/forum/MockGpsProvider.Zip )は、ソースコードを含む別の例です-私はインストールできませんでしたが提供されたAPK(失敗[INSTALL_FAILED_OLDER_SDK]と表示され、再コンパイルが必要な場合があります)

GPSモックの場所を使用するには、デバイスの設定で有効にする必要があります。 [設定]-> [アプリケーション]-> [開発]に移動し、[モックの場所を許可する]をオンにします

その後、上記のようなアプリを使用してGPS座標とGoogleマップを設定できます。他のアプリは、指定したGPSの場所を使用します。

9
fijiaaron

これは私のために働いた(Android Studio):

電話でGPSとWiFiの追跡を無効にします。 Android 5.1.1以前では、[開発者オプション]で[モックの場所を有効にする]を選択します。

Src/debugディレクトリにマニフェストのコピーを作成します。以下に追加します( "application"タグの外側):

uses-permission Android:name = "Android.permission.ACCESS_MOCK_LOCATION"

「マップ」と呼ばれるマップフラグメントを設定します。 onCreate()に次のコードを含めます。

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
if (lm.getProvider("Test") == null) {
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1);
}
lm.setTestProviderEnabled("Test", true);
lm.requestLocationUpdates("Test", 0, 0, ll);

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng l) {
        Location loc = new Location("Test");
        loc.setLatitude(l.latitude);
        loc.setLongitude(l.longitude);
        loc.setAltitude(0); 
        loc.setAccuracy(10f);
        loc.setElapsedRealtimeNanos(System.nanoTime());
        loc.setTime(System.currentTimeMillis()); 
        lm.setTestProviderLocation("Test", loc);
    }
};

「setElapsedRealtimeNanos」メソッドを使用するには、モジュールgradleファイルの「minSdkVersion」を一時的に17に増やす必要があることに注意してください。

メインアクティビティクラス内に次のコードを含めます。

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // do whatever you want, scroll the map, etc.
    }
}

ASでアプリを実行します。 Android 6.0以降では、セキュリティ例外が発生します。 [設定]の[開発者向けオプション]に移動し、[モックロケーションアプリの選択]を選択します。リストからアプリを選択します。

マップをタップすると、タップの座標でonLocationChanged()が起動します。

私はこれを理解したので、今は手に電話を持って近所を歩き回る必要はありません。

8
Chris B

初期位置から移動位置をシミュレートする単純なハンドラーを作成しました。

接続コールバックで開始します:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
    @Override
    public void onConnected(Bundle bundle) {
        if (BuildConfig.USE_MOCK_LOCATION) {
            LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
            new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }
};

Handlerクラス:

   private static class MockLocationMovingHandler extends Handler {

    private final static int SET_MOCK_LOCATION = 0x000001;
    private final static double STEP_LATITUDE =  -0.00005;
    private final static double STEP_LONGITUDE = 0.00002;
    private final static long FREQUENCY_MS = 1000;
    private GoogleApiClient mGoogleApiClient;
    private double mLatitude;
    private double mLongitude;

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) {
        super(Looper.getMainLooper());
        mGoogleApiClient = googleApiClient;
    }

    public void start(final double initLatitude, final double initLongitude) {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
        mLatitude = initLatitude;
        mLongitude = initLongitude;
        sendEmptyMessage(SET_MOCK_LOCATION);
    }

    public void stop() {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
    }

    @Override
    public void handleMessage(Message message) {
        switch (message.what) {
            case SET_MOCK_LOCATION:
                Location location = new Location("network");
                location.setLatitude(mLatitude);
                location.setLongitude(mLongitude);
                location.setTime(System.currentTimeMillis());
                location.setAccuracy(3.0f);
                location.setElapsedRealtimeNanos(System.nanoTime());
                LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);

                mLatitude += STEP_LATITUDE;
                mLongitude += STEP_LONGITUDE;
                sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS);
                break;
        }
    }
}

それが役立つことを願っています。

7
smora

Icyerasorが言及し、Pedroが http://pedroassuncao.com/blog/2009/11/12/Android-location-provider-mock/ で提供したソリューションは、私にとって非常にうまく機能しました。ただし、模擬GPSプロバイダーの適切な起動、停止、および再起動のサポートは提供しません。

私は彼のコードを少し変更し、クラスをスレッドではなくAsyncTaskに書き換えました。これにより、UIスレッドと通信できるため、プロバイダーを停止した時点でプロバイダーを再起動できます。これは、画面の向きが変わるときに便利です。

このコードとEclipseのサンプルプロジェクトは、GitHubにあります。 https://github.com/paulhoux/Android-MockProviderGPS

すべての功績はペドロに与えられるべきです。

6
Paul Houx

グーグルプレイからの偽のGPSアプリは私のためにトリックをしました。アプリの説明のすべての指示を必ずお読みください。 「Fake GPS」を有効にした後、他の位置情報サービスを無効にし、アプリを起動する必要があります。私が必要としていたものに対してはうまくいきました。

GooglePlayのアプリへのリンクは次のとおりです。 Fake GPS

3
Igor

これを行うためのGoogleチュートリアルはここにあります。コード例が提供され、プロセスが説明されています。

http://developer.Android.com/training/location/location-testing.html#SendMockLocations

2
Nik Pardoe

マニフェストに追加する

<uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />

モックロケーション機能

void setMockLocation() {
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
            false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
    mockLocation.setLatitude(-33.852);  // Sydney
    mockLocation.setLongitude(151.211);
    mockLocation.setAltitude(10);
    mockLocation.setAccuracy(5);
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setElapsedRealtimeNanos(System.nanoTime());
    locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}

また、デバイスの開発者設定でモックの場所を有効にする必要があります。それが利用できない場合、上記が実装されたら、アプリケーションに「モックロケーションアプリケーション」を設定します。

1
Lamer

デバイスがコンピューターに接続されており、エミュレーターコントロールを介してGPSコードを送信しようとしても、機能しません。
これは、理由によりエミュレーターコントロールです。
GPSの変更時に更新するように設定するだけです。

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

    ll = new LocationListener() {        
        public void onLocationChanged(Location location) {  
          // Called when a new location is found by the network location provider.  
            onGPSLocationChanged(location); 
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {       
            bigInfo.setText("Changed "+ status);  
        }

        public void onProviderEnabled(String provider) {
            bigInfo.setText("Enabled "+ provider);
        }

        public void onProviderDisabled(String provider) {
            bigInfo.setText("Disabled "+ provider);
        }
      };

GPSが更新されたら、次のメソッドを書き換えて、目的の処理を実行します。

public void onGPSLocationChanged(Location location){  
if(location != null){  
    double pLong = location.getLongitude();  
    double pLat = location.getLatitude();  
    textLat.setText(Double.toString(pLat));  
    textLong.setText(Double.toString(pLong));  
    if(autoSave){  
        saveGPS();  
        }
    }
}

これらをマニフェストに入れることを忘れないでください
Android.permission.ACCESS_FINE_LOCATION
Android.permission.ACCESS_MOCK_LOCATION

1
Shadoath

多分それは「プログラマー」アプローチではありませんが、時間を節約して作業ソリューションをすぐに入手したい場合は、Google Playで利用可能なモックロケーション専用のアプリのいずれかを試してください:

Fake GPS Location Spoofer

モックの場所

偽のGPS位置

1
klimat

Fake GPSアプリのインストール https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en

開発者オプション->模擬場所アプリを選択(つまり、偽の場所アプリを選択)。

偽のGPSアプリ

追加するマップ上のダブルタブ->再生ボタンをクリック->トースト「Fake location stopped」を表示

最後にGoogleマップアプリで確認してください。

1
Manikandan K

マニフェストファイルでこの権限を使用する

<uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION">

Androidスタジオでは、「モックの場所はテストまたはデバッグ固有のマニフェストファイル(通常はsrc/debug/AndroidManifest.xml)でのみ要求する必要があります」だけを推奨します検査を無効にする

携帯電話の開発者設定で「Allow mock locations」をチェックしていることを確認してください

LocationManagerを使用する

locationManager.addTestProvider(mocLocationProvider, false, false,
                false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

好きな場所に場所を設定します

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 
0
Nirmal prajapat

Android PhoneでWebServer(REST-like)を実行するアプリを作成したので、GPS位置をリモートで設定できます 。 Webサイトには、クリックして新しい位置を設定したり、「wasd」キーを使用して任意の方向に移動したりできるマップが用意されています。このアプリは迅速なソリューションであったため、UIもドキュメントもほとんどありませんが、実装は簡単で、4つだけのクラスですべてを調べることができます。

プロジェクトリポジトリ: https://github.com/juliusmh/RemoteGeoFix

0
juliusmh

Android電話とタブレット(CATLESという名前)用の非常に便利で無料のインタラクティブなロケーションシミュレーターを使用してください。システム全体のレベル(GoogleマップまたはFacebookアプリ内でも)でGPS位置を模倣し、物理デバイスおよび仮想デバイスで動作します。

ウェブサイト: http://ubicom.snet.tu-berlin.de/catles/index.html

ビデオ: https://www.youtube.com/watch?v=0WSwH5gK7yg

0
Sandro

複雑なMock Locationのセットアップが必要かどうか疑問に思います。私の場合、修正場所を取得したら、その新しい場所で何かをする関数を呼び出していました。タイマーで、モックの場所を作成します。代わりにその場所で関数を呼び出します。 GPSが実際の現在の位置に到達するまでの間に、そのすべてを短時間で知ることができます。大丈夫です。更新時間が十分に長く設定されている場合。

0
yalcin