So I am building a android video call app using webrtc I have implemented every thing and tested the video call feature from my app it works like charm. But now I want to implement where the user can switch camera from rear to front and vice verse. I have seen a similar answer it was not for android it said to remove the stream and negotiate and new stream I didnt properly understand how to implement that in this code so I hope someone can help me with that thing Thank you
JavaScript File
localVideo.style.opacity = 0
remoteVideo.style.opacity = 0
localVideo.onplaying = () => { localVideo.style.opacity = 1 }
remoteVideo.onplaying = () => { remoteVideo.style.opacity = 1 }
let peer
function init(userId) {
peer = new Peer(userId, {
host: 'messenger-by-margs-video-call.herokuapp.com',
secure: true
})
peer.on('open', () => {
Android.onPeerConnected()
})
listen()
}
let localStream
function listen() {
peer.on('call', (call) => {
navigator.getUserMedia({
audio: true,
video: true
}, (stream) => {
localVideo.srcObject = stream
localStream = stream
call.answer(stream)
call.on('stream', (remoteStream) => {
remoteVideo.srcObject = remoteStream
remoteVideo.className = "primary-video"
localVideo.className = "secondary-video"
})
})
})
}
function startCall(otherUserId) {
navigator.getUserMedia({
audio: true,
video: true
}, (stream) => {
localVideo.srcObject = stream
localStream = stream
const call = peer.call(otherUserId, stream)
call.on('stream', (remoteStream) => {
remoteVideo.srcObject = remoteStream
remoteVideo.className = "primary-video"
localVideo.className = "secondary-video"
})
})
}
function toggleVideo(b) {
if (b == "true") {
localStream.getVideoTracks()[0].enabled = true
} else {
localStream.getVideoTracks()[0].enabled = false
}
}
function toggleAudio(b) {
if (b == "true") {
localStream.getAudioTracks()[0].enabled = true
} else {
localStream.getAudioTracks()[0].enabled = false
}
}
Heres my kotlin activity file.
class CallActivity : AppCompatActivity() {
var username = ""
var friendsUsername = ""
var isPeerConnected = false
var firebaseRef = FirebaseDatabase.getInstance().getReference("Users")
var isAudio = true
var isVideo = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_call)
username = FirebaseAuth.getInstance().uid.toString();
friendsUsername = intent.getStringExtra("userid")!!
call.setOnClickListener {
sendCallRequest()
}
toggleAudioBtn.setOnClickListener {
isAudio = !isAudio
callJavascriptFunction("javascript:toggleAudio(\"${isAudio}\")")
toggleAudioBtn.setImageResource(if (isAudio) R.drawable.ic_baseline_mic_24 else R.drawable.ic_baseline_mic_off_24 )
}
toggleVideoBtn.setOnClickListener {
isVideo = !isVideo
callJavascriptFunction("javascript:toggleVideo(\"${isVideo}\")")
toggleVideoBtn.setImageResource(if (isVideo) R.drawable.ic_baseline_videocam_24 else R.drawable.ic_baseline_videocam_off_24 )
}
setupWebView()
}
private fun sendCallRequest() {
if (!isPeerConnected) {
Toast.makeText(this, "You're not connected. Check your internet", Toast.LENGTH_LONG).show()
return
}
firebaseRef.child(friendsUsername).child("videocall").child("incall").setValue(username)
firebaseRef.child(friendsUsername).child("videocall").child("isAvailable").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value.toString() == "true") {
listenForConnId()
}
}
})
}
private fun listenForConnId() {
firebaseRef.child(friendsUsername).child("videocall").child("connId").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value == null)
return
switchToControls()
callJavascriptFunction("javascript:startCall(\"${snapshot.value}\")")
}
})
}
@SuppressLint("SetJavaScriptEnabled")
private fun setupWebView() {
webView.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest?) {
request?.grant(request.resources)
}
}
webView.settings.javaScriptEnabled = true
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.addJavascriptInterface(JavascriptInterface(this), "Android")
loadVideoCall()
}
private fun loadVideoCall() {
val filePath = "file:android_asset/call.html"
webView.loadUrl(filePath)
webView.webViewClient = object: WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
initializePeer()
}
}
}
var uniqueId = ""
private fun initializePeer() {
uniqueId = getUniqueID()
callJavascriptFunction("javascript:init(\"${uniqueId}\")")
firebaseRef.child(username).child("videocall").child("incall").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
onCallRequest(snapshot.value as? String)
}
})
}
private fun onCallRequest(caller: String?) {
if (caller == null) return
callLayout.visibility = View.VISIBLE
incomingCallTxt.text = "$caller is calling..."
acceptBtn.setOnClickListener {
firebaseRef.child(username).child("videocall").child("connId").setValue(uniqueId)
firebaseRef.child(username).child("videocall").child("isAvailable").setValue(true)
callLayout.visibility = View.GONE
switchToControls()
}
rejectBtn.setOnClickListener {
firebaseRef.child(username).child("videocall").child("incall").setValue(null)
callLayout.visibility = View.GONE
}
}
private fun switchToControls() {
//inputLayout.visibility = View.GONE
call.visibility = View.INVISIBLE
callControlLayout.visibility = View.VISIBLE
}
private fun getUniqueID(): String {
return UUID.randomUUID().toString()
}
private fun callJavascriptFunction(functionString: String) {
webView.post { webView.evaluateJavascript(functionString, null) }
}
fun onPeerConnected() {
isPeerConnected = true
}
}
I hope these are necessary information to my answer