问题
I'm having some issues trying to use the camera. The problem is that some devices show me the Camera entry under settings, and some others don't. In those devices where the Camera switch doesn't appear, I'm not able to use the camera, since it doesn't have permissions, and it also doesn't appear under settings to enable them.
This is how it looks on a device that works:
And this is how it looks in devices that doesn't work.
When I took those screenshots, the application should've asked for permissions already, but it didn't.
I also verified that those devices doesn't have Restrictions enabled.
Any ideas?
UPDATE 1: Added code
This is the code I'm using to show the camera (it's under a custom view, not the native camera view controller)
self.captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoCaptureDevice error:&error];
if(videoInput)
{
[self.captureSession addInput:videoInput];
}
else
{
NSLog(@"Error: %@", error);
}
AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
[self.captureSession addOutput:metadataOutput];
[metadataOutput setMetadataObjectsDelegate:self
queue:dispatch_get_main_queue()];
[metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeQRCode]];
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
previewLayer.frame = self.view.layer.bounds;
UIView * previewView = [[UIView alloc] initWithFrame:self.view.frame];
[previewView.layer addSublayer:previewLayer];
[self.view addSubview:previewView];
[self.view sendSubviewToBack:previewView];
[self.captureSession startRunning];
回答1:
You need to request permission before opening a session. Use
[AVCaptureDevice requestAccessForMediaType:completionHandler:]
回答2:
Step 1: Give a proper camera message access message on your info.plist using the following key (without quotes)
"Privacy - Camera Usage Description"
Step 2 : For objective-C/SWIFT you need to request a camera access permission
OBJECTIVE-C
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
{
if (granted == true)
{
//[self presentViewController : picker animated:YES completion:NULL];
//Do your stuff
}
else
{
UIAlertView *cameraAlert = [[UIAlertView alloc]initWithTitle:STR_APPLICATION_TITLE
message:STR_ALERT_CAMERA_DENIED_MESSAGE
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil,nil];
[cameraAlert show];
NSLog(@"denied");
}
}];
SWIFT
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (videoGranted: Bool) -> Void in
if (videoGranted) {
//Do Your stuff here
} else {
// Rejected Camera
}
})
回答3:
I had the same problem until I changed my camera type to wide:
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
来源:https://stackoverflow.com/questions/32332313/ios-camera-permissions-doesnt-appear-under-settings-in-some-devices