2017-02-10 73 views
0

我有2個單獨的Android應用程序(apk)。如何通過AIDL傳遞SurfaceHolder?

應用1創建SurfaceView裏面,並應提供用於其他應用AIDL方法來獲得的SurfaceHolder一個實例爲這樣SurfaceView。因此,其他應用程序將能夠在該視圖上繪製,顯示在應用程序編號1內。

由於它實現了Parcelable接口,我能夠通過aidl輕鬆轉移Surface本身。

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

interface IMainService { 
    Surface getSurf(); 
} 

但是第三方sdk需要SurfaceHolder來借鑑。所以問題是 - 如何爲給定的Surface實例創建SurfaceHolder,或者如何通過AIDL傳輸SurfaceHolder。有沒有例子說明我可以如何爲SurfaceHolder實現Parcelable?

我的用例(如果有問題):應用程序1以Service開頭並在Presentation Screen上畫UI。我需要一種方式讓應用程序1中的其他應用程序通過Nokia Here Mobile SDK顯示導航數據。我需要SurfaceHolder才能使用this api。

任何幫助將不勝感激。

+0

嘗試擴展SurfaceHolder類並實現parcelabale –

+0

謝謝,但SurfaceHolder是一個接口...所以...我們如何使它可以進行parcelable?或者如何從給定的表面創建它? –

回答

3

過了一段時間,最終創建了一個與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大小。

希望對某人有幫助。