1// Copyright 2016-present 650 Industries. All rights reserved. 2 3#import <EXCamera/EXCameraMicrophonePermissionRequester.h> 4#import <ExpoModulesCore/EXDefines.h> 5#import <ExpoModulesCore/EXPermissionsInterface.h> 6 7#import <AVFoundation/AVFoundation.h> 8 9 10@implementation EXCameraMicrophonePermissionRequester 11 12+ (NSString *)permissionType { 13 return @"microphone"; 14} 15 16- (NSDictionary *)getPermissions 17{ 18 AVAuthorizationStatus systemStatus; 19 EXPermissionStatus status; 20 NSString *microphoneUsageDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"]; 21 22 if (!microphoneUsageDescription) { 23 EXFatal(EXErrorWithMessage(@"This app is missing NSMicrophoneUsageDescription, so audio services will fail. Add this entry to your bundle's Info.plist.")); 24 systemStatus = AVAuthorizationStatusDenied; 25 } else { 26 systemStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; 27 } 28 switch (systemStatus) { 29 case AVAuthorizationStatusAuthorized: 30 status = EXPermissionStatusGranted; 31 break; 32 case AVAuthorizationStatusDenied: 33 case AVAuthorizationStatusRestricted: 34 status = EXPermissionStatusDenied; 35 break; 36 case AVAuthorizationStatusNotDetermined: 37 status = EXPermissionStatusUndetermined; 38 break; 39 } 40 return @{ 41 @"status": @(status) 42 }; 43} 44 45- (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject 46{ 47 EX_WEAKIFY(self) 48 [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) { 49 EX_STRONGIFY(self) 50 resolve([self getPermissions]); 51 }]; 52} 53 54@end 55