Wednesday, July 4, 2012

[android-developers] Simulating power button press from an android application

Hi,
    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:
First approach:
===============================================
  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));
=======================================================

Second apporach:
=====================================================
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();
        }
    }
============================================================

Third approach:
========================================================
Instrumentation inst = new Instrumentation();
        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_POWER);
======================================================

Fourth approach:
======================================================
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());
                        // }
================================================================

Fifth approach:
================================================================
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();
                }
===================================================================

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)

Other approaches does 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 the switch off UI.

thanks
Ashwani

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment