私はAndroid JUnitに基づくリモート自動テストフレームワークに取り組んでいます(テストはAndroidの外部で実行され、その内部のコードと対話します)。すべてうまく機能していますが、問題の1つは新しいエミュレータを自動的に起動すると、画面がロックされた状態で起動します。これは、実行可能なテストに影響しているようです。さらに、テストの実行(ボタンのクリック、テキスト入力など)を監視したいと思います。手動でエミュレータを起動した場合画面のロックを解除すれば、すべてうまくいきます。
プログラムでAndroidの画面のロックを解除する方法はありますか? Java API、コマンドライン、またはシェルコマンドなどはすべて問題ありません。それを除けば、おそらくロックされていないエミュレータを起動する方法はありますか?
コンソールインターフェイス を介してエミュレータと対話できます。
なぜエミュレータが5554のような番号で始まったのか疑問に思った場合、それはエミュレータがリッスンしているポートだからです。
adb devices
コマンドを使用して、エミュレータを実行するためのポートを見つけることができます。次のような出力が表示されます。
C:\>adb devices
List of devices attached
emulator-5554 device
したがって、次のようなコマンドを使用してエミュレータに接続できます。
telnet localhost 5554
接続に成功すると、OK
プロンプトが表示され、コマンドの入力を開始できます。
さまざまなコマンドがありますが、私たちが興味を持っているのは、ハードウェアイベントをシミュレートするevent
です。を押すと画面のロックを解除できます Menu 次のコマンドでエミュレートします。
event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
EV_KEY:KEY_MENU:1
はキーダウンイベントで、EV_KEY:KEY_MENU:0
は対応するキーアップイベントです。両方を実行してください。そうしないと、メニューキーが動かなくなります。
これは簡単ではありませんが、問題を解決するために考えられることはこれだけです。
編集:event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
はエミュレートしていないと思います Menu しかし、エミュレータを起動した直後にコマンドを実行すると、doesロックが解除されます。理由はわかりませんが、これは始まりだと思います。
4.0.3(API 15)エミュレータと通信するAndroid SDK r18およびr20で動作するワンライナー:
adb Shell input keyevent 82
次のリンクにあなたが探している答えがあると思います。
http://developer.Android.com/guide/topics/testing/activity_testing.html#UnlockDevice
エミュレーターまたはデバイスのロック解除
エミュレーターまたはデバイスのホーム画面がキーガードパターンで無効になっている場合、UIテストが機能しないことがあります。これは、テスト中のアプリケーションがsendKeys()によって送信されたキーイベントを受信できないためです。これを回避する最善の方法は、最初にエミュレーターまたはデバイスを起動してから、ホーム画面のキーガードを無効にすることです。
キーガードを明示的に無効にすることもできます。これを行うには、マニフェストファイル(AndroidManifest.xml)にアクセス許可を追加し、テスト対象のアプリケーションでキーガードを無効にする必要があります。ただし、アプリケーションを公開する前にこれを削除するか、公開したアプリケーションのコードで無効にする必要があることに注意してください。
権限を追加するには、要素を要素の子として追加します。 KeyGuardを無効にするには、テストするアクティビティのonCreate()メソッドに次のコードを追加します。
mKeyGuardManager =(KeyguardManager)getSystemService(KEYGUARD_SERVICE); mLock = mKeyGuardManager.newKeyguardLock( "activity_classname"); mLock.disableKeyguard();ここで、activity_classnameはアクティビティのクラス名です。
このスクリプトを試してください:
echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
画面をロック解除する最も簡単な方法(パスワードがない場合)は、KEYCODE_MENUイベントを渡すことです。ただし、画面のロックが既に解除されている場合は、実際にメニューが開きますが、これは目的の機能ではない可能性があります。
誤ってメニューを開かずに画面のロックを解除する簡単な方法が必要な場合は、最初にKEYCODE_POWERイベントを渡す必要があります。これにより、デバイスがロックされた状態になることが保証されるため、メニューイベントは画面のロックを解除するだけです。
adb Shell input keyevent KEYCODE_POWER; adb Shell input keyevent KEYCODE_MENU
(注:他の応答に表示される82はKEYCODE_MENU定数です。)
私はなんとかシェルを使用してそれを行うことができました:
adb Shell
#input keyevent 82
コマンドプロンプトからこのコマンドを実行して、エミュレータデバイスをロックできます。
adb Shell input keyevent 26
コマンドプロンプトからこのコマンドを実行して、エミュレータデバイスのロックを解除できます
adb Shell input keyevent 82
Unlockコマンドを実行した後、数分待つ必要がある場合があります。上記のロック解除コマンドは、セキュリティロックがない場合に機能します。