テスト用にAndroidエミュレータで経度と緯度を取得したいです。
誰かがこれを達成する方法を私に導くことができますか?
エミュレータの位置をテスト位置に設定する方法
Telnet経由でエミュレータに接続できます。これで、ジオフィックス、ネットワークなどの特定のデータを入力できるエミュレータコンソールができます。
コンソールの使い方は広範囲に説明されています ここ 。コンソールに接続するには、コマンドラインを開いて次のように入力します。
telnet localhost 5554
その後、geoコマンドを使用して、gpsロケーションプロバイダーを使用してすべてのプログラムに渡される緯度、経度、および必要に応じて高度をデバイスに設定できます。詳しい手順については上記のリンクを参照してください。
コンソールで実行する特定のコマンドは、
geo fix <longitude value> <latitude value>
現実的な緯度/経度を見つけるのにこのサイトが便利だと思っています: http://itouch inn/latlong.html
複数の座標が必要な場合は、ルートを含むkmlファイルを使用することもできます。これは article に少し説明されているものです。現時点でより良い情報源を見つけることができません。
私はgeo fix
を使用して手動で特定の緯度と経度の座標を決定するよりエミュレータのGPS座標を設定するより良い方法を探していました。
何も見つからないので、GWTとGoogle Maps APIを使ってブラウザベースの地図ツールを起動してエミュレータにGPSの位置を設定する小さなプログラムをまとめました。
うまくいけば、この難しさや疑問にも出会うことが間違いない他の人を助けるために役立つことができます。
Eclipse
を使用している場合は、Window->Open Perspective->DDMS
に移動し、Location Controls
に1と入力してSend
を押します。
Android Studioユーザーの場合:
エミュレータを起動します。
それから、Tools -> Android ->Android device monitor
に行きます
Emulator Control
タブを開き、位置管理グループを使用します。
1. Android Studioユーザー。
エミュレータを実行した後、[ツール] - > [Android] - > [Androidデバイスモニタ]に移動します。
[ロケーションコントロール]グループから[エミュレータコントロール]タブの変更をクリックします。
2. Eclipseユーザー。
最初にEclipseのメニューで「ウィンドウ」を選択し、次に「パースペクティブを開く」を選択してから「DDMS」を選択します。すなわち、ウィンドウ - > Open Prespective - > DDMS。
左側のデバイスパネルに表示され、右側には異なるタブが表示されます。 [エミュレータコントロール]タブを選択します。
一番下にはLocation Controls Panelがあります。 「手動」タブを選択してください。
テキストボックスに経度と緯度を入力し、送信ボタンをクリックします。それはあなたのエミュレータとアプリケーションに位置を送ります。
3. telnetを使用します。
実行コマンドでこれを入力します。
telnet localhost 5554
Windowsを使用していない場合は、任意のtelnetクライアントを使用できます。
Telnetで接続したら、次のコマンドを使って自分の位置をエミュレータに送信します。
geo fix long lat
geo fix -121.45356 46.51119 4392
4.ブラウザベースのGoogleマップツールを使用する
GWTとGoogle Maps APIを使用してブラウザベースの地図ツールを起動し、エミュレータにGPSの位置を設定するプログラムがあります。
新しいエミュレータの場合:
http://developer.Android.com/tools/devices/emulator.html#extended
基本的に、エミュレータコントロール(エミュレータの右側)の3つのドットボタンをクリックすると、メニューが表示されます。このメニューで、場所を含むエミュレータを制御できます
Mapviewを設定して実行していると仮定します。
MapView mapView = (MapView) findViewById(R.id.mapview);
final MyLocationOverlay myLocation = new MyLocationOverlay(this, mapView);
mapView.getOverlays().add(myLocation);
myLocation.enableMyLocation();
myLocation.runOnFirstFix(new Runnable() {
public void run() {
GeoPoint pt = myLocation.getMyLocation();
}
});
マニフェストには次の権限が必要です。
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
Eclipseからエミュレータに擬似座標を送信するには、[ウィンドウ]メニューに移動し、[ビューの表示]> [その他]> [エミュレータコントロール]を選択します。表示されるエミュレータコントロールペインから座標を送信できます。
エミュレータコンソールで "geo"コマンドを使用する
コマンドラインからモックロケーションデータを送信するには
Androidエミュレータでアプリケーションを起動し、SDKの/ toolsディレクトリにあるターミナル/コンソールを開きます。
エミュレータコンソールに接続します。
telnet localhost 5555
(5555をあなたのエミュレータが実行しているポートに置き換えてください)
位置データを送信します。* geo fixは、固定の地理位置を送信します。
このコマンドは、経度と緯度(10進数)、およびオプションの高度(メートル)を受け入れます。例えば:
geo fix -121.45356 46.51119 4392
私はtelnet経由でエミュレータにgpsの場所をプッシュするためのPythonスクリプトを書きました。発信元と宛先の場所を定義します。また、どのくらいの時間座標をデバイスにプッシュするかを制御できる時間オフセットもあります。ある場所は1秒に1回プッシュされています。
以下の例では、スクリプトは120秒でベルリンからハンブルクに移動します。ランダムな距離で1秒あたり1ステップ/ gpsの位置。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random
Host = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120
LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2
DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1
lat = LAT_SRC
lng = LNG_SRC
tn = telnetlib.Telnet(Host, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")
for i in range(SECONDS):
lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG
#tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(lng, lat))
#tn.write("exit\n")
sleep(1)
tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")
print tn.read_all()
Mac、Linux、またはCygwinの場合:
echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554
それはメキシコシティにあなたを置きます。それに応じてあなたの経度/緯度/高度を変更してください。あなたがnmeaに興味がなければそれで十分なはずです。
GPSを送るのにEclipseプラグDDMS機能を使います。
通信ポートがブロックされているLinuxの場合。端末をAndroid sdk
内のplatform-toolsフォルダーに移動して、次のコマンドを起動します。
./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
次の解決策は私のために働いた - コマンドラインを開いて書く:
adb emu geo fix [longtitude] [latitude]
モック位置データの提供 を見てください。あなたはそれに対する解決策を見つけるでしょう。
最初にあなたのEclipseのDDMSセクションに行き、エミュレータコントロールを開いてください。マニュアルセクションに行き、latとlongをセットしてからSendボタンを押してください。
Dalvikデバッグモニタ>エミュレータ>エミュレータ制御タブ>位置制御を選択します。
DDMS - Android_sdk/tools/ddms OR Android_sdk/tools/monitor
私は多くの点でadbを介してジオフィックスを設定しようとしていましたが、GPSデータを見ることができませんでした。しかし、DDMSを開いてアプリのプロセスを選択してエミュレータのコントロールタブから座標を送信しようとすると、すぐにうまくいきました。
Eclipseを使用していてEmulatorコントローラを使用している場合は、緯度と経度を手動で設定して、マップベースのアプリケーションをエミュレータで実行できます。
Android Studio(1.3)を使用している場合
Alberto Gaonaの答えを1行にするだけです
token=$(cat ~/.emulator_console_auth_token); cat <(echo -e "auth $token \n geo fix 96.0290791 16.9041016 \n exit") - | nc localhost 5554
5554はadb devices
に表示されているエミュレータポート番号です。
adb emu
が機能すればもっと良かったでしょう。
エミュレータがGoogle APIなしでAndroidイメージを実行していたとき、エミュレータのGPS修正を取得できませんでした。画像をGoogle APIを含むように変更した直後に、GPS修正を機能させるための上記のすべての方法が行われました。
AVDを作成するときは、必ずGoogle APIを使用して画像を選択してください。
私自身のプロジェクトのために、私はAndroidエミュレータに模擬位置を提供できるオンラインサービスを開発しました。
Geo fixではなくgeo nmeaを使用して、緯度/経度だけでなく速度、コース、正確な時間などを設定できます。
このサービスには、nc(netcat)コマンドラインユーティリティが必要です。
シェルコマンド " geo fix ... "を使用するための、すでに述べた複数回の回答が正解です。しかし、データを取得するために LocationClient.getLastLocation() を使用する場合は、最初はうまくいかないことを言及する価値があります。 LocationClientクラスは、Google Playサービスを使用して座標を取得します。私にとってはこれはエミュレータマップアプリを一度実行した後に働き始めました。最初の起動時には、Googleアプリから自分の場所へのアクセスを許可するように求められますが、これはうまくいきます。
Android Studio用のプラグイン「Mock Location Plugin」があります。このプラグインを使って複数のポイントをエミュレートすることができます。あなたはこのリンクで使用の詳細なマニュアルを見つけることができます: Android Studio。 Mock Location Pluginで複数のGPSポイントをシミュレートします
あなたは genymotion のようなエミュレータを使うことができます。
上記の解決策がうまくいかない場合。これを試して:
Android Manifest.xmlの中に、applicationタグの _ outside _ の2つのリンクを追加します。ただし、もちろん、manifestタグの内側に追加します。
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission Android:name="Android.permission.INTERNET" ></uses-permission>
まだコメントできないので、@ ectomorphsを更新するとここに答えます。 Linuxでは/home/username/.emulator_console_auth_tokenの下にあります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random
FILE = open('/home/username/.emulator_console_auth_token', 'r')
AUTH_TOKEN = FILE.read()
FILE.close()
Host = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120
LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2
DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1
lat = LAT_SRC
lng = LNG_SRC
tn = telnetlib.Telnet(Host, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)
tn.write("auth {0}\n".format(AUTH_TOKEN))
tn.read_until("OK", 5)
tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")
for i in range(SECONDS):
lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG
#tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(lng, lat))
#tn.write("exit\n")
sleep(1)
tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")
print tn.read_all()
シェルスクリプトから、次のように座標を設定できます。
#!/usr/bin/env bash
export ATOKEN=`cat ~/.emulator_console_auth_token`
echo -ne "auth $ATOKEN\ngeo fix -99.133333 19.43333 2202\n" | nc localhost 5554
Eclipseでは:
DDMSウィンドウを下にドラッグする必要があるかもしれません。 'Location Controls'は 'Telephony Actions'の下にあり、通常の大きさのコンソールビューによって隠されているかもしれません(コンソール付きのバー、LogCatなどがそれを覆っているかもしれません!)
〜
私は前の答えの1つに似た小さなスクリプトを作成しましたが、expect
の代わりにpython
を使用します - それは少し簡単なので(expect
はこのために発明されました)。
#!/usr/bin/expect
set port [lindex $argv 0]
set lon [lindex $argv 1]
set lat [lindex $argv 2]
set timeout 1
spawn telnet localhost $port
expect_after eof { exit 0 }
## interact
expect OK
set fp [open "~/.emulator_console_auth_token" r]
if {[gets $fp line] != -1} {
send "auth $line\r"
}
send "geo fix $lon $lat\r"
expect OK
send "exit\r"
使用例:sendloc 5554 2.35607 48.8263