# Setup Accura Face Liveness

### **Add following code in Manifest.**

```
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    >

 </application>
 
Note : 'android:networkSecurityConfig="@xml/network_security_config"' setup will permit clear text traffic   
```

### **Add following code to your Application class or MainActivity for hostname verification**

```
new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
        return hv.verify("your url host name", session);
    }
};
```

### **Open camera for liveness Detectcion.**

```
Must have to Grant camera permission

private final static int ACCURA_LIVENESS_CAMERA = 100;

// To customize your screen theme and feed back messages
LivenessCustomization livenessCustomization = new LivenessCustomization();

livenessCustomization.backGroundColor = getResources().getColor(R.color.livenessBackground);
livenessCustomization.closeIconColor = getResources().getColor(R.color.livenessCloseIcon);
livenessCustomization.feedbackBackGroundColor = Color.TRANSPARENT;
livenessCustomization.feedbackTextColor = Color.BLACK;
livenessCustomization.feedbackTextSize = 18;
livenessCustomization.feedBackframeMessage = "Frame Your Face";
livenessCustomization.feedBackAwayMessage = "Move Phone Away";
livenessCustomization.feedBackOpenEyesMessage = "Keep Your Eyes Open";
livenessCustomization.feedBackCloserMessage = "Move Phone Closer";
livenessCustomization.feedBackCenterMessage = "Move Phone Center";
livenessCustomization.feedBackMultipleFaceMessage = "Multiple Face Detected";
livenessCustomization.feedBackHeadStraightMessage = "Keep Your Head Straight";
livenessCustomization.feedBackBlurFaceMessage = "Blur Detected Over Face";
livenessCustomization.feedBackGlareFaceMessage = "Glare Detected";
livenessCustomization.feedBackLowLightMessage = "Low light detected";

//To customize the Loading message of Dialog Box when Liveness is success
livenessCustomization.feedbackDialogMessage = "Loading...";
//To customize the Feedback Processing message when Liveness is succes
livenessCustomization.feedBackProcessingMessage = "Processing...";

livenessCustomization.showlogo = 0; // Set 0 to hide logo from selfie camera screen
livenessCustomization.logoIcon = R.drawable.your_logo; // To set your custom logo
    
// LivenessCustomization.CAMERA_FACING_FRONT to set selfie camera       
// LivenessCustomization.CAMERA_FACING_BACK to set rear camera
livenessCustomization.facing = LivenessCustomization.CAMERA_FACING_FRONT;
    
// 0 for full dark face and 100 for full bright face or set it -1 to remove low light filter
livenessCustomization.setLowLightTolerence(-1/*lowLightTolerence*/);

// 0 for clean face and 100 for Blurry face or set it -1 to remove blur filter
livenessCustomization.setBlurPercentage(80/*blurPercentage*/); // To allow blur on face
                                                
// Set min and max percentage for glare or set it -1 to remove glare filter
livenessCustomization.setGlarePercentage(6/*glareMinPercentage*/, 99/*glareMaxPercentage*/);
livenessCustomization.setApiKey("add api key");

// Set Liveness Mode as required
// 1. LivenessMode.FACE_3D - To enable Face Movement
// 2. LivenessMode.VOICE   - To enable Oral Verification
// 3. LivenessMode.All     - To enable Face Movement and Oral Verification both
livenessCustomization.livenessMode = LivenessMode.FACE_3D;

//To customize Verified Sound
livenessCustomization.livenessVerifiedAlertSound = Your Uri;

//To customize Verified Animation when Liveness is successful
livenessCustomization.livenessVerifiedAnimation = R.drawable.approved_sign;

//<editor-fold desc="customization for LivenessMode.VOICE">
livenessCustomization.feedBackOralInfoMessage = "Say each digits out loud";
//To customize Voice Icon for Oral Verification in Liveness Window
livenessCustomization.voiceIcon = R.drawable.your_image;
//To customize Text Size and Color of verification code which is getting display on the middle of oval for voice verification
livenessCustomization.codeTextSize = 30;
livenessCustomization.codeTextColor = Color.WHITE;
//</editor-fold>

// must have to call SelfieCameraActivity.getCustomIntent() to create intent
Intent intent = SelfieCameraActivity.getCustomIntent(this, livenessCustomization, "your_url");
startActivityForResult(intent, ACCURA_LIVENESS_CAMERA);


// Handle accura liveness result.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == ACCURA_LIVENESS_CAMERA && data != null) {
            AccuraVerificationResult result = data.getParcelableExtra("Accura.liveness");
            if (result == null) {
                return;
            }
            if (result.getStatus().equals("1")) {
                // result get bitmap of face by using following code
                Bitmap bitmap = result.getFaceBiometrics();
                double livenessScore = result.getLivenessResult().getLivenessScore();
                Toast.makeText(this, "Liveness Score : " + livenessScore, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, result.getStatus() + " " + result.getErrorMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }
}
```

### ProGuard

Depending on your ProGuard (DexGuard) config and usage, you may need to include the following lines in your proguards.

```
-keep public class com.docrecog.scan.ImageOpencv {;}
-keep class com.accurascan.ocr.mrz.model.* {;}
-keep class com.accurascan.ocr.mrz.interfaces.* {;}
-keep public class com.inet.facelock.callback.FaceCallback {*;}
-keep public class com.inet.facelock.callback.FaceDetectionResult {*;}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.accurascan.com/solutions/face-liveness-3d-face-movement/android/setup-accura-face-liveness.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
