web-dev-qa-db-ja.com

電源ボタンを押してスイッチオフダイアログボックスを表示するシミュレーション

電源ボタンを押すと表示されるスイッチオフダイアログボックスを呼び出そうとしています。しかし、私はAndroidアプリケーションまたはJunitテストケースからこのタスクを達成したいと思います。このケースでは、最も実現可能なアプローチを選択します。これを試みましたが、成功できませんでした。私は次の5つのアプローチを使用しようとしています。

最初のアプローチ:

long eventTime = SystemClock.uptimeMillis(); boolean
                  dispateched = launcherButtonWInst.dispatchKeyEvent(new
                  KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN,
                  KeyEvent.KEYCODE_POWER, 0, 0, 0, 0, 0) );
                  Log.i(LOG_TAG,String.valueOf(dispateched)); boolean
                  dispateched2=launcherButtonWInst.dispatchKeyEvent(new
                  KeyEvent(eventTime+2000, eventTime+2000, KeyEvent.ACTION_UP,
                  KeyEvent.KEYCODE_POWER, 0, 0, 0, 0, 0) );
                  Log.i(LOG_TAG,String.valueOf(dispateched2));

================================================== =====

2番目のアプローチ:

private void generateKeys() {
        // Obtain the WindowManager system service interface
        IBinder wmbinder = ServiceManager.getService("window");
        Log.d(LOG_TAG, "WindowManager: " + wmbinder);
        IWindowManager wm = IWindowManager.Stub.asInterface(wmbinder);
        keyUpDown(wm, KeyEvent.KEYCODE_POWER);
    }

    private void keyUpDown(IWindowManager wm, int keycode) {
        try {
            Log.d(LOG_TAG, "keyDown: " + keycode);
            wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode), true);
            Log.d(LOG_TAG, "keyUp: " + keycode);
            wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode), true);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            Log.e("ERROR!!!!!", e.toString());
            e.printStackTrace();
        }
    }

================================================== ==========

3番目のアプローチ:

Instrumentation inst = new Instrumentation();
        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_POWER);

================================================== ====

4番目のアプローチ:

try {
                         long now =SystemClock.uptimeMillis();
                         KeyEvent down = new KeyEvent(now, now,
                         KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POWER, 0);

                         Log.d( LOG_TAG,down.toString() );
                         KeyEvent up = new KeyEvent(now+2000, now+2000,
                         KeyEvent.ACTION_UP, KeyEvent.KEYCODE_POWER, 0);
                         Log.d( LOG_TAG,up.toString() );
                         (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(down,
                         true);
                         try {
                         Thread.sleep(2000);
                         } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                         }
                         (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(up,
                         true);
                         } catch (RemoteException e) {
                         Log.d("LOGTAG",
                         "SendKeyEvent exception:"+e.getMessage());

}

5番目のアプローチ:

try {
                    Context mContext = getBaseContext();
                    Dialog dialog=new Dialog(mContext);
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                    ShutdownThread.shutdown(mContext, true);

                } catch (Exception e) {
                    Log.e("ERROR!!!", e.toString());
                    e.printStackTrace();
                }

================================================== =================

しかし、どれも私のために働いていません。 5番目のアプローチは、ShutdownThreadクラスのshutdown()メソッドを呼び出すことです。しかし、それは私に次のエラーを与えます:

07-05 10:18:21.489: W/System.err(709): Android.view.WindowManager$BadTokenException: Unable to add window Android.view.ViewRootImpl$W@4104d798 -- permission denied for this window type
07-05 10:18:21.499: W/System.err(709):     at Android.view.ViewRootImpl.setView(ViewRootImpl.Java:537)
07-05 10:18:21.499: W/System.err(709):     at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:301)
07-05 10:18:21.499: W/System.err(709):     at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:215)
07-05 10:18:21.499: W/System.err(709):     at Android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.Java:140)
07-05 10:18:21.499: W/System.err(709):     at Android.app.Dialog.show(Dialog.Java:278)
07-05 10:18:21.499: W/System.err(709):     at com.Android.internal.app.ShutdownThread.shutdown(ShutdownThread.Java:124)
07-05 10:18:21.499: W/System.err(709):     at aexp.keygen.KeyGen$1.onClick(KeyGen.Java:47)
07-05 10:18:21.499: W/System.err(709):     at Android.view.View.performClick(View.Java:3511)
07-05 10:18:21.499: W/System.err(709):     at Android.view.View$PerformClick.run(View.Java:14105)
07-05 10:18:21.509: W/System.err(709):     at Android.os.Handler.handleCallback(Handler.Java:605)
07-05 10:18:21.509: W/System.err(709):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
07-05 10:18:21.509: W/System.err(709):     at Android.os.Looper.loop(Looper.Java:137)
07-05 10:18:21.509: W/System.err(709):     at Android.app.ActivityThread.main(ActivityThread.Java:4424)
07-05 10:18:21.509: W/System.err(709):     at Java.lang.reflect.Method.invokeNative(Native Method)
07-05 10:18:21.509: W/System.err(709):     at Java.lang.reflect.Method.invoke(Method.Java:511)
07-05 10:18:21.509: W/System.err(709):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
07-05 10:18:21.509: W/System.err(709):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
07-05 10:18:21.509: W/System.err(709):     at dalvik.system.NativeStart.main(Native Method)

他のアプローチはエラーをスローしません。このタスクを達成するための助けが必要です。達成するためにネイティブメソッドを呼び出さなければならない場合でも、これを行うには、UIをオフに表示する必要があります。

ありがとう

アシュワニ

22
Ashwani Kumar

6番目のアプローチ:

$ adb Shell input keyevent 26

動作します!

7番目のアプローチ:

長押ししたい場合

$ adb Shell <<!
> sendevent /dev/input/event5 1 107 1
> sleep 1
> sendevent /dev/input/event5 1 107 0
> exit
> !

デバイスは/dev/input/event5とは異なる入力デバイスを使用する可能性があります

第八のアプローチ

このアプローチは少し賢く、APIレベルに応じてsendeventまたはinput keyeventを使用します。

#! /usr/bin/env python

from com.dtmilano.Android.adb.adbclient import *

AdbClient(serialno='your-serial-number-here').longPress('POWER')

ここでの利点は、これが一般的なアプローチであり、他のキーの送信にも使用できることです。 AdbClientはpython adbの実装であり、AndroidViewClient/culebra

22