2012-09-04 47 views
0

我想在框架級別使用的MediaPlayback服務(在音樂應用程序實現),步驟是:麻煩時,使用遠程服務通信(在Android框架級別使用IMediaPlaybackService)

添加Java文件中這些代碼(也加IMediaPlaybackService.aidl在同一目錄)總部設在/框架/基/核心/ JAVA/COM /安卓

private IMediaPlaybackService mMediaPlaybackService = null; 
private boolean isServiceConn = false; 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     mMediaPlaybackService = IMediaPlaybackService.Stub.asInterface(service); 
     isServiceConn = true; 
    } 

    public void onServiceDisconnected(ComponentName className) { 
    } 
}; 

public void funcXXX() { 
    ... 

    if(isServiceConn == false) { 
     mContext.bindService(new intent("com.android.music.MediaPlaybackService"), mConnection, Context.BIND_AUTO_CREATE); 
    } 

    ... 
} 

public void onClick(View v) { 
    try { 
     mMediaPlaybackService.prev();// play previous track 
    } catch(RemoteException ex) { 
    } 
} 

成功綁定和mMediaPlaybackService的值被修正,但服務當我點擊一個按鈕,並執行聲明「mMediaPlaybackService.prev()」,progrem將崩潰,logcat轉儲爲:

E/AndroidRuntime( 259): java.lang.SecurityException: Binder invocation to an incorrect interface 
E/AndroidRuntime( 259): at android.os.Parcel.readException(Parcel.java:1327) 
E/AndroidRuntime( 259): at android.os.Parcel.readException(Parcel.java:1281) 
E/AndroidRuntime( 259): at com.android.internal.widget.IMediaPlaybackService$Stub$Proxy.prev(IMediaPlaybackService.java:457. 

請提出可能會出現什麼問題在這裏,任何幫助將不勝感激。 如果您簡要解釋如何使用bindService或IPC,它也會很有幫助。

回答

0

我解決了這個問題,我自己。關鍵是複製aidl到正確的地方。 我想在包裝上com.android.internal.widget(框架/基/核心/ JAVA/COM /安卓/內部/小工具)添加客戶端代碼,並AIDL的包是com.android.music,所以我們需要複製IMediaPlaybackService .aidl到框架/基/核心/ JAVA/COM /安卓/音樂/ IMediaPlaybackService.aidl(確保它會產生相同的Java文件),然後添加在框架/基地LOCAL_SRC_FILE AIDL路徑/ Android.mk(確保這個文件將被編譯)。