如何解决JAVA:调用需要另一个接口作为参数的 AIDL 服务方法
我正在尝试调用一个服务方法,该方法需要另一个接口作为参数。我必须指出,我需要在不知道源代码的情况下使用 Reflection 来实现这一点。因此,使用反射,我得到了对应于我需要调用其方法的服务的接口。然后我设法为该接口创建了一个对象。之后我就可以调用这些函数了,并且对于它们中的大多数来说这是有效的,但是当参数是另一个接口时我遇到了问题。例如,假设我们在 IPermissionService 中有以下方法:
public void addPermissionRevokedListener(IPermissionRevokedListener listener)
在为此方法生成参数时,我的代码找到了 2 个可能的类:
IPermissionRevokedListener$Default
IPermissionRevokedListener$Stub$Proxy
目前它采用第一个并调用构造函数来创建对象。 到目前为止一切似乎都很好,但是当执行调用时会抛出异常:
java.lang.IllegalArgumentException:
method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener,got IPermissionRevokedListener$Default
我一直在挖掘并尝试一些组合,但我找不到解决方案。有没有办法解决这个问题?
对于那些不熟悉 AIDL 的人来说,界面部分通常是这样的:
public interface IPermissionRevokedListener extends android.os.IInterface
{
public static class Default implements IPermissionRevokedListener
{...}
public static abstract class Stub extends android.os.Binder implements IPermissionRevokedListener
{
private static class Proxy implements IPermissionRevokedListener
{...}
}
}
另外,一种可能性是尝试连接到另一个服务并获取接口对象,类似于第一个完成的方式,但我不确定如何仅基于接口信息。此外,我最终可能会遇到几乎相同的问题,唯一的区别是 IPermissionRevokedListener$Stub$Proxy 而不是 IPermissionRevokedListener$Default,因为 IPermissionRevokedListener$Stub$Proxy 在从绑定的 Service 获取接口时给出)。但是,我想知道是否有可能也找到基于接口的服务。
无论如何,如果可以以某种方式使用 $Default 对象,我会很高兴。
编辑:最让我烦恼的是 $Default 实现了所需的接口,但不知何故不被接受。 另外,我只是尝试使用反射代理来动态创建接口实现并得到了类似的异常:
java.lang.IllegalArgumentException:
method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener,got $Proxy4
解决方法
经过很多时间,我想我终于知道问题所在了。在搜索接口实现时,我使用 Dex 类加载器 来加载和检查类。一切正常,但看起来这会在以后引起问题。当我从 Dex 类加载器 更改为从相关接口检索到的类加载器时,使用 $Default 调用该方法没有问题。尽管现在我需要考虑到这些新信息来重构我的代码。
我会留在这里,因为谁知道也许有人会走同样的路并最终质疑他周围的世界:)
另外,另一个问题仍然存在:是否可以仅根据接口详细信息找到服务?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。