Проблема при использовании связи удаленного сервиса (используйте IMediaPlaybackService на уровне платформы Android)
Я хочу использовать сервис MediaPlayback (достигнут в музыкальном приложении) на уровне платформы, шаги:
добавил эти коды в Java-файл (также добавьте IMediaPlaybackService.aidl в тот же каталог), основанный в / Frameworks / Base / Core / Java / Com / Android:
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()", программа завершается сбоем, дамп 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.
1 ответ
Я сам исправил эту проблему. ключ копировать в правильное место. Я хочу добавить код клиента в пакет com.android.internal.widget(frameworks/base/core/java/com/android/internal/widget), а пакет aidl - com.android.music, поэтому нам нужно скопировать IMediaPlaybackService.aidl для frameworks/base/core/java/com/android/music/IMediaPlaybackService.aidl(убедитесь, что он сгенерирует тот же файл java), а затем добавьте путь aidl к LOCAL_SRC_FILE в frameworks/base/Android.mk(убедитесь, что это файл будет скомпилирован).