2011-10-22 102 views
3

我在看遠程android服務的commonwares例子。我不斷收到這個錯誤logcatAndroid遠程服務

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"; 
     } 
    } 

請誰能告訴我什麼,我做錯了。

回答

2

如果我猜的話,基於該錯誤信息,您AIDL不在服務和客戶端之間的同步。他們需要使用相同的AIDL定義。 「綁定器調用到不正確的接口」表明您的客戶端有一個AIDL版本,並且您的服務正在使用另一個版本。

+0

我想到了這些行,但它們是2個獨立的項目,也是我知道授予的唯一方法從s訪問客戶端ervice是一個簡單的導入語句,並且還在服務類的清單中聲明.aidl文件的完整包名稱。仍然難倒 – Arkangel

+0

@Arkangel:「我知道從服務中授予客戶端訪問權的唯一方式是一個簡單的導入語句」 - 我不知道你在說什麼。 「還要在服務類的清單中聲明.aidl文件的完整包名」--AIDL文件與清單無關。 [在文檔中]涵蓋了AIDL的使用(http://developer.android.com/guide/developing/tools/aidl.html),更不用說了[您正在嘗試的示例代碼的主頁](http://commonsware.com/AdvAndroid)。 – CommonsWare

+8

解決了今天的問題...複製了包含服務中的.aidl的包到客戶端,爲客戶端活動創建了一個單獨的包,並且它可以工作。錯誤是基於客戶端軟件包名稱而不是服務軟件包名稱綁定到.aidl接口。 – Arkangel

0

只是爲了記錄:

我有同樣的問題,並根據我的研究(如4小時)執行以下操作:

讓我說你有一個活動A,即控股服務本身和活動B,想要訪問活動A.的服務

確保兩個應用程序(A & B)使用相同的包名稱(例如com.example.coolname)。尤其是那個包含AIDL-File的文件。似乎很重要。

在我這樣做之前,我總是得到java.lang.SecurityException: Binder invocation to an incorrect interface,當我嘗試使用返回的IBinder對象時。 (bindung本身運作良好)

+1

爲什麼要投票? –

2

就我而言,我是因爲我有這個服務安裝在我的設備上的另一種變體得到這個錯誤,當我刪除它,一切都很好。

0

複製的包THT擁有服務到客戶端的.aidl,創建一個獨立的程序包的客戶端活動和它的作品。錯誤是基於客戶端軟件包名稱不是服務包名稱綁定到一個.aidl接口

0

在客戶端的.aidl文件必須住承載您呼叫的服務相同的包名下。爲此,請在客戶端創建一個與託管該服務的應用程序的包名稱相同的新包。您可以通過在客戶端的src文件夾右鍵單擊並選擇新建 - >包裝做到這一點。之後,將複製.aidle文件在該新包下。自從我將我的.aidl放在我的客戶端軟件包之後,我收到了這個錯誤。做這個包修復解決了我的問題。我認爲AIDL的Android手冊頁未能清楚地向讀者傳達。

0

您必須在同一目錄下的客戶端相同的AIDL文件,因爲它是有在服務器端。 所以請從服務器複製AIDL文件路徑目錄並將其粘貼到客戶端。

敵人例如,假設在服務器必須在以下路徑.aidl文件: -

com.theD.aidlExample - >在這條道路,你有MyAIDL.aidl

現在去給您的客戶src目錄,使客戶端的src目錄中的目錄結構相同,即com.theD.aidExample,並將服務器的aidl文件,即MyAIDL.aidl放置在客戶端新創建的目錄路徑