Skip to main content
Version: 0.1.x

Screen Share - Android

Screen sharing in a meeting is the process of sharing your mobile screen with other participants in the meeting. It allows everyone in the meeting to see exactly what you are seeing on your screen, which can be helpful for presentations, demonstrations, or collaborations.

How Screen share works?

  • The following diagram shows flow of the screen sharing in android using VideoSDK :

VideoSDK Android Screenshare Flow Diagram

enableScreenShare()

  • By using enableScreenShare() function of Meeting class, local participant can share his/her mobile screen to other participants.

  • You can pass customised screenshare track in enableScreenShare() by using Custom Screen Share Track.

  • Screen Share stream of the participant can be accessed from the onStreamEnabled event of ParticipantEventListener.

Screenshare permission

  • A participant’s Screen share stream is provided via the MediaProjection API. This API is only compatible with Build.VERSION_CODES.LOLLIPOP or higher.

  • Get an instance of the MediaProjectionManager and Call the createScreenCaptureIntent() method in an activity. This initiates a prompt dialog for the user to confirm screen projection.

  • One will get a prompt dialog like this:

user permission

  • After permission is received from the user, you can call enableScreenShare() method.
private fun enableScreenShare() {
val mediaProjectionManager = application.getSystemService(
MEDIA_PROJECTION_SERVICE
) as MediaProjectionManager
startActivityForResult(
mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE
)
}

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE) return
if (resultCode == RESULT_OK) {
// Enabling screen share
meeting!!.enableScreenShare(data)
}
}

Customise notification

  • When a presenter starts screen share, presenter will receive a notification with a pre-defined title and message.

  • Notification with pre-defined title and message will look like this:

notification
  • You can Customise those title, message and icon as per your requirements using <meta-data> specified in app/src/main/AndroidManifest.xml.
<application>
<meta-data
android:name="notificationTitle"
android:value="@string/notificationTitle"
/>
<meta-data
android:name="notificationContent"
android:value="@string/notificationContent"
/>
<meta-data
android:name="notificationIcon"
android:resource="@mipmap/ic_launcher_round"
/>
</application>

disableScreenShare()

  • By using disableScreenShare() function of Meeting class, local participant can stop sharing his/her mobile screen to other participants.
private fun disableScreenShare() {
// Disabling screen share
meeting!!.disableScreenShare()
}

Events associated with enableScreenShare

  • Participant who share their mobile screen will receive a callback on onStreamEnabled() of the Participant with Stream object.

  • While other Participants will receive onPresenterChanged() callback of the Meeting class with the participantId as presenterId who started the screen share.

Events associated with disableScreenShare

  • Participant who shared their mobile screen will receive a callback on onStreamDisabled() of the Participant with Stream object.

  • While other Participants will receive onPresenterChanged() callback of the Meeting class with the presenterId as null indicating there is no presenter.

private fun setLocalListeners() {
meeting!!.localParticipant.addEventListener(object : ParticipantEventListener() {
//Callback for when the participant starts a stream
override fun onStreamEnabled(stream: Stream) {
if (stream.kind.equals("share", ignoreCase = true)) {
Log.d("VideoSDK","Share Stream On: onStreamEnabled $stream");
}
}

//Callback for when the participant stops a stream
override fun onStreamDisabled(stream: Stream) {
if (stream.kind.equals("share", ignoreCase = true)) {
Log.d("VideoSDK","Share Stream On: onStreamDisabled $stream");
}
}
});
}

private val meetingEventListener: MeetingEventListener = object : MeetingEventListener() {
//Callback for when the presenter changes
override fun onPresenterChanged(participantId: String) {
if(!TextUtils.isEmpty(participantId))
{
Log.d("VideoSDK","$participantId started screen share");
}else{
Log.d("VideoSDK","some one stopped screen share");
}
}
}

Rendering Screen Share Stream

  • When a local participant shares their screen, the onStreamEnabled() function of the ParticipantEventListener is triggered, allowing the Stream to be added to a VideoView.
private fun setLocalListeners() {
meeting!!.localParticipant.addEventListener(object : ParticipantEventListener() {
override fun onStreamEnabled(stream: Stream) {
if (stream.kind.equals("share", ignoreCase = true)) {
// display share video
val videoTrack = stream.track as VideoTrack
shareView!!.addTrack(videoTrack)
}
}
override fun onStreamDisabled(stream: Stream) {
if (stream.kind.equals("share", ignoreCase = true)) {
shareView!!.removeTrack()
}
}
});
}
  • When another participant (excluding the local participant) shares their screen, the onPresenterChanged() function in the MeetingEventListener is triggered, providing the participantId of the screen sharer.
private val meetingEventListener: MeetingEventListener = object : MeetingEventListener() {
override fun onPresenterChanged(participantId: String) {
updatePresenter(participantId)
}
}

//Getting the stream from the participantId
private fun updatePresenter(participantId: String?) {
// find participant
val participant = meeting!!.participants.get(participantId) ?: return

// find share stream in participant
var shareStream: Stream? = null
for (stream: Stream in participant.streams.values) {
if ((stream.kind == "share")) {
shareStream = stream
break
}
}
if (shareStream == null) return

// display share video
val videoTrack = shareStream.track as VideoTrack
shareView!!.addTrack(videoTrack)

// listen for share stop event
participant.addEventListener(object : ParticipantEventListener() {
override fun onStreamDisabled(stream: Stream) {
if ((stream.kind == "share")) {
shareView!!.removeTrack()
}
}
})
}
info
  • Here screenShare stream is displayed using VideoView, but you may also use SurfaceViewRender for the same.
  • For VideoView, SDK version should be 0.1.13 or higher.
  • To know more about VideoView, please visit here

API Reference

The API references for all the methods and events utilised in this guide are provided below.

Got a Question? Ask us on discord