如何通过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 大小。
希望对某人有所帮助。
我有 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 大小。
希望对某人有所帮助。