Вывести изображение в 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 или есть возможность вывода напрямую?


Ответы (0 шт):