物理デバイス(Nexus One)で現在地を模擬するにはどうすればよいですか?エミュレータコントロールパネルのエミュレータを使用してこれを実行できることを知っていますが、これは物理デバイスでは機能しません。
物理デバイス(Nexus One)で現在地を模擬するにはどうすればよいですか?エミュレータコントロールパネルのエミュレータを使用してこれを実行できることを知っていますが、これは物理デバイスでは機能しません。
回答:
これを行う唯一の方法は、模擬位置情報プロバイダーを使用することです。
設定の開発パネルでモックの場所を有効にし、追加する必要があります
<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できるかどうか覚えていませんが、できると思います。これがお役に立てば幸いです。
これには(CLI)adb(Androidデバッグブリッジ)が必要です。
位置情報サービスの権限を使用して位置情報を模擬できます...
"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
);
}
setTestProviderStatus
ここでは、GPSプロバイダーが修正を「今」見つけたことをLocationManagerでイベントに通知/投稿/スケジュールするために使用され、そのイベントの処理を実行できます。
mLocationManager
あるLocationManager
LocationListenerにフックアップされているが、」?これどうやってするの?ありがとう..
LocationManager
サービスと場所を使用して場所の変更を確認する方法を説明する1つの記事を次に示しLocationListener
ます。blog.doityourselfandroid.com
Dr1Kuが投稿したものは機能します。今日コードを使用しましたが、locsを追加する必要がありました。だからここにいくつかの改善があります:
オプション: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
別の良い動作例は、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 また、実際に機能するコードもいくつか見つかりますエミュレータで私。
Mock Provider
、電源を入れた後、通常のGPSが機能せず、解決策を得ることができませんでした(デバイスで直接テストしていました)。それ以来、Androidで多くのことが起こっているため、これは当てはまらない場合があります。
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」メソッドを使用するために、モジュールグラドルファイルの「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) {
}
};
ハンドラクラス:
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によって言及され、http: //pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/でPedroによって提供されたソリューションは 、私にとって非常にうまく機能しました。ただし、模擬GPSプロバイダーの適切な起動、停止、再起動はサポートされていません。
私は彼のコードを少し変更し、クラスをスレッドではなくAsyncTaskに書き直しました。これにより、UIスレッドと通信できるようになるため、停止した時点でプロバイダーを再起動できます。これは、画面の向きが変わるときに便利です。
コードとEclipseのサンプルプロジェクトは、GitHubで見つけることができます:https : //github.com/paulhoux/Android-MockProviderGPS
すべての功績は、ほとんどの困難な作業を行ったペドロに送られるべきです。
マニフェストに追加
<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);
}
また、デバイスの開発者設定でモックの場所を有効にする必要があります。それが利用できない場合は、上記を実装した後、「モック位置アプリケーション」をアプリケーションに設定します。
これを行うためのGoogleチュートリアルはここにあります。コード例を提供し、プロセスを説明します。
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Fake GPSアプリをインストール https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en
開発者オプション-> 模擬位置情報アプリを選択します(つまり、偽の位置情報アプリが選択されています)。
偽のGPSアプリ:
追加するマップ上のダブルタブ->再生ボタンをクリック->トーストを表示 "偽の場所が停止しました"
最後にグーグルマップアプリで確認してください。
AndroidフォンでWebServer(RESTのような)を実行するアプリを作成したので、GPS位置をリモートで設定できます。Webサイトには、新しい位置を設定するためにクリックするか、「wasd」キーを使用して任意の方向に移動できるマップが用意されています。アプリは迅速なソリューションでしたので、UIやドキュメントはほとんどありませんが、実装は簡単で、すべて(4つだけ)のクラスで検索できます。
プロジェクトリポジトリ:https : //github.com/juliusmh/RemoteGeoFix
デバイスがコンピューターに接続されており、エミュレーターコントロールを介して送信GPSコードを変更しようとしても、機能しません。
これは、理由のためのEMULATORコントロールです。
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で利用可能なモックの場所に特化したアプリの1つを試してください:
Android搭載の携帯電話とタブレット(CATLESという名前)用の非常に便利で無料のインタラクティブな位置情報シミュレータを利用してください。システム全体のレベルで(GoogleマップやFacebookアプリ内でも)GPS位置を模倣し、物理デバイスと仮想デバイスの両方で機能します。
この権限をマニフェストファイルで使用する
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android studioは、「モックの場所は、テストまたはデバッグ固有のマニフェストファイル(通常はsrc / debug / AndroidManifest.xml)でのみリクエストする必要があります」という検査を無効にすることを推奨します。
お使いの携帯電話の開発者設定で「模擬場所を許可する」をチェックしたことを確認してください
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);
FusedLocationProviderClientを利用する最新のGoogle Play 開発者サービスバージョンを搭載したAndroidデバイスでテストを行っていたため、上記のソリューションは機能しませんでした。アプリのマニフェストでモックの場所のアクセス許可を設定し、開発者の設定でアプリを指定のモックの場所のアプリとして設定した後(上記の回答で述べたように)、以下のKotlinコードを追加して、場所を正常にモックしました。
locationProvider = FusedLocationProviderClient(context)
locationProvider.setMockMode(true)
val loc = Location(providerName)
val mockLocation = Location(providerName) // a string
mockLocation.latitude = latitude // double
mockLocation.longitude = longitude
mockLocation.altitude = loc.altitude
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mockLocation.bearingAccuracyDegrees = 0.1f
mockLocation.verticalAccuracyMeters = 0.1f
mockLocation.speedAccuracyMetersPerSecond = 0.01f
}
// locationManager.setTestProviderLocation(providerName, mockLocation)
locationProvider.setMockLocation(mockLocation)