【问题标题】:Reflection to access advanced telephony features反射以访问高级电话功能
【发布时间】:2010-01-04 18:10:42
【问题描述】:

我正在尝试使用反射来访问电话 API 的一些未发布的功能。目前,我无法实例化一个serviceManager 对象,该对象需要将“电话”服务作为活页夹,然后我可以使用它来实例化拨打电话、结束通话等所需的电话对象......

目前当我打电话时

serviceManagerObject = tempInterfaceMethod.invoke(null, new Object[] { new Binder() });

它返回一个 nullPointerException。我相信这与创建一个新的 Binder 而不是发送适当的活页夹有关(我不确定哪个合适)

public void placeReflectedCall() throws ClassNotFoundException,
        SecurityException, NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException,
        InstantiationException {
    String serviceManagerName = "android.os.IServiceManager";
    String serviceManagerNativeName = "android.os.ServiceManagerNative";
    String telephonyName = "com.android.internal.telephony.ITelephony";

    Class telephonyClass;
    Class telephonyStubClass;
    Class serviceManagerClass;
    Class serviceManagerStubClass;
    Class serviceManagerNativeClass;
    Class serviceManagerNativeStubClass;

    Method telephonyCall;
    Method telephonyEndCall;
    Method telephonyAnswerCall;
    Method getDefault;

    Method[] temps;
    Constructor[] serviceManagerConstructor;

    // Method getService;
    Object telephonyObject;
    Object serviceManagerObject;
    String number = "1111111111";

    telephonyClass = Class.forName(telephonyName);
    telephonyStubClass = telephonyClass.getClasses()[0];
    serviceManagerClass = Class.forName(serviceManagerName);
    serviceManagerNativeClass = Class.forName(serviceManagerNativeName);

    Method getService = // getDefaults[29];
    serviceManagerClass.getMethod("getService", String.class);

    Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
            "asInterface", IBinder.class);
    // this does not work
    serviceManagerObject = tempInterfaceMethod.invoke(null,
            new Object[] { new Binder() });

    IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject,
            "phone");
    Method serviceMethod = telephonyStubClass.getMethod("asInterface",
            IBinder.class);
    telephonyObject = serviceMethod
            .invoke(null, new Object[] { retbinder });

    telephonyCall = telephonyClass.getMethod("call", String.class);
    telephonyEndCall = telephonyClass.getMethod("endCall");
    telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall");

    telephonyCall.invoke(telephonyObject, number);

}

【问题讨论】:

  • “目前我在实例化 serviceManager 对象时遇到问题”是您提供的有关错误或问题的唯一信息。你已经给了我们代码。现在告诉我们它在做什么或不做什么是出乎意料的,以及您如何知道它没有正常工作。

标签: java android


【解决方案1】:

通过执行以下操作

Binder tmpBinder = new Binder();
tmpBinder.attachInterface(null, "fake");
serviceManagerObject = tempInterfaceMethod.invoke(null,  new Object[] { tmpBinder });

你会得到一个ServiceManagerProxy实例,然后下一个问题发生就行了

telephonyCall.invoke(telephonyObject, number);

【讨论】:

    【解决方案2】:

    我有一个解决方案。变化:

    String serviceManagerName = "android.os.IServiceManager"; 
    

    到:

    String serviceManagerName = "android.os.ServiceManager"; 
    

    【讨论】:

      【解决方案3】:

      是的,这是可能的!我花了 24 小时调查和发现,我找到了“新鲜”的解决方案!

      // "cheat" with Java reflection to gain access to
      // TelephonyManager's ITelephony getter
      Class c = Class.forName(tm.getClass().getName());
      Method m = c.getDeclaredMethod("getITelephony");
      m.setAccessible(true);
      telephonyService = (ITelephony) m.invoke(tm);
      

      任何想要开发他们的呼叫控制软件的人都可以访问这个起点:
      http://www.google.com/codesearch/p?hl=en#zvQ8rp58BUs/trunk/phone/src/i4nc4mp/myLock/phone/CallPrompt.java&q=itelephony%20package:http://mylockforandroid%5C.googlecode%5C.com&d=0

      有一个项目。并且有重要的 cmets(和学分)。

      简而言之:复制aidl文件,向清单添加权限,复制粘贴源以进行电话管理。

      为您提供更多信息:如果您是 root,您只能发送 AT 命令。然后您可以杀死系统进程并发送命令,但您需要重新启动才能让您的手机接听和发送电话。

      我很高兴!现在我的 Shake2MuteCall 将得到更新!

      【讨论】:

      • 嗨。我是mylock的开发者。我只是想通知您,这不再适用于 2.3,我们正在研究如何在假设超级用户 root 权限的情况下完成相同的结果。我没有想出这种方法,我的一个朋友 Tedd 偶然发现了它,并想出了将反射应用于电话的方法。
      • 嘿@AlBeebe 上面的链接现在不起作用,您能分享aidl 文件和电话管理源吗?这对我有很大帮助。
      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2018-01-25
      • 1970-01-01
      相关资源
      最近更新 更多