{"id":4716,"date":"2021-12-03T20:41:39","date_gmt":"2021-12-03T12:41:39","guid":{"rendered":"https:\/\/www.enablex.io\/developer\/?page_id=4716"},"modified":"2025-02-17T12:43:11","modified_gmt":"2025-02-17T04:43:11","slug":"video-embed-with-android-webview","status":"publish","type":"page","link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/video\/low-code-video-embed\/video-embed-with-android-webview\/","title":{"rendered":"Low Code Video Embed with Android Webview"},"content":{"rendered":"\n<p>EmbeddiEmbedding in an Android app requires the use of the WebView class. To enable camera access, follow the steps given below:<\/p>\n\n\n\n<ul><li>Override <code>WebChromeClient.onPermissionRequest<\/code> method in the <code>WebView<\/code> class.<\/li><li>Add <code>?skipMediaPermissionPrompt<\/code> Query String parameter to allow the camera access.<\/li><\/ul>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Do more for&#8230;<\/h3>\n\n\n\n<ul><li><a href=\"#device-accessibility\">Device Accessibility<\/a><\/li><li><a href=\"#file-download\">File Download<\/a><\/li><\/ul>\n\n\n\n<a name=\"device-accessibility\"><\/a>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Device Accessibility<\/h2>\n\n\n\n<p>To give permission of Devices to Webview, add these permissions to the manifest file:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;uses-permission android:name=\"android.permission.CAMERA\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.RECORD_AUDIO\" \/&gt;\n&lt;uses-permission android:name=\"android.permission.WAKE_LOCK\" \/&gt;<\/pre>\n\n\n\n<p>Need to use <code>Webview <\/code>class to customise <code>WebChromeClient <\/code>class and override <code>onPermissionRequest<\/code> method:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import android.app.Activity;\nimport android.webkit.PermissionRequest;\nimport android.webkit.WebChromeClient;\n\npublic class CustomWebChromeClient extends WebChromeClient {\n\tprivate Activity activity;\n\n\tpublic CustomWebChromeClient(Activity parentActivity) {\n\t\tsuper();\n\t\tactivity = parentActivity;\n\t}\n\n\t@Override\n\t\tpublic void onPermissionRequest(final PermissionRequest request) {\n\t\tactivity.runOnUiThread(() -&gt; request.grant(request.getResources()));\n\t}\n}<\/pre>\n\n\n\n<p>Next, create a <code>WebUtils <\/code>helper class to configure the WebView. Here is a possible configuration:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import android.annotation.SuppressLint;\nimport android.webkit.CookieManager;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\n\npublic class WebUtils {\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    public static void configureWebView(WebView webView) {\n        WebSettings webSettings = webView.getSettings();\n        webSettings.setJavaScriptEnabled(true);\n        webSettings.setDomStorageEnabled(true);\n        webSettings.setDatabaseEnabled(true);\n        webSettings.setMediaPlaybackRequiresUserGesture(false);\n        CookieManager.getInstance().setAcceptCookie(true);\n        CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);\n    }\n}<\/pre>\n\n\n\n<p>Finally, follow these steps to set up your activity:<\/p>\n\n\n\n<ul><li>Configure the <code>webView<\/code>.<\/li><li>Request Device permissions if needed.<\/li><li>Add the <code>?skipMediaPermissionPrompt<\/code> parameter to the room URL and load it.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.meeting.webview;\n\nimport android.Manifest;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.RequiresApi;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MeetingNew  extends AppCompatActivity {\n\n   public String roomUrl = \"\"; \/\/ Replace by your ownUrl\n\n   private static final int PERMISSION_REQUEST_CODE = 1;\n   private String[] requiredPermissions = {\n           Manifest.permission.CAMERA,\n           Manifest.permission.MODIFY_AUDIO_SETTINGS,\n           Manifest.permission.RECORD_AUDIO\n   };\n\n   private WebView webView;\n\n   @Override\n   protected void onCreate(Bundle savedInstanceState) {\n       super.onCreate(savedInstanceState);\n       setContentView(R.layout.meeting_webview);\n       this.webView = findViewById(R.id.webView);\n       WebUtils.configureWebView(this.webView);\n       this.webView.setWebChromeClient(new CustomWebChromeClient(this));\n       this.webView.setWebViewClient(new WebViewClient());\n   }\n\n   @Override\n   protected void onResume() {\n       super.onResume();\n       if (this.webView.getUrl() == null) {\n           if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M &amp;&amp; this.isPendingPermissions()) {\n               \/\/ This explicitly requests the camera and audio permissions.\n               \/\/ It's fine for a demo app but should probably be called earlier in the flow,\n               \/\/ on a user interaction instead of onResume.\n               this.requestCameraAndAudioPermissions();\n           } else {\n               this.loadLowCodeRoomUrl();\n           }\n       }\n   }\n\n   private void loadLowCodeRoomUrl() {\n       this.webView.loadUrl(roomUrl);\n   }\n\n   @Override\n   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n       switch (requestCode) {\n           case PERMISSION_REQUEST_CODE:\n               if (this.grantResultsContainsDenials(grantResults)) {\n                   \/\/ Show some permissions required dialog.\n               } else {\n                   \/\/ All necessary permissions granted, continue loading.\n                   this.loadLowCodeRoomUrl();\n               }\n               break;\n           default:\n               super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n       }\n   }\n\n   @RequiresApi(api = Build.VERSION_CODES.M)\n   private void requestCameraAndAudioPermissions() {\n       this.requestPermissions(this.getPendingPermissions(), PERMISSION_REQUEST_CODE);\n   }\n\n   @RequiresApi(api = Build.VERSION_CODES.M)\n   private String[] getPendingPermissions() {\n       List&lt;String&gt; pendingPermissions = new ArrayList&lt;&gt;();\n       for (String permission : this.requiredPermissions) {\n           if (this.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {\n               pendingPermissions.add(permission);\n           }\n       }\n       return pendingPermissions.toArray(new String[pendingPermissions.size()]);\n   }\n\n   private boolean isPendingPermissions() {\n       if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.M) {\n           return false;\n       }\n       return this.getPendingPermissions().length &gt; 0;\n   }\n\n   private boolean grantResultsContainsDenials(int[] grantResults) {\n       for (int result : grantResults) {\n           if (result == PackageManager.PERMISSION_DENIED) {\n               return true;\n           }\n\t   }\n\t}\n}<\/pre>\n\n\n\n<a name=\"file-download\"><\/a>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>File Download<\/h2>\n\n\n\n<p>Create a method for decode base64 bit and save particular location.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public String createAndSaveFileFromBase64Url(String url) {\n        final int notificationId = 1;\n        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);\n        String filetype = url.substring(url.indexOf(\"\/\") + 1, url.indexOf(\";\"));\n        String filename = System.currentTimeMillis() + \".\" + filetype;\n        File file = new File(path, filename);\n        try {\n            if(!path.exists())\n                path.mkdirs();\n            if(!file.exists())\n                file.createNewFile();\n \n            String base64EncodedString = url.substring(url.indexOf(\",\") + 1);\n            byte[] decodedBytes = Base64.decode(base64EncodedString, Base64.DEFAULT);\n            OutputStream os = new FileOutputStream(file);\n            os.write(decodedBytes);\n            os.close();\n \n        } catch (IOException e) {\n            Log.w(\"ExternalStorage\", \"Error writing \" + file, e);\n            Toast.makeText(getApplicationContext(),\"\", Toast.LENGTH_LONG).show();\n        }\n \n        return file.toString();\n}<\/pre>\n\n\n\n<p>Call above method in <code>webview DownloadListner<\/code><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">webView.setDownloadListener(new DownloadListener() {\n\n    public void onDownloadStart(String url, String userAgent, String\n            contentDisposition, String mimetype, long contentLength) {\n        \n        if (url.startsWith(\"data:\")) {  \/\/when url is base64 encoded data\n            String path = createAndSaveFileFromBase64Url(url);\n           \n            return;\n        }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>EmbeddiEmbedding in an Android app requires the use of the WebView class. To enable camera access, follow the steps given below: Override WebChromeClient.onPermissionRequest method in the WebView class. Add ?skipMediaPermissionPrompt Query String parameter to allow the camera access. Do more for&#8230; Device Accessibility File Download Device Accessibility To give permission of Devices to Webview, add these permissions to the manifest file: &lt;uses-permission android:name=&#8221;android.permission.CAMERA&#8221; \/&gt; &lt;uses-permission android:name=&#8221;android.permission.INTERNET&#8221; \/&gt; &lt;uses-permission android:name=&#8221;android.permission.MODIFY_AUDIO_SETTINGS&#8221; \/&gt;&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2363,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":""},"featured_image_src":null,"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"featured":false,"featured-large":false},"uagb_author_info":{"display_name":"vcxdevwpadmin","author_link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/author\/vcxdevwpadmin\/"},"uagb_comment_info":0,"uagb_excerpt":"EmbeddiEmbedding in an Android app requires the use of the WebView class. To enable camera access, follow the steps given below: Override WebChromeClient.onPermissionRequest method in the WebView class. Add ?skipMediaPermissionPrompt Query String parameter to allow the camera access. Do more for&#8230; Device Accessibility File Download Device Accessibility To give permission of Devices to Webview, add&hellip;","_links":{"self":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4716"}],"collection":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/comments?post=4716"}],"version-history":[{"count":0,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4716\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/2363"}],"wp:attachment":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/media?parent=4716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}