如何通过AIDL传递SurfaceHolder?

How to pass SurfaceHolder via AIDL?

我有 2 个独立的 Android 应用程序 (apk)。

App 1 在其中创建了 SurfaceView,并且应该为其他应用程序提供 AIDL 方法来为这样的 SurfaceView 获取 SurfaceHolder 的实例。因此其他应用程序将能够在该视图上进行绘制,该视图显示在 1 号应用程序内。

我能够通过 aidl 轻松传输 Surface 本身,因为它实现了 Parcelable 接口。

// IMainService.aidl
package com.commonsware.cwac.preso.demo.service;
import android.view.Surface;

interface IMainService {
    Surface getSurf();
}

但第 3 方 sdk 需要 SurfaceHolder 才能使用。所以问题是——如何为给定的 Surface 实例创建 SurfaceHolder,或者如何通过 AIDL 传输 SurfaceHolder。有没有关于如何为 SurfaceHolder 实施 Parcelable 的示例?

我的用例(如果重要的话):应用程序 1 以 Service 开始并在演示屏幕上绘制 UI。我需要一种方法让另一个应用程序通过应用程序 1 中的 Nokia Here Mobile SDK 显示导航数据。我需要 SurfaceHolder 才能使用 this api。

如有任何帮助,我们将不胜感激。

经过一段时间,终于创建了一个与 Here OffscreenRender 配合良好的解决方案 API。

在一个应用程序中,我创建了 SurfaceHolder,这个应用程序提供了 AIDL(请参阅上面的 post)。使用此 AIDL,我能够正确发送 Surface 对象,然后在应用程序 2 端从中创建 SurfaceHolder。

public class MySurfaceHolder implements SurfaceHolder {

private Surface surface;
private Rect rect;

MySurfaceHolder(Surface surface, Rect rect) {
    this.surface = surface;
    this.rect = rect;
}

///....

@Override
public Canvas lockCanvas() {
    return surface.lockCanvas(this.rect);
}

@Override
public Canvas lockCanvas(Rect rect) {
    return surface.lockCanvas(rect);
}

@Override
public void unlockCanvasAndPost(Canvas canvas) {
    surface.unlockCanvasAndPost(canvas);
}

@Override
public Rect getSurfaceFrame() {
    return rect;
}

@Override
public Surface getSurface() {
    return surface;
}
}

基本上,它是我自己的 SurfaceHolder,由我自己而不是系统初始化。此方法也需要扩展 AIDL 才能请求 Rect 大小。

希望对某人有所帮助。