Open
Description
I have implemented a screen-sharing feature in my Android application, but I am not receiving a callback in onVideoTileAdded(). However, I do receive a callback in onAttendeesJoined() with my ID and #content.
I am sharing my code below. Could you please review it and help me identify any issues in my implementation?
Thank you for your time and assistance.
mediaProjectionManager =
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startActivityForResult(
mediaProjectionManager.createScreenCaptureIntent(),
SCREEN_SHARE_REQUEST_CODE
);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == SCREEN_SHARE_REQUEST_CODE && resultCode == RESULT_OK) {
startScreenShare( resultCode,data,this);
} else {
Log.e("ScreenShare", "Screen sharing permission denied");
}
super.onActivityResult(requestCode, resultCode, data);
}
private void startScreenShare(int resultCode, Intent data, Context fragmentContext) {
// Get DisplayManager service
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
// Initialize Logger
ConsoleLogger logger = new ConsoleLogger(LogLevel.DEBUG);
// Define Service Connection for Screen Sharing
mMeetingModel.setScreenShareServiceConnection(new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
Log.d("ScreenShare", "📢 Screen Share Service Connected");
// Ensure EGL Factory and Meeting Session are available
if (mMeetingSessionModel.getEglCoreFactory() == null || sessionConfig == null || audioVideo == null) {
Log.e("ScreenShare", "📢 Required dependencies are null. Cannot start screen sharing.");
return;
}
// Initialize Screen Capture Source
DefaultScreenCaptureSource screenCaptureSource = new DefaultScreenCaptureSource(
activity,
logger,
new DefaultSurfaceTextureCaptureSourceFactory(logger, mMeetingSessionModel.getEglCoreFactory()),
resultCode,
data,
displayManager,
mediaProjectionManager
);
// Mark screen share service as bound
mMeetingModel.setScreenShareServiceBound(true);
// Define Capture Observer
CaptureSourceObserver screenCaptureSourceObserver = new CaptureSourceObserver() {
@Override
public void onCaptureStarted() {
Log.d("ScreenShare", "📢 Screen sharing started.");
if (screenShareManager != null && audioVideo != null) {
Log.d("ScreenShare", "📢 Screen sharing started function called .");
mMeetingSessionModel.getMeetingSession().getAudioVideo().startContentShare(screenShareManager);
}
}
@Override
public void onCaptureStopped() {
Log.d("ScreenShare", "📢 Screen sharing stopped.");
}
@Override
public void onCaptureFailed(CaptureSourceError error) {
Log.e("ScreenShare", "📢 Screen sharing failed: " + error);
if (audioVideo != null) {
audioVideo.stopContentShare();
}
}
};
// Set max resolution for screen share
if (sessionConfig != null && sessionConfig.getFeatures() != null) {
screenCaptureSource.setMaxResolution(sessionConfig.getFeatures().getContentMaxResolution());
}
// Initialize and Start Screen Share Manager
screenShareManager = new ScreenShareManager(screenCaptureSource, fragmentContext);
screenShareManager.setScreenCaptureConnectionService(mMeetingModel.getScreenShareServiceConnection());
screenShareManager.addObserver(screenCaptureSourceObserver);
screenShareManager.start();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d("ScreenShare", "📢 Screen Share Service Disconnected");
mMeetingModel.setScreenShareServiceBound(false);
}
});
// Start Screen Capture Service
Intent intent = new Intent(fragmentContext, ScreenCaptureService.class);
fragmentContext.startService(intent);
// Bind Service if Connection is Available
if (mMeetingModel.getScreenShareServiceConnection() != null) {
fragmentContext.bindService(intent, mMeetingModel.getScreenShareServiceConnection(), Context.BIND_AUTO_CREATE);
}
}
Metadata
Metadata
Assignees
Labels
No labels