2012年1月16日月曜日

internalメソッドの呼び出し

前のエントリに関連して、端末をrebootできないか調べてるときに、internal Class/methodの呼び出しも調べたので、ついでにエントリしておきます。
AndroidフレームワークではIActivityManager.shutdown()をCallして電源OFFを開始しているので、このinternal methodをアプリから直接呼び出すコードを書きます。

もちろんpermissionがない(というかrootが必要)ということで全く動作しません。
あくまでinternalなmethodの呼び出し方、ということで、書いておきます。
(internalの呼び出しはデメリットが多いので使うことないかもしれないけど)

なお、39行目で、メソッドを探すためにループしてますが、getMethod()をつかって一発で取り出すことも出来ます。

package test.alarm;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AlarmTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button button = (Button)findViewById(R.id.shutdown);
        
        button.setOnClickListener(new OnClickListener()
        {

   @Override
   public void onClick(View v) {
    ClassLoader cl = getClassLoader(); 
    try 
    {
     Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative");
     Class IActivityManager = Class.forName("android.app.IActivityManager");

     Method getDefault = ActivityManagerNative.getMethod("getDefault", null);
     Object am = IActivityManager.cast(getDefault.invoke(ActivityManagerNative, null));

     Method[] shutdown =  am.getClass().getMethods();//, Integer.class);
     Method sd = null;
     for (int i = 0; i < shutdown.length; i++)
     {
      if (shutdown[i].getName().equals("shutdown"))
      {
       Log.d("method", shutdown[i].getName());
       Log.d("method", shutdown[i].toString());
       sd = shutdown[i];
       
      }
    }
           if (am != null && sd != null) {  
            sd.invoke(am, 10);
     //am.shutdown(MAX_BROADCAST_TIME);    
           }  

    } catch (ClassNotFoundException e)
    {
     e.printStackTrace();
    } catch (NoSuchMethodException e)
    {
     e.printStackTrace();
    } catch (IllegalArgumentException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (InvocationTargetException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
         
        });

   }
   
}

0 件のコメント:

コメントを投稿