web-dev-qa-db-ja.com

Androidでプログラムで画面のロックを解除するにはどうすればよいですか?

私はAndroid JUnitに基づくリモート自動テストフレームワークに取り組んでいます(テストはAndroidの外部で実行され、その内部のコードと対話します)。すべてうまく機能していますが、問題の1つは新しいエミュレータを自動的に起動すると、画面がロックされた状態で起動します。これは、実行可能なテストに影響しているようです。さらに、テストの実行(ボタンのクリック、テキスト入力など)を監視したいと思います。手動でエミュレータを起動した場合画面のロックを解除すれば、すべてうまくいきます。

プログラムでAndroidの画面のロックを解除する方法はありますか? Java API、コマンドライン、またはシェルコマンドなどはすべて問題ありません。それを除けば、おそらくロックされていないエミュレータを起動する方法はありますか?

29
SingleShot

コンソールインターフェイス を介してエミュレータと対話できます。

なぜエミュレータが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ロックが解除されます。理由はわかりませんが、これは始まりだと思います。

22
Dave Webb

4.0.3(API 15)エミュレータと通信するAndroid SDK r18およびr20で動作するワンライナー:

adb Shell input keyevent 82
18
Drew Stephens

次のリンクにあなたが探している答えがあると思います。

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はアクティビティのクラス名です。

12
luisr

このスクリプトを試してください:

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
6
Yimin Li

画面をロック解除する最も簡単な方法(パスワードがない場合)は、KEYCODE_MENUイベントを渡すことです。ただし、画面のロックが既に解除されている場合は、実際にメニューが開きますが、これは目的の機能ではない可能性があります。

誤ってメニューを開かずに画面のロックを解除する簡単な方法が必要な場合は、最初にKEYCODE_POWERイベントを渡す必要があります。これにより、デバイスがロックされた状態になることが保証されるため、メニューイベントは画面のロックを解除するだけです。

adb Shell input keyevent KEYCODE_POWER; adb Shell input keyevent KEYCODE_MENU

(注:他の応答に表示される82はKEYCODE_MENU定数です。)

5
chinnychin19

私はなんとかシェルを使用してそれを行うことができました:

adb Shell
#input keyevent 82
4

コマンドプロンプトからこのコマンドを実行して、エミュレータデバイスをロックできます。

adb Shell input keyevent 26

コマンドプロンプトからこのコマンドを実行して、エミュレータデバイスのロックを解除できます

adb Shell input keyevent 82

Unlockコマンドを実行した後、数分待つ必要がある場合があります。上記のロック解除コマンドは、セキュリティロックがない場合に機能します。

0
Ganesh Devaraj