簡體   English   中英

JAVA:調用期望另一個接口作為參數的 AIDL 服務方法

[英]JAVA: Invoke an AIDL Service method that expects another Interface as a parameter

我正在嘗試調用一個期望另一個接口作為參數服務方法 我必須指出,我需要在不知道源代碼的情況下使用反射來實現這一點。 因此,使用反射我得到了與我需要調用其方法的服務相對應的接口。 然后我設法為該接口創建了一個 object。 之后,我可以調用這些函數,並且大多數函數都可以,但是當參數是另一個接口時,我會遇到問題。 例如,假設我們在IPermissionService中有以下方法:

public void addPermissionRevokedListener(IPermissionRevokedListener listener)

在為此方法生成參數時,我的代碼找到了 2 個可能的類:

IPermissionRevokedListener$Default
IPermissionRevokedListener$Stub$Proxy

目前它采用第一個並調用構造函數來創建 object。 到目前為止,一切似乎都很好,但是當執行調用時會拋出異常:

java.lang.IllegalArgumentException: 
    method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener, 
        got IPermissionRevokedListener$Default

我一直在挖掘並嘗試一些組合,但我找不到解決方案。 有沒有辦法解決這個問題?

對於那些不熟悉 AIDL 的人來說,Interface 部分通常是這樣的:

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
        {...}
    }
}

此外,一種可能性是嘗試連接到其他服務並獲取接口 object,類似於第一個完成的方式,但我不確定如何僅根據接口信息確定它是哪個服務。 此外,我最終可能會遇到幾乎相同的問題,唯一的區別是IPermissionRevokedListener$Stub$Proxy而不是IPermissionRevokedListener$Default ,因為從綁定服務獲取接口時給出了 IPermissionRevokedListener$Stub$Proxy )。 但是,我想知道是否也有可能根據接口找到服務。

無論如何,如果可以以某種方式使用$Default object,目前我會很高興。

編輯:最困擾我的是$Default實現了所需的接口,但不知何故不被接受。 另外,我只是嘗試使用反射代理來動態創建接口實現,並得到了類似的異常

java.lang.IllegalArgumentException: 
        method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener, 
            got $Proxy4

經過很長時間,我想我終於知道問題出在哪里了。 在搜索接口實現時,我使用了Dex Class 加載器來加載和檢查類。 所有這些都可以正常工作,但看起來這會導致以后出現問題。 當我從Dex Class 加載器更改為從相關接口檢索到的 Class 加載器時,使用$Default調用該方法沒有問題。 盡管現在我需要考慮到這些新信息來重構我的代碼。

我會把它留在這里,因為誰知道也許有人會走同樣的路,最終質疑他周圍的世界:)

此外,另一個問題仍然存在:是否可以僅根據接口詳細信息找到服務?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM