2017-02-10 30 views
0

2 개의 별도 Android 앱 (apk)이 있습니다.AIDL을 통해 SurfaceHolder를 전달하는 방법은 무엇입니까?

앱 1은 내부에 SurfaceView을 생성하며 다른 앱이 SurfaceView에 대해 SurfaceHolder의 인스턴스를 얻으려면 AIDL 방법을 제공해야합니다. 따라서 다른 앱은 앱 번호 1에 표시되는 해당보기를 그릴 수 있습니다.

Parcelable 인터페이스를 구현하므로 Surface 자체를 쉽게 aidl을 통해 전송할 수있었습니다.

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

interface IMainService { 
    Surface getSurf(); 
} 

그러나 제 3 자 SGD는 그림을 그릴 때 SurfaceHolder이 필요합니다. 그래서 질문은 - 주어진 Surface 인스턴스에 대해 SurfaceHolder을 어떻게 만들 수 있습니까? 아니면 AIDL을 통해 SurfaceHolder을 어떻게 전송할 수 있습니까? SurfaceHolder에 대해 Parcelable을 구현하는 방법에 대한 예가 있습니까?

사례 (해당 사항) : 응용 프로그램 1은 Service으로 시작하고 프레젠테이션 화면에 UI를 그립니다. 그리고 앱 1 안에 Nokia Now Mobile SDK를 통해 다른 앱에 내비게이션 데이터를 표시하는 방법이 필요합니다. API를 사용하려면 SurfaceHolder이 필요합니다.

도움이 될 것입니다.

+0

SurfaceHolder 클래스를 확장하고 parcelabale –

+0

을 구현해 주셔서 감사합니다.하지만 SurfaceHolder는 인터페이스입니다. 그래서 ... 어떻게 할 수 있습니까? 또는 주어진 표면에서 어떻게 생성 할 수 있을까요? –

답변

3

잠시 후 여기 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에. 이 접근법은 Rect 크기를 요청할 수 있도록 AIDL을 확장해야합니다.

누군가에게 도움이되기를 바랍니다.