我想在框架级别使用MediaPlayback服务(在音乐应用程序中实现),步骤是:
将这些代码添加到基于/ frameworks / base / core / java / com / android的java文件中(也在同一目录中添加IMediaPlaybackService.aidl):
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 :(得分:0)
我自己解决了这个问题。关键是复制援助以纠正错误的地方。 我想在com.android.internal.widget包上添加客户端代码(frameworks / base / core / java / com / android / internal / widget),而aidl的包是com.android.music,所以我们需要复制IMediaPlaybackService。 aidl to frameworks / base / core / java / com / android / music / IMediaPlaybackService.aidl(确保它将生成相同的java文件),然后在frameworks / base / Android.mk中添加aidl路径到LOCAL_SRC_FILE(确保这一点文件将被编译)。