如何通过AIDL传递SurfaceHolder?

4

我有两个不同的Android应用程序(apk)。

应用程序1在其内部创建了 SurfaceView ,并应该提供AIDL方法以便其他应用程序获取此类 SurfaceView SurfaceHolder 实例。因此,其他应用程序将能够在应用程序1中显示的此视图上进行绘制。

由于 Surface 实现Parcelable接口,因此我能够轻松通过aidl转移Surface本身。

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

interface IMainService {
    Surface getSurf();
}

但是第三方sdk需要使用SurfaceHolder进行绘制。那么问题来了——我如何为给定的Surface实例创建SurfaceHolder,或者如何通过AIDL传输SurfaceHolder。是否有任何关于如何为SurfaceHolder实现Parcelable的示例?
我的用例(如果有用):应用程序1作为一个Service启动,并在演示屏幕上绘制UI。我需要一种方法来通过Nokia Here Mobile SDK在应用程序1内获取其他应用程序显示的导航数据。我需要SurfaceHolder以便使用api。
任何帮助将不胜感激。

尝试扩展SurfaceHolder类并实现parcelable。 - Nishant Verma
谢谢,但SurfaceHolder是一个接口...那么...我们怎样才能使它可供分配?或者从给定的表面创建它? - Andrey Suvorov
1个回答

8

经过一段时间的努力,终于创建出了与Here OffscreenRender API良好兼容的解决方案。

在一个应用程序中,我创建了SurfaceHolder,并提供了AIDL(请参见上面的帖子)。使用这个AIDL,我成功地发送了Surface对象,然后在第二个应用程序中,从中创建了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以便能够请求矩形大小。
希望对某些人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接