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

App 1 在其中创建 SurfaceView 并且应该为其他应用程序提供 AIDL 方法以获取此类 SurfaceHolderSurfaceView 实例。因此其他应用程序将能够在该 View 上绘制,显示在应用程序编号 1 中。

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

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

interface IMainService {
    Surface getSurf();
}

但是 3-rd 方 sdk 需要 SurfaceHolder 来借鉴。所以问题是 - 如何为给定的 SurfaceHolder 实例创建 Surface,或者如何通过 AIDL 传输 SurfaceHolder。有没有关于如何为 SurfaceHolder 实现 Parcelable 的示例?

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

任何帮助将不胜感激。

最佳答案

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

希望这会对某人有所帮助。

关于android - 如何通过 AIDL 传递 SurfaceHolder?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42156262/

10-08 21:12