Skip to main content

Android Webview Setup

To integrate the GlamAR SDK into an Android project using WebView, follow these detailed steps:

Setup

Make sure to setup Android project correctly. If you need any documentation for that, we do not cover that here.
Make sure to add the following dependency insde the gradle file so that we can use webkit.

dependencies {
// other dependencies
implementation("androidx.webkit:webkit:1.12.0")
}

Ensure you have the necessary permissions for internet access and camera usage.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />

WebView

Set up a WebView in your MainActivity.java or MainActivity.kt.

import android.os.Bundle;
import android.util.Log
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

private lateinit var webView: WebView

@Override
protected void onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
webView.webChromeClient = object : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
Log.e("WebView", "onPermissionRequest: $request")
handlePermissionRequest(request)
}
};
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Log.e("Webview", "Page finished loading: $url")
if (hasCameraPermission()) {
initializeSDK()
}
}
}
webView.loadUrl("https://www.glamar.io/sdk");
}
}

Handle Permissions

Ensure you handle camera permissions appropriately.

import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat


private val requestCodePermissions = 1001
private var pendingPermissionRequest: PermissionRequest? = null

private void handlePermissionRequest(request: PermissionRequest) {
val permissions = arrayOf(Manifest.permission.CAMERA)
val missingPermissions = permissions.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}

if (missingPermissions.isEmpty()) {
request.grant(request.resources)
} else {
ActivityCompat.requestPermissions(this, missingPermissions.toTypedArray(), requestCodePermissions)
pendingPermissionRequest = request
}
}

private fun hasCameraPermission(): Boolean {
return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
if (requestCode == requestCodePermissions) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
pendingPermissionRequest?.grant(pendingPermissionRequest?.resources)
initializeSDK()
} else
{
pendingPermissionRequest?.deny()
}
pendingPermissionRequest = null
}
}

If the user does not grant camera permission, do not open the SDK. Instead, handle it on the client side by providing clear instructions that camera permission is necessary for the SDK to function properly.

SDK

Send Initialization Payload to start loading the SDK

private fun sendMessageToWebView(type: String, payload: Map<String, Any>) {
val message = mapOf("type" to type, "payload" to payload)
val jsonData = JSONObject(message).toString()
webView.evaluateJavascript("window.postMessage($jsonData, '*');", null)
}

// Usage example
private fun initializeSDK() {
val payload = mapOf(
"apiKey" to "YOUR_ACCESS_KEY",
"platform" to "android"
)
sendMessageToWebView("initialize", payload)
}

Replace 'YOUR_ACCESS_KEY' with your organization access key.

Event Handling

Create a JavaScript interface to handle messages from the SDK.

webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void onLog(String args) {
try {
JSONObject argsJson = new JSONObject(args);
String type = argsJson.getString("type");

switch (type) {
case "loaded":
// Handle onLoadedCallback
break;
case "sku-applied":
// Handle on SKu applied
break;
default:
Log.e("GlamAR", "Unhandled type: " + type);
break;
}
} catch (Exception e) {
Log.e("GlamARView", "Error processing JavaScript message", e);
glamArCallback.onError("Error processing JavaScript message: " + e.getMessage());
}
}
}, "Android");