Проблема при использовании связи удаленного сервиса (используйте 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(убедитесь, что это файл будет скомпилирован).

Другие вопросы по тегам