Создайте копию экрана для использования в очках. Android

#java #android

#java #Android

Вопрос:

Мне нужно дублировать экран моего приложения, чтобы использовать его на аппаратном обеспечении очков. У меня есть только одно действие, поэтому я начал с самого простого решения:

 <LinearLayout 
android:orientation="horizontal">

<FrameLayout
    android:id="@ id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

<FrameLayout
    android:id="@ id/copy"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />

</LinearLayout>
  

И функция повторяющегося копирования:

 Bitmap b = Bitmap.createBitmap(root.getWidth(),
            root.getHeight(),
            Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
root.draw(c);
BitmapDrawable d = new BitmapDrawable(r, b);
copy.setBackground(d);
  

Работает хорошо, но не для видео или некоторых других конкретных представлений внутри корневого макета.

Как это исправить или какое-либо другое лучшее решение?

Ответ №1:

Найдено решение. Используйте SurfaceView в качестве целевого представления

 <SurfaceView
    android:id="@ id/copy"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />
  

И используйте MediaProjection:

 private MediaProjectionManager mediaProjectionManager;
private MediaProjection mediaProjection;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) activity.getSystemService(
            android.content.Context.MEDIA_PROJECTION_SERVICE);
    Intent permissionIntent = mediaProjectionManager.createScreenCaptureIntent();
    activity.startActivityForResult(permissionIntent, MEDIA_PROJECTION_REQUEST_CODE);
}

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (MEDIA_PROJECTION_REQUEST_CODE == requestCode) {
        if (resultCode == RESULT_OK) {
            mediaProjectionManager = (MediaProjectionManager) getSystemService(
                    android.content.Context.MEDIA_PROJECTION_SERVICE);
            mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, intent);
            startRecording(mediaProjection);
        }
    }
}

public void startRecording(MediaProjection mediaProjection) {
    DisplayManager dm = (DisplayManager) activity.getSystemService(Context.DISPLAY_SERVICE);
    Display defaultDisplay = null;
    if (dm != null) {
        defaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY);
    }
    if (defaultDisplay == null) {
        return;
    }

    DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
    int screenWidth = metrics.widthPixels;
    int screenHeight = metrics.heightPixels;
    int screenDensity = metrics.densityDpi;

    Surface inputSurface = copy.getHolder().getSurface();

    mediaProjection.createVirtualDisplay("Recording Display", screenWidth,
            screenHeight, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, inputSurface,
            null, null);
}
  

Это полностью решает задачу, все, что у нас есть на экране, дублируется.
Но более элегантные решения задачи приветствуются.