У меня есть два сценария,
- Чтобы наложить мой экран таким образом, чтобы происходило потоковое воспроизведение (работает нормально)
При совместном использовании экрана я должен записать и сохранить его в формате mp4 т.е. на внешнем хранилище. Вот где я получаю эту ошибку.
Для потоковой передачи я использую ScreenCapturer Android, который внутренне вызывает getMediaProjection (resultCode, data) для запуска захвата экрана.
Я использую MediaRecorder для записи и сохранения захваченного видео в формате mp4. И при вызове mProjectionManager.getMediaProjection (resultCode, data); Я получаю эту ошибку.
java.lang.IllegalStateException: Cannot start already started MediaProjection
Вот мой код
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE) {
Log.d("WebR", String.valueOf(CAPTURE_PERMISSION_REQUEST_CODE));
return;
}
mMediaProjectionPermissionResultCode = resultCode;
mMediaProjectionPermissionResultData = data;
Log.d("WebR", "ReqCode" + String.valueOf(requestCode));
Log.d("WebR", "ResCode" + String.valueOf(resultCode));
Log.d("WebR", "ResData" + String.valueOf(data));
init();
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
mVirtualDisplay = createVirtualDisplay();
mMediaRecorder.start();
}
private void init() {
PeerConnectionClient.PeerConnectionParameters peerConnectionParameters =
new PeerConnectionClient.PeerConnectionParameters(true, false,
true, sDeviceWidth / SCREEN_RESOLUTION_SCALE, sDeviceHeight / SCREEN_RESOLUTION_SCALE, 0,
0, "VP8",
false,
true,
0,
"OPUS", false, false, false, false, false, false, false, false, null);
// mWebRtcClient = new WebRtcClient(getApplicationContext(), this, pipRenderer, fullscreenRenderer, createScreenCapturer(), peerConnectionParameters);
if(createScreenCapturer() == null) {
return;
} else {
mWebRtcClient = new WebRtcClient(getApplicationContext(), this, createScreenCapturer(), peerConnectionParameters);
}
}
@TargetApi(21)
private VideoCapturer createScreenCapturer() {
if (mMediaProjectionPermissionResultCode != Activity.RESULT_OK) {
report("User didn't give permission to capture the screen.");
Log.d("WebR", "user didn't give permission");
return null;
}
Log.d("WebR", "user gave permission");
return new ScreenCapturerAndroid(
mMediaProjectionPermissionResultData, new MediaProjection.Callback() {
@Override
public void onStop() {
report("User revoked permission to capture the screen.");
}
});
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private VirtualDisplay createVirtualDisplay() {
return mMediaProjection.createVirtualDisplay("MainActivity",
DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null /*Callbacks*/, null
/*Handler*/);
}