#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);
}
Это полностью решает задачу, все, что у нас есть на экране, дублируется.
Но более элегантные решения задачи приветствуются.