2017-02-10 5 views
0

Ich habe 2 separate Android App (apk).Wie wird SurfaceHolder über AIDL übergeben?

App 1 erstellt SurfaceView darin und sollte AIDL-Methoden für andere Apps bereitstellen, um eine Instanz von SurfaceHolder für solche SurfaceView zu erhalten. So können die anderen Apps in der Lage sein, auf diese Ansicht innerhalb der App-Nummer 1 zu zeichnen.

Ich konnte Surface selbst über aidl leicht übertragen, da es Parcelable-Schnittstelle implementiert.

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

interface IMainService { 
    Surface getSurf(); 
} 

Aber 3-rd Party sdk müssen SurfaceHolder auf zeichnen. Die Frage ist also - wie kann ich SurfaceHolder für eine gegebene Surface Instanz erstellen, oder wie kann ich SurfaceHolder über AIDL übertragen. Gibt es Beispiele, wie ich Parcelable für SurfaceHolder implementieren kann?

Mein Anwendungsfall (falls es eine Sache ist): App 1 startet als Service und zeichnet die Benutzeroberfläche auf dem Präsentationsbildschirm. Und ich brauche eine Möglichkeit, um eine andere apps Anzeige Navigationsdaten über Nokia Here Mobile SDK innerhalb App 1 zu bekommen. Ich brauche SurfaceHolder, um this api zu verwenden.

Jede Hilfe wird geschätzt.

+0

Versuchen Sie, die SurfaceHolder-Klasse zu erweitern und parcelabale zu implementieren –

+0

danke, aber SurfaceHolder ist eine Schnittstelle ... so ... wie können wir es parzellierbar machen? oder vielleicht, wie man es von gegebener Oberfläche schafft? –

Antwort

3

Nach einer Weile, schließlich erstellen Sie eine Lösung, die gut mit Here OffscreenRender API funktioniert.

In einer App ich SurfaceHolder erstellen und diese App bieten AIDL (siehe oben im Beitrag). Mit dieser AIDL konnte ich Surface Objekt korrekt senden und dann, auf App 2 Seite, SurfaceHolder daraus machen.

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; 
} 
} 

Grundsätzlich ist es mein eigener SurfaceHolder, der von meinem eigenen, anstelle von System initialisiert wird. Dieser Ansatz muss AIDL erweitern, um auch Rect-Größen anfordern zu können.

Hoffe, dass für jemanden hilfreich sein wird.

Verwandte Themen