Request camera, microphone, and photo library permissions

Declare the access your Genuin features use, and let the SDK ask members at the moment they record, upload, or save.

The Genuin SDK asks members for camera, microphone, and photo library access itself, the first time they use a feature that needs it. Your part is the declaration: Android permissions in your manifest and iOS usage descriptions in your Info.plist. The SDK reads those declarations before it opens a feature, and it never adds them for you.

This page covers Android SDK 2.1.5 and iOS SDK 2.1.5, plus what differs in React Native 3.0.3, Flutter 1.0.1, and Web SDK 2.0.6. For the camera modules and their recording limits, see Camera and video creation in the Genuin SDK.

PlatformWhat you declareWho asks the member
Android 2.1.5Permissions in AndroidManifest.xml. No Genuin library, and none of its dependencies, declares them for you.The SDK, when the feature opens
iOS 2.1.5Usage-description keys in Info.plistThe SDK, when the feature opens
React Native 3.0.3Camera and photo library access for profile photos and saved videos only. The package has no camera module, so members can't record.The native SDK
Flutter 1.0.1The iOS keys. The native Android SDK 1.1.9.3 that the plugin pins declares its own permissions.The native SDK
Web SDK 2.0.6Nothing. The Web SDK never calls a camera, microphone, or storage API.Nobody; no prompt appears

Before you begin

Step 1: Map your features to permissions

Declare only what your features use. Each row lists the module that owns the feature and the declaration the SDK checks before it opens it.

FeatureModuleAndroid permissioniOS Info.plist key
Record a video post, reply, or video commentCameraCAMERA and RECORD_AUDIONSCameraUsageDescription and NSMicrophoneUsageDescription
Take a photo replyCameraCAMERANSCameraUsageDescription
Record an audio replyCameraRECORD_AUDIONSMicrophoneUsageDescription, plus NSSpeechRecognitionUsageDescription for the transcript
Record a voice commentCameraRECORD_AUDIONSMicrophoneUsageDescription
Import a video from the galleryCameraREAD_MEDIA_VIDEO on Android 13 and later; READ_EXTERNAL_STORAGE on Android 12 and earlierNSPhotoLibraryUsageDescription
Save a video to the deviceCore, UI, CameraWRITE_EXTERNAL_STORAGE, requested only on Android 9 and earlierNSPhotoLibraryUsageDescription
Take a profile, community, or link photoCore, UICAMERANSCameraUsageDescription
Choose a profile, community, or link photo from the libraryCore, UINone; the system picker grants accessNSPhotoLibraryUsageDescription
Create an AI avatar from a photo or a voice sampleAICAMERA and RECORD_AUDIONSCameraUsageDescription, NSMicrophoneUsageDescription, and NSPhotoLibraryUsageDescription

The camera screen opens only when both the camera and the microphone declarations exist, even if the member then switches to photo or audio mode. Text replies need no permission once the screen is open.

Step 2: Declare the Android permissions

Add the permissions to your app's AndroidManifest.xml. The Genuin AARs declare only INTERNET, ACCESS_NETWORK_STATE, VIBRATE, and WAKE_LOCK, so nothing below reaches your app through the manifest merger.

AndroidManifest.xml
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Recording, photo replies, voice comments, profile photos -->
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />

  <!-- Gallery import -->
  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  <uses-permission
      android:name="android.permission.READ_EXTERNAL_STORAGE"
      android:maxSdkVersion="32" />

  <!-- Saving videos on Android 9 and earlier -->
  <uses-permission
      android:name="android.permission.WRITE_EXTERNAL_STORAGE"
      android:maxSdkVersion="28" />

  <!-- Keep the app installable on devices without this hardware -->
  <uses-feature android:name="android.hardware.camera" android:required="false" />
  <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
  <uses-feature android:name="android.hardware.microphone" android:required="false" />
</manifest>

Before it opens the camera, the SDK runs two checks:

  1. The device has a camera and a microphone. If either is missing, the member sees "This feature is not available on your device."
  2. Your manifest requests CAMERA and RECORD_AUDIO. If either is missing, the member sees your brand's unsupported-feature message. By default, that message is "This feature is not accessible right now."

The gallery button runs the second check against READ_MEDIA_VIDEO on Android 13 and later, and READ_EXTERNAL_STORAGE on Android 12 and earlier. When a declaration is missing, no system prompt appears.

Declaring CAMERA makes Google Play treat a back camera and autofocus as required hardware, and RECORD_AUDIO does the same for a microphone. The three uses-feature lines with android:required="false" keep your app available on devices without them. Learn more about permissions that imply feature requirements.

Caution: Google Play's Photo and Video Permissions policy requires a Play Console declaration for READ_MEDIA_VIDEO, and apps whose core function doesn't need broad media access must remove it. If you leave it out, recording still works, but the gallery button shows the unsupported-feature message on Android 13 and later.

Note: The SDK doesn't declare READ_MEDIA_VISUAL_USER_SELECTED, so Android 14 runs the gallery in compatibility mode. If a member chooses Select photos and videos, your app holds READ_MEDIA_VIDEO for that session only, and the gallery lists only the videos they picked.

Step 3: Add the iOS usage descriptions

Add a usage description for each protected resource your features touch. iOS shows your string in the system prompt, so write it in your app's voice and say what the member gets.

Info.plist
xml
<key>NSCameraUsageDescription</key>
<string>Record videos and photos to post in the community.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Record sound for your videos and voice comments.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Upload videos from your library and save videos you like.</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Turn your voice recordings into text you can add to your post.</string>

Before it opens a feature, the SDK looks for the key in your app's main bundle. When the key is missing, it shows your brand's unsupported-feature alert and never calls the iOS permission API. That check prevents the crash iOS triggers when an app touches the camera or microphone without a usage description.

The camera has one more gate on iOS: your brand's camera_enabled flag. If Genuin has switched it off, the camera shows the same alert even with both keys present.

NSSpeechRecognitionUsageDescription is optional. Without it, audio recording works and the transcript step is skipped. For the contacts, location, and tracking keys that other features use, see Integrate the Genuin iOS SDK.

Step 4: Let the SDK ask at the moment of use

Don't request these permissions at launch. The SDK checks the current status before each request and skips the prompt when your app already holds the permission.

Member actionAndroid 2.1.5 asks foriOS 2.1.5 asks for
Opens the camera in video modeCAMERA and RECORD_AUDIO, in one requestCamera, then microphone
Switches the camera to photo modeCAMERACamera
Switches the camera to audio modeRECORD_AUDIOMicrophone, then speech recognition
Starts a voice commentRECORD_AUDIOMicrophone
Records a video commentCAMERA and RECORD_AUDIOCamera, then microphone
Opens the galleryREAD_MEDIA_VIDEO, or READ_EXTERNAL_STORAGE on Android 12 and earlierPhoto library, read and write; limited access is accepted
Saves a videoWRITE_EXTERNAL_STORAGE on Android 9 and earlier; nothing on later versionsPhoto library
Takes a profile or community photoCAMERACamera, through the system camera

For example, a member who records a post, then opens the gallery to add a clip, sees the camera and microphone prompts when the camera opens. The photo library prompt follows only when they tap the gallery.

Step 5: Know what members see after a denial

Your app needs no code for denials. The SDK shows its own explanation and a way to reach the system settings for your app.

WhereAndroid 2.1.5iOS 2.1.5
Camera screenA full-screen message, "Allow {brand} to access your camera and microphone", with a Give permissions button that opens your app's settings. Flash and camera switching are disabled.A message replaces the preview, with a button that opens Settings. Flash and camera switching are disabled.
GalleryA dialog, "{brand} needs access to your gallery.", with Go to settings and CancelAn enable-access message with a button that opens Settings
Video or voice commentA dialog with Go to settings and CancelA message with a button that opens Settings
Saving a videoOn Android 9 and earlier, a Storage Permission dialog with a settings buttonAn alert that photo library access isn't authorized
TranscriptNot applicableRecording continues without a transcript

On Android, the camera screen re-enables itself when the member comes back from settings with access granted. On iOS, the member opens the camera again after changing the setting.

The gallery dialog on Android appears after any denial on Android 13 and later. On Android 12 and earlier, it appears once the system stops showing the request, usually after the second denial.

On iOS, saving needs full photo library access. With limited access, the gallery works and shows a Manage banner that opens the system picker, so the member can add more videos to the selection.

Note: The SDK doesn't tell your app when a member denies access. Its denial events, such as Camera Access Not Allowed, go to Genuin's analytics and aren't forwarded to your event callback or analytics delegate.

Step 6: Test each permission state

Test on a physical device. The iOS Simulator has no camera, and Android emulators only report a camera when one is configured.

  1. Start from a clean install so every prompt appears again:
Reinstall the Android app
bash
adb uninstall {{PACKAGE_NAME}}
adb install app-debug.apk
  1. Simulate a member who granted access and later turned it off:
Revoke Android permissions
bash
adb shell pm revoke {{PACKAGE_NAME}} android.permission.CAMERA
adb shell pm revoke {{PACKAGE_NAME}} android.permission.RECORD_AUDIO
adb shell pm revoke {{PACKAGE_NAME}} android.permission.READ_MEDIA_VIDEO
  1. On iOS, reset every prompt on the device in Settings > General > Transfer or Reset iPhone > Reset > Reset Location & Privacy. On the Simulator, reset the privacy prompts for your app:
Reset iOS Simulator prompts
bash
xcrun simctl privacy booted reset all {{BUNDLE_ID}}
  1. Walk through each scenario and compare the result:
ScenarioHow to set it upExpected result
Declaration missingRemove CAMERA from the manifest, or NSCameraUsageDescription from Info.plistThe create action shows the unsupported-feature message, with no system prompt
First useClean installThe system prompt appears when the camera screen opens
DeniedTap Don't allow at the promptThe SDK's permission message with a button to settings
Granted laterAllow access in settings, then returnAndroid re-enables the camera; on iOS, the camera works when reopened
Partial library accessAndroid 14: Select photos and videos. iOS: limit access to a few items.The gallery lists only the chosen videos; iOS shows the Manage banner
No hardwareAn Android device or emulator without a camera"This feature is not available on your device."

React Native, Flutter, and the Web SDK

React Native 3.0.3

The genuin-react-native package pulls in only com.begenuin:core and com.begenuin:ui on Android, and only GenuinCore and GenuinUI on iOS. Neither platform gets the Camera module, so create, reply, and comment-recording actions show the unsupported-feature message, and no recording permission is needed.

The UI module still takes profile, community, and link photos and saves videos. Declare CAMERA and NSCameraUsageDescription if members change photos, and NSPhotoLibraryUsageDescription if they choose photos or save videos on iOS.

Flutter 1.0.1

The genuin_sdk plugin pins the older native SDKs: genuin_android_sdk 1.1.9.3 on Android and GenuinSDK 1.1.9.1 on iOS. On Android, that AAR declares CAMERA, RECORD_AUDIO, READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_EXTERNAL_STORAGE, and WRITE_EXTERNAL_STORAGE, and the manifest merger copies them into your app.

To drop one, for example to meet Google Play's media policy, mark it for removal in your own manifest:

android/app/src/main/AndroidManifest.xml
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
</manifest>

The same AAR marks the camera, front camera, and microphone as required hardware. To change that, and for the iOS keys to add to ios/Runner/Info.plist, see Integrate the Genuin SDK with Flutter apps.

Web SDK 2.0.6

The Web SDK never calls getUserMedia or any storage API, so browsers show no permission prompt. It uses the Fullscreen and Web Share APIs, which need a tap but no permission. On the web, members create posts on your community site by uploading a file, which needs no permission either.

Troubleshooting

SymptomCauseFix
Android: tapping create shows "This feature is not accessible right now."CAMERA or RECORD_AUDIO isn't declared, or the Camera module isn't in your buildDeclare both permissions and add com.begenuin:camera
Android: the gallery button shows the same messageREAD_MEDIA_VIDEO (Android 13 and later) or READ_EXTERNAL_STORAGE (Android 12 and earlier) isn't declaredDeclare the permission for the versions you support
iOS: an unsupported-feature alert appears instead of the cameraA camera or microphone key is missing, or camera_enabled is off for your brandAdd both keys; if they're present, ask Genuin to check camera_enabled
iOS: audio recordings never show a transcriptNSSpeechRecognitionUsageDescription is missing, or the member denied speech recognitionAdd the key; the member can allow it in Settings
Google Play rejects the release over media permissionsREAD_MEDIA_VIDEO or READ_MEDIA_IMAGES without a Play Console declarationSubmit the declaration, or remove the permission and accept that gallery import is unavailable
Google Play hides the app on devices without a cameraCAMERA implies a required camera unless you say otherwiseAdd the uses-feature lines from Step 2

Limitations

  • No permissions added for you: The 2.1.5 SDKs never declare camera, microphone, or media permissions, and never prompt at launch.
  • No denial callback: Your app can't observe a member's permission decision through the SDK.
  • Both declarations open the camera: The camera screen needs camera and microphone declarations, even for photo or audio replies.
  • Session-only partial access on Android 14: The system withdraws selected-media access after your app goes to the background, and the member chooses again next time.
  • Full library access to save on iOS: Members with limited photo library access can import but can't save videos.
  • No recording in React Native 3.0.3: The package doesn't include the Camera module.
  • No prompts on the web: Web SDK 2.0.6 has no camera or upload feature.

See also

TRUST AND COMPLIANCE

© 2026 Genuin Inc.

Genuin Footer