安卓远程服务

3

我在查看有关远程Android服务的常见示例。但是,我在Logcat中一直收到以下错误信息:

10-22 19:50:33.947: E/AndroidRuntime(30624): FATAL EXCEPTION: main
10-22 19:50:33.947: E/AndroidRuntime(30624): java.lang.SecurityException: Binder invocation to an incorrect interface
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.os.Parcel.readException(Parcel.java:1322)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.os.Parcel.readException(Parcel.java:1276)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at com.commonsware.android.advservice.client.IScript$Stub$Proxy.executeScript(IScript.java:82)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at com.commonsware.android.advservice.client.RemoteClientNewActivity$2.onClick(RemoteClientNewActivity.java:59)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.view.View.performClick(View.java:2532)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.view.View$PerformClick.run(View.java:9277)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.os.Handler.handleCallback(Handler.java:587)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.os.Looper.loop(Looper.java:143)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at android.app.ActivityThread.main(ActivityThread.java:4196)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at java.lang.reflect.Method.invokeNative(Native Method)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at java.lang.reflect.Method.invoke(Method.java:507)
10-22 19:50:33.947: E/AndroidRuntime(30624):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

我一直在尝试解决这个问题。

在这个活动中,我会这样做:

Intent i = new Intent("com.commonsware.android.advservice.IScript");
    bindService(i,svcConn, Context.BIND_AUTO_CREATE);

并且。
public void onServiceConnected(ComponentName className,IBinder binder) {
        service=IScript.Stub.asInterface(binder);
        if(service !=null){
            message = "connected";
        } 
    }

请问有人能告诉我我做错了什么吗?

6个回答

2
在我的情况下,我之所以出现这个错误,是因为我在设备上安装了这个服务的另一个版本,一旦我将其删除,一切都正常了。

2

如果我猜测正确的话,基于错误信息,你的AIDL在服务端和客户端之间不同步。他们需要使用相同的AIDL定义。"Binder invocation to an incorrect interface" 表明你的客户端有一个版本的AIDL,而你的服务端正在使用另一个版本。


我沿着这条线思考,但它们是两个独立的项目,我所知道的唯一将客户端访问服务授权的方法是使用简单的导入语句,并在服务类的清单中声明.aidl文件的完整包名称。仍然困惑。 - Arkangel
@Arkangel:“我知道的唯一授予服务客户端访问权限的方法是一个简单的导入语句”--我不知道你在说什么。“同时在服务类清单中声明.aidl文件的完整包名”--AIDL文件与清单无关。使用AIDL的方法已经在文档中有所涵盖(http://developer.android.com/guide/developing/tools/aidl.html),更不用说你正在尝试的样例代码所在的书籍了(http://commonsware.com/AdvAndroid)。 - CommonsWare
8
今天已经解决了问题...将包含 .aidl 文件的服务中的包复制到客户端,并为客户端活动创建一个单独的包,现在它可以正常工作了。错误在于基于客户端包名称而不是服务包名称绑定了 .aidl 接口。 - Arkangel
那份文档现在已经无法访问了,但书籍显然还是有效的! - Knossos
@Knossos:当我尝试访问时,该URL并没有404错误。无论如何,这本书的内容已经合并到另一本书中:http://commonsware.com/Android/ - CommonsWare
文档没有明确说明,客户端中的 .aidl 文件应该与远程 .aidl 文件具有相同的包名。 - Pankaj

0

在客户端和服务器端的同一目录下,必须有相同的AIDL文件。

请从服务器复制AIDL文件路径,并将其粘贴到客户端中。

例如,在服务器上,您可以在以下路径下找到.aidl文件:

com.theD.aidlExample -> 在此路径下您有MyAIDL.aidl

现在,请转到客户端的src目录,并在客户端的src目录中创建相同的目录结构,即com.theD.aidExample,并将服务器的aidl文件即MyAIDL.aidl放置在客户端新创建的目录路径中。


0

仅供记录:

我遇到了同样的问题,根据我的研究(大约4个小时),请执行以下操作:

假设您有一个Activity A,它持有服务本身和一个Activity B,它想要访问Activity A的服务。

确保两个应用程序(A&B)使用相同的包名称(例如com.example.coolname)。特别是包含AIDL文件的那个。 似乎非常重要。

在我执行此操作之前,当我尝试使用返回的IBinder对象进行操作时,总是会收到java.lang.SecurityException:Binder invocation to an incorrect interface。(绑定本身工作正常)


0

客户端的.aidl文件必须位于承载所调用服务的包名称下。为了做到这一点,在客户端上创建一个与应用程序主机包名称相同的新包。您可以通过在客户端的src文件夹上右键单击并选择 new->package 来实现这一点。然后,将.aidl文件复制到该新包下。由于我将.aidl放在我的客户端包下,所以出现了错误。进行包修复解决了我的问题。我认为Android AIDL手册页未能向读者清楚地传达这一点。


0

将包含 .aidl 的包从服务端复制到客户端,为客户端活动创建一个单独的包,这样就可以正常工作了。错误在于绑定到基于客户端包名而不是服务端包名的 .aidl 接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接