物理デバイス(Nexus One)で自分の場所をモックするにはどうすればよいですか? Emulator Controlパネルのエミュレータでこれを実行できることは知っていますが、これは物理デバイスでは機能しません。
行う唯一の方法は、モックロケーションプロバイダーを使用することです。
設定の開発パネルでモックの場所を有効にし、追加する必要があります
<uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION" />
あなたのマニフェストに。
これで、コードに移動して、独自のモックロケーションプロバイダーを作成し、このプロバイダーのロケーションを設定できます。
この電話を開発ラボでのみ使用する場合、GPSチップをはんだ付けし、シリアルポートに他のデバイスからのNMEAシーケンスを直接供給することができます。
ケーブルが手元にあればいいのに。エミュレータに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)。
位置情報サービスの権限を使用して、場所を模擬することができます...
"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);
次のコードで成功しました。何らかの理由で単一のロックを取得しましたが(別のLatLngペアを試した場合でも)、それは私のために機能しました。 mLocationManager
はLocationManager
に接続される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
);
}
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 また、エミュレータで実際に動作するコードを見つけてください。
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の場所を使用します。
これは私のために働いた(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()が起動します。
私はこれを理解したので、今は手に電話を持って近所を歩き回る必要はありません。
初期位置から移動位置をシミュレートする単純なハンドラーを作成しました。
接続コールバックで開始します:
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;
}
}
}
それが役立つことを願っています。
Icyerasorが言及し、Pedroが http://pedroassuncao.com/blog/2009/11/12/Android-location-provider-mock/ で提供したソリューションは、私にとって非常にうまく機能しました。ただし、模擬GPSプロバイダーの適切な起動、停止、および再起動のサポートは提供しません。
私は彼のコードを少し変更し、クラスをスレッドではなくAsyncTaskに書き換えました。これにより、UIスレッドと通信できるため、プロバイダーを停止した時点でプロバイダーを再起動できます。これは、画面の向きが変わるときに便利です。
このコードとEclipseのサンプルプロジェクトは、GitHubにあります。 https://github.com/paulhoux/Android-MockProviderGPS
すべての功績はペドロに与えられるべきです。
グーグルプレイからの偽のGPSアプリは私のためにトリックをしました。アプリの説明のすべての指示を必ずお読みください。 「Fake GPS」を有効にした後、他の位置情報サービスを無効にし、アプリを起動する必要があります。私が必要としていたものに対してはうまくいきました。
GooglePlayのアプリへのリンクは次のとおりです。 Fake GPS
これを行うためのGoogleチュートリアルはここにあります。コード例が提供され、プロセスが説明されています。
http://developer.Android.com/training/location/location-testing.html#SendMockLocations
マニフェストに追加する
<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);
}
また、デバイスの開発者設定でモックの場所を有効にする必要があります。それが利用できない場合、上記が実装されたら、アプリケーションに「モックロケーションアプリケーション」を設定します。
デバイスがコンピューターに接続されており、エミュレーターコントロールを介して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
多分それは「プログラマー」アプローチではありませんが、時間を節約して作業ソリューションをすぐに入手したい場合は、Google Playで利用可能なモックロケーション専用のアプリのいずれかを試してください:
Fake GPSアプリのインストール https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en
開発者オプション->模擬場所アプリを選択(つまり、偽の場所アプリを選択)。
偽のGPSアプリ:
追加するマップ上のダブルタブ->再生ボタンをクリック->トースト「Fake location stopped」を表示
最後にGoogleマップアプリで確認してください。
マニフェストファイルでこの権限を使用する
<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);
Android PhoneでWebServer(REST-like)を実行するアプリを作成したので、GPS位置をリモートで設定できます 。 Webサイトには、クリックして新しい位置を設定したり、「wasd」キーを使用して任意の方向に移動したりできるマップが用意されています。このアプリは迅速なソリューションであったため、UIもドキュメントもほとんどありませんが、実装は簡単で、4つだけのクラスですべてを調べることができます。
プロジェクトリポジトリ: https://github.com/juliusmh/RemoteGeoFix
Android電話とタブレット(CATLESという名前)用の非常に便利で無料のインタラクティブなロケーションシミュレーターを使用してください。システム全体のレベル(GoogleマップまたはFacebookアプリ内でも)でGPS位置を模倣し、物理デバイスおよび仮想デバイスで動作します。
複雑なMock Locationのセットアップが必要かどうか疑問に思います。私の場合、修正場所を取得したら、その新しい場所で何かをする関数を呼び出していました。タイマーで、モックの場所を作成します。代わりにその場所で関数を呼び出します。 GPSが実際の現在の位置に到達するまでの間に、そのすべてを短時間で知ることができます。大丈夫です。更新時間が十分に長く設定されている場合。