WebView Integration
To integrate the Uqudo Web SDK into your WebView implementation, follow the guide below :
Requirements
Enable JavaScript in WebView
Enable allowsInlineMediaPlayback in your IOS Webview implementation
Enable DOM storage in Android. In iOS should be enabled by default
In Android, it is recommended to use WebChromeClient to handle camera access within a WebView.
Camera permission considerations
Android
On Android, you need to declare permissions in AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />
And at runtime (for Android 6.0+), you need to explicitly request the permission:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
Note: Do not open the WebView if camera permission has not been granted, as camera functionality will not work. You need to manage permissions beforehand.
Within the WebView client, even if the application-level camera permission is granted, you must also explicitly approve permission requests for RESOURCE_VIDEO_CAPTURE
. As mentioned earlier, this approval will only succeed if the app has already been granted camera permission. See the example below for reference.
iOS
If you use Safari WebView (SafariViewController) you can ignore the settings below. If you use WebKit WebView (WKWebView) you need to follow the instructions below:
Add the following key to your Info.plist:
<key>NSCameraUsageDescription</key>
<string>Your description</string>
Note: Do not open the WebView if camera permission has not been granted, as camera functionality will not work. You need to manage permissions beforehand.
React-Native or Flutter
When using WebView plugins with React Native or Flutter, camera permissions are typically handled by the plugin. However, if you want to control permissions before launching the WebView, you may need to manage them manually. Be sure to thoroughly test all possible scenarios to ensure consistent behavior.
Important Note: The end-user will encounter two separate camera permission prompts, one at the application level and another within the WebView. It’s essential to clearly inform users that both permissions must be granted for the application to function properly. Additionally, on iOS, if the user denies the WebView-level permission, the denial is remembered for the duration of the session. In such cases, the application must be restarted to trigger the WebView permission prompt again.
Implementation examples
Android - JAVA
package com.example.myapplication;
import android.Manifest;
import android.os.Build;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// Enable Javascript
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
// Check camera permission and request if not granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
// Check for camera permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
for (String permission : request.getResources()) {
if (PermissionRequest.RESOURCE_VIDEO_CAPTURE.equals(permission)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
} else {
request.deny();
}}});
return;
}}}
super.onPermissionRequest(request);
}
});
webView.loadUrl("https://your-uqudo-sdk-url.com");
}}
Android - Kotlin
package com.example.myapplication
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.webkit.PermissionRequest
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings
// Enable Javascript
webSettings.javaScriptEnabled = true
webSettings.domStorageEnabled = true
// Check camera permission and request if not granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 1)
}
webView.webChromeClient = object : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
for (permission in request.resources) {
if (PermissionRequest.RESOURCE_VIDEO_CAPTURE.equals(permission)) {
runOnUiThread {
if (ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
} else {
request.deny()
}
}
return
}
}
}
super.onPermissionRequest(request)
}
}
webView.loadUrl("https://your-uqudo-sdk-url.com")
}
}
iOS - Swift
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let webViewConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webViewConfiguration)
webView.navigationDelegate = self
view = webView
// Enable JavaScript
webView.configuration.preferences.javaScriptEnabled = true
// Enable allowsInlineMediaPlayback
webView.configuration.allowsInlineMediaPlayback = true
// Load your Uqudo Web SDK URL
let url = URL(string: "https://your-uqudo-sdk-url.com")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
}
}
React Native
import React from 'react';
import { WebView } from 'react-native-webview';
const MyWebViewComponent = () => {
return (
<WebView
source={{ uri: 'https://your-uqudo-sdk-url.com' }}
javaScriptEnabled={true}
domStorageEnabled={true}
allowsInlineMediaPlayback={true}
/>
);
};
export default MyWebViewComponent;
Flutter
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class MyWebViewWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return WebView(
initialUrl: 'https://your-uqudo-sdk-url.com',
javascriptMode: JavascriptMode.unrestricted,
allowsInlineMediaPlayback: true,
);
}
}
Xamarin (C#):
using Xamarin.Forms;
namespace MyApp
{
public partial class MyWebViewPage : ContentPage
{
public MyWebViewPage()
{
InitializeComponent();
var webView = new WebView
{
Source = new UrlWebViewSource
{
Url = "https://your-uqudo-sdk-url.com"
},
VerticalOptions = LayoutOptions.FillAndExpand
};
webView.Settings.JavaScriptEnabled = true;
Content = webView;
}
}
}
Load Uqudo Web SDK URL
Make sure to load the URL of the Uqudo Web SDK into your WebView. Replace "https://your-uqudo-sdk-url.com"
with the actual URL of your Uqudo Web SDK.
Feel free to customize the examples provided according to your specific implementation needs. If you encounter any issues or have further questions, refer to the Uqudo Web SDK documentation or reach out to our support team for assistance.
Last updated
Was this helpful?