这是因为 Media Projection 和 Image Reader 无法跨进程使用,而 Netflix/Youtube 通常在自己的进程中运行。为了在 Netflix/Youtube 上使用 Media Projection 和 Image Reader,您需要使用 Android TV 上的屏幕录制功能来捕获屏幕上的视频帧。以下是示例代码:
private MediaProjectionManager mProjectionManager;
private MediaProjection mMediaProjection;
private VirtualDisplay mVirtualDisplay;
private ImageReader mImageReader;
private void startProjection() {
if (mProjectionManager == null) {
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
}
Intent intent = mProjectionManager.createScreenCaptureIntent();
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
// Set up the ImageReader
int width = getWindowManager().getDefaultDisplay().getWidth();
int height = getWindowManager().getDefaultDisplay().getHeight();
int dpi = getResources().getDisplayMetrics().densityDpi;
mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture",
width, height, dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mImageReader.getSurface(), null, null);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);
}
}
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
if (image != null) {
// Do something with the image
// ...
image.close();
}
}
}
这里的 startProjection
方法将启动屏幕捕获意图,当用户允许捕获后,onActivityResult
方法将获得 MediaProjection
对象。接下来,我们使用 `