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.
| Platform | What you declare | Who asks the member |
|---|---|---|
| Android 2.1.5 | Permissions in AndroidManifest.xml. No Genuin library, and none of its dependencies, declares them for you. | The SDK, when the feature opens |
| iOS 2.1.5 | Usage-description keys in Info.plist | The SDK, when the feature opens |
| React Native 3.0.3 | Camera 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.1 | The 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.6 | Nothing. The Web SDK never calls a camera, microphone, or storage API. | Nobody; no prompt appears |
Before you begin
- Integrate the SDK for your platform: Android, iOS, React Native, or Flutter.
- Decide whether you ship the Camera module (
com.begenuin:cameraon Android,GenuinCameraon iOS). Recording, gallery import, and voice replies all come from it. - Sign members in before they create. See Choose how members sign in to the Genuin SDK.
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.
| Feature | Module | Android permission | iOS Info.plist key |
|---|---|---|---|
| Record a video post, reply, or video comment | Camera | CAMERA and RECORD_AUDIO | NSCameraUsageDescription and NSMicrophoneUsageDescription |
| Take a photo reply | Camera | CAMERA | NSCameraUsageDescription |
| Record an audio reply | Camera | RECORD_AUDIO | NSMicrophoneUsageDescription, plus NSSpeechRecognitionUsageDescription for the transcript |
| Record a voice comment | Camera | RECORD_AUDIO | NSMicrophoneUsageDescription |
| Import a video from the gallery | Camera | READ_MEDIA_VIDEO on Android 13 and later; READ_EXTERNAL_STORAGE on Android 12 and earlier | NSPhotoLibraryUsageDescription |
| Save a video to the device | Core, UI, Camera | WRITE_EXTERNAL_STORAGE, requested only on Android 9 and earlier | NSPhotoLibraryUsageDescription |
| Take a profile, community, or link photo | Core, UI | CAMERA | NSCameraUsageDescription |
| Choose a profile, community, or link photo from the library | Core, UI | None; the system picker grants access | NSPhotoLibraryUsageDescription |
| Create an AI avatar from a photo or a voice sample | AI | CAMERA and RECORD_AUDIO | NSCameraUsageDescription, 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.
<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:
- The device has a camera and a microphone. If either is missing, the member sees "This feature is not available on your device."
- Your manifest requests
CAMERAandRECORD_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.
<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 action | Android 2.1.5 asks for | iOS 2.1.5 asks for |
|---|---|---|
| Opens the camera in video mode | CAMERA and RECORD_AUDIO, in one request | Camera, then microphone |
| Switches the camera to photo mode | CAMERA | Camera |
| Switches the camera to audio mode | RECORD_AUDIO | Microphone, then speech recognition |
| Starts a voice comment | RECORD_AUDIO | Microphone |
| Records a video comment | CAMERA and RECORD_AUDIO | Camera, then microphone |
| Opens the gallery | READ_MEDIA_VIDEO, or READ_EXTERNAL_STORAGE on Android 12 and earlier | Photo library, read and write; limited access is accepted |
| Saves a video | WRITE_EXTERNAL_STORAGE on Android 9 and earlier; nothing on later versions | Photo library |
| Takes a profile or community photo | CAMERA | Camera, 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.
| Where | Android 2.1.5 | iOS 2.1.5 |
|---|---|---|
| Camera screen | A 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. |
| Gallery | A dialog, "{brand} needs access to your gallery.", with Go to settings and Cancel | An enable-access message with a button that opens Settings |
| Video or voice comment | A dialog with Go to settings and Cancel | A message with a button that opens Settings |
| Saving a video | On Android 9 and earlier, a Storage Permission dialog with a settings button | An alert that photo library access isn't authorized |
| Transcript | Not applicable | Recording 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.
- Start from a clean install so every prompt appears again:
adb uninstall {{PACKAGE_NAME}}
adb install app-debug.apk- Simulate a member who granted access and later turned it off:
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- 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:
xcrun simctl privacy booted reset all {{BUNDLE_ID}}- Walk through each scenario and compare the result:
| Scenario | How to set it up | Expected result |
|---|---|---|
| Declaration missing | Remove CAMERA from the manifest, or NSCameraUsageDescription from Info.plist | The create action shows the unsupported-feature message, with no system prompt |
| First use | Clean install | The system prompt appears when the camera screen opens |
| Denied | Tap Don't allow at the prompt | The SDK's permission message with a button to settings |
| Granted later | Allow access in settings, then return | Android re-enables the camera; on iOS, the camera works when reopened |
| Partial library access | Android 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 hardware | An 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:
<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
| Symptom | Cause | Fix |
|---|---|---|
| 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 build | Declare both permissions and add com.begenuin:camera |
| Android: the gallery button shows the same message | READ_MEDIA_VIDEO (Android 13 and later) or READ_EXTERNAL_STORAGE (Android 12 and earlier) isn't declared | Declare the permission for the versions you support |
| iOS: an unsupported-feature alert appears instead of the camera | A camera or microphone key is missing, or camera_enabled is off for your brand | Add both keys; if they're present, ask Genuin to check camera_enabled |
| iOS: audio recordings never show a transcript | NSSpeechRecognitionUsageDescription is missing, or the member denied speech recognition | Add the key; the member can allow it in Settings |
| Google Play rejects the release over media permissions | READ_MEDIA_VIDEO or READ_MEDIA_IMAGES without a Play Console declaration | Submit the declaration, or remove the permission and accept that gallery import is unavailable |
| Google Play hides the app on devices without a camera | CAMERA implies a required camera unless you say otherwise | Add 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.

