问题描述
我正在尝试调用按下电源按钮时出现的关闭对话框.但我想从一个 android 应用程序或一个 Junit 测试用例完成这个任务.在这种情况下,我将选择最可行的方法.我一直在尝试这样做,但未能成功.我正在尝试使用以下五种方法:
I am trying to invoke the switch off dialog box that appears when we press power button. But i want to accomplish this task from an android application or a Junit test case. I will choose the most feasible approach in this case. I have been trying to do this but was not able to succeed. I am trying to use the following five approaches:
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));
======================================================
=======================================================
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();
}
}
============================================================
============================================================
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_POWER);
======================================================
======================================================
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());
}
第五种方法:
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();
}
====================================================================
===================================================================
但是他们都没有为我工作.第五种方法是调用 ShutdownThread 类的 shutdown() 方法.但它给了我以下错误:
But none of them is working for me. The fifth approach is invoking shutdown() method of ShutdownThread class. But it gives me following error:
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.
Other approaches do not throw any error. I need help to accomplish this task, which ever way it takes even though I have to invoke native methods to accomplish I will do that, but I have to display the switch off UI.
谢谢
阿什瓦尼语
推荐答案
方法六:
$ adb shell input keyevent 26
有效!
如果你想长按
$ adb shell <<!
> sendevent /dev/input/event5 1 107 1
> sleep 1
> sendevent /dev/input/event5 1 107 0
> exit
> !
您的设备可能使用不同于 /dev/input/event5
You device may use a different input device than /dev/input/event5
这种方法更聪明一点,根据 API 级别使用 sendevent
或 input keyevent
.
This approach is a bit more clever and uses sendevent
or input keyevent
depending on API level.
#! /usr/bin/env python
from com.dtmilano.android.adb.adbclient import *
AdbClient(serialno='your-serial-number-here').longPress('POWER')
这里的优点是这是一种通用方法,也可用于发送其他密钥.AdbClient 是 adb
的 Python 实现,与 AndroidViewClient/culebra.
The advantage here is that this is a generic approach and can be used to send other keys too.AdbClient is a python implementation of adb
and is distributed with AndroidViewClient/culebra.
这篇关于模拟按下电源按钮显示关机对话框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!