【问题标题】:How to pass SurfaceHolder via AIDL?如何通过 AIDL 传递 SurfaceHolder?
【发布时间】:2017-02-10 09:51:57
【问题描述】:

我有 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。我需要一种方法让另一个应用程序通过诺基亚 Here Mobile SDK 在应用程序 1 中显示导航数据。我需要 SurfaceHolder 才能使用 this api。

任何帮助将不胜感激。

【问题讨论】:

  • 尝试扩展 SurfaceHolder 类并实现 parcelabale
  • 谢谢,但是 SurfaceHolder 是一个接口......所以......我们怎样才能使它可包裹?或者如何从给定的表面创建它?

标签: android surfaceview here-api aidl surfaceholder


【解决方案1】:

一段时间后,终于创建了一个与 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 大小。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多