如何通过AIDL传递SurfaceHolder?

时间:2017-02-10 09:51:58

标签: android surfaceview here-api aidl surfaceholder

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

应用1在其中创建SurfaceView,并应为其他应用提供AIDL方法,以便为此类SurfaceHolder获取SurfaceView的实例。因此其他应用程序将能够在该应用程序编号1中显示该视图。

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

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

interface IMainService {
    Surface getSurf();
}

但是第三方的sdk需要SurfaceHolder来吸引。问题是 - 如何为给定的SurfaceHolder实例创建Surface,或者如何通过AIDL传输SurfaceHolder。有没有关于如何为SurfaceHolder实现Parcelable的示例?

我的用例(如果有的话):App 1以Service开头并在Presentation Screen上绘制UI。我需要一种方法让应用程序1中的另一个应用程序通过诺基亚此处移动SDK显示导航数据。我需要SurfaceHolder才能使用this api。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

过了一会儿,最后创建一个适用于Here OffscreenRender API的解决方案。

在一个应用程序中,我创建了SurfaceHolder,这个应用程序提供了AIDL(参见上面的帖子)。使用此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大小。

希望对某人有所帮助。