Вывести изображение в VirtualDisplay Surface
Есть головное устройство для автомобиля, на борту Андроид 5.1.1. В лаунчере есть слайдер, в одной из страниц слайдера организован запуск виртуального дисплей и поверхности:
public class MapFragment extends BaseFragment implements IMapRenderReceiver {
private FragmentActivity mActivity;
private DisplayManager mDisplayManager;
private MapRenderReceiver mRenderMapReceiver = new MapRenderReceiver(this);
private int mSfHeight;
private int mSfWidth;
private SurfaceView mSurfaceView;
private ImageView mSurfaceViewDefaultBg;
private VirtualDisplay mVirtualDisplay;
@Override
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_map, container, false);
this.mActivity = getActivity();
initView(view);
init();
initMap();
return view;
}
private void initView(View view) {
this.mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceView);
this.mSurfaceViewDefaultBg = (ImageView) view.findViewById(R.id.SurfaceView_default_bg);
}
private void init() {
registerRenderMapReceiver();
this.mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) { }
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
MapFragment.this.showDefaultMap();
}
});
this.mSurfaceView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppsManager.getInstance().startApp(
MapFragment.this.mActivity.getApplicationContext(),
AppsConstant.MAP,
AppsConstant.MAP_PCK,
AppsConstant.MAP_MAIN
);
}
});
}
private void initMap() {
showDefaultMap();
this.mDisplayManager = (DisplayManager) this.mActivity.getSystemService("display");
this.mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
LogUtils.d(MapFragment.this.TAG, "surfaceDestroyed: ");
if (MapFragment.this.mVirtualDisplay != null) {
MapFragment.this.mVirtualDisplay.release();
MapFragment.this.mVirtualDisplay = null;
}
MapFragment.this.showDefaultMap();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
LogUtils.d(MapFragment.this.TAG, "surfaceCreated:");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
MapFragment.this.mSfWidth = width;
MapFragment.this.mSfHeight = height;
MapFragment.this.createVirtualDisplay(holder.getSurface());
}
});
}
@Override
public void showDefaultMap() {
LogUtils.d(this.TAG, "showDefaultMap:");
this.mSurfaceViewDefaultBg.setVisibility(0);
SkinChange.getInstance().skinChange(new ISkinChange() {
@Override
public void skinChange(String skin) {
switch (skin) {
case "black_theme":
MapFragment.this.mSurfaceViewDefaultBg.setImageResource(R.mipmap.surface_bg);
break;
case "glod_theme":
MapFragment.this.mSurfaceViewDefaultBg.setImageResource(R.mipmap.surface_glod_bg);
break;
case "red_theme":
MapFragment.this.mSurfaceViewDefaultBg.setImageResource(R.mipmap.surface_red_bg);
break;
}
}
});
}
private void registerRenderMapReceiver() {
IntentFilter intentFilter = new IntentFilter(Constant.ACTION_LAUNCHER_MAP_START_RENDER);
intentFilter.addAction(BroadcastConstant.ACTION_LAUNCHER_MAP_SHOW);
intentFilter.addAction(BroadcastConstant.ACTION_LAUNCHER_MAP_HIDE);
this.mActivity.getApplicationContext().registerReceiver(this.mRenderMapReceiver, intentFilter);
}
public void createVirtualDisplay(Surface surface) {
if (this.mVirtualDisplay == null) {
this.mVirtualDisplay = this.mDisplayManager.createVirtualDisplay(
"PresentationScreenLauncher",
this.mSfWidth,
this.mSfHeight,
320,
surface,
11
);
}
}
@Override
public void hideDefaultMap() {
LogUtils.d(this.TAG, "hideDefaultMap: ");
this.mSurfaceViewDefaultBg.setVisibility(8);
}
@Override
public void onDestroy() {
super.onDestroy();
this.mActivity.getApplicationContext().unregisterReceiver(this.mRenderMapReceiver);
this.mRenderMapReceiver.onDestroy();
}
}
<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:ns1="http://schemas.android.com/apk/res-auto"
ns1:layout_constraintStart_toStartOf="parent"
xmlns:ns2="http://schemas.android.com/apk/res-auto"
ns2:layout_constraintTop_toTopOf="parent"/>
Мне нужно вывести на эту поверхность изображение из другого приложениия. Как лучше это сделать, использовать Presentation или есть возможность вывода напрямую?