2017-02-10 18 views
0

У меня есть 2 отдельных приложения для Android (apk).Как пройти SurfaceHolder через AIDL?

Приложение 1 создает внутри него SurfaceView и должно предоставить методы AIDL для других приложений, чтобы получить экземпляр SurfaceHolder для таких SurfaceView. Таким образом, другие приложения смогут рисовать на этом изображении, отображаемом внутри номера приложения.

Я сам смог передать Surface через aidl, так как он реализует интерфейс Parcelable.

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

interface IMainService { 
    Surface getSurf(); 
} 

Но 3-й участник SDK нужно SurfaceHolder, чтобы рисовать. Поэтому возникает вопрос: как я могу создать SurfaceHolder для данного примера Surface, или как я могу передать SurfaceHolder через AIDL. Есть ли примеры того, как я могу реализовать Parcelable для SurfaceHolder?

Мой прецедент (если его вопрос): приложение 1 начинается как Service и рисует интерфейс на экране презентации. И мне нужен способ получить отображение других приложений. Данные навигации через Nokia Here Mobile SDK внутри приложения 1. Мне нужно SurfaceHolder, чтобы использовать this api.

Любая помощь будет оценена по достоинству.

+0

попробуйте расширить класс SurfaceHolder и реализовать parcelabale –

+0

спасибо, но SurfaceHolder - это интерфейс ... так ... как мы можем сделать его понятным? или, может быть, как его создать с данной поверхности? –

ответ

3

Через некоторое время, наконец, создайте решение, которое хорошо работает с API здесь OffscreenRender.

В одном приложении я создаю 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.

Надеюсь, что это будет полезно для кого-то.