diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 48f8090a93db..b8cb118a960e 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -821,51 +821,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	return staticMetadata_->get();
 }
 
-/*
- * Produce a metadata pack to be used as template for a capture request.
- */
-const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
+const CameraMetadata *CameraDevice::captureTemplatePreview()
 {
-	auto it = requestTemplates_.find(type);
-	if (it != requestTemplates_.end())
-		return it->second->get();
-
-	/* Use the capture intent matching the requested template type. */
-	uint8_t captureIntent;
-	switch (type) {
-	case CAMERA3_TEMPLATE_PREVIEW:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
-		break;
-	case CAMERA3_TEMPLATE_STILL_CAPTURE:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
-		break;
-	case CAMERA3_TEMPLATE_VIDEO_RECORD:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
-		break;
-	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
-		break;
-	case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
-		break;
-	case CAMERA3_TEMPLATE_MANUAL:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;
-		break;
-	default:
-		LOG(HAL, Error) << "Invalid template request type: " << type;
-		return nullptr;
-	}
-
 	/*
 	 * \todo Keep this in sync with the actual number of entries.
 	 * Currently: 12 entries, 15 bytes
 	 */
 	CameraMetadata *requestTemplate = new CameraMetadata(15, 20);
-	if (!requestTemplate->isValid()) {
-		LOG(HAL, Error) << "Failed to allocate template metadata";
-		delete requestTemplate;
+	if (!requestTemplate->isValid())
 		return nullptr;
-	}
 
 	uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
 	requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,
@@ -911,10 +875,114 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
 	requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
 				  &aberrationMode, 1);
 
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
 	requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,
 				  &captureIntent, 1);
 
-	if (!requestTemplate->isValid()) {
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateStillCapture()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateVideoRecord()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateVideoSnapshot()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateZSL()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateManual()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+/*
+ * Produce a metadata pack to be used as template for a capture request.
+ */
+const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
+{
+	auto it = requestTemplates_.find(type);
+	if (it != requestTemplates_.end())
+		return it->second->get();
+
+	/* Use the capture intent matching the requested template type. */
+	const CameraMetadata *requestTemplate;
+	switch (type) {
+	case CAMERA3_TEMPLATE_PREVIEW:
+		requestTemplate = captureTemplatePreview();
+		break;
+	case CAMERA3_TEMPLATE_STILL_CAPTURE:
+		requestTemplate = captureTemplateStillCapture();
+		break;
+	case CAMERA3_TEMPLATE_VIDEO_RECORD:
+		requestTemplate = captureTemplateVideoRecord();
+		break;
+	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
+		requestTemplate = captureTemplateVideoSnapshot();
+		break;
+	case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
+		requestTemplate = captureTemplateZSL();
+		break;
+	case CAMERA3_TEMPLATE_MANUAL:
+		requestTemplate = captureTemplateManual();
+		break;
+	default:
+		LOG(HAL, Error) << "Invalid template request type: " << type;
+		return nullptr;
+	}
+
+	if (!requestTemplate || !requestTemplate->isValid()) {
 		LOG(HAL, Error) << "Failed to construct request template";
 		delete requestTemplate;
 		return nullptr;
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index af1b58ab6b4e..7bf68e23f7fe 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -87,6 +87,13 @@ private:
 	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
 							  int64_t timestamp);
 
+	const CameraMetadata *captureTemplatePreview();
+	const CameraMetadata *captureTemplateStillCapture();
+	const CameraMetadata *captureTemplateVideoRecord();
+	const CameraMetadata *captureTemplateVideoSnapshot();
+	const CameraMetadata *captureTemplateZSL();
+	const CameraMetadata *captureTemplateManual();
+
 	unsigned int id_;
 	camera3_device_t camera3Device_;
 
