2015-09-01 10 views
9

Mam problemy z używaniem aparatu. Problem polega na tym, że niektóre urządzenia pokazują mi pozycję kamery w ustawieniach, a inne nie. Na urządzeniach, na których przełącznik aparatu się nie pojawia, nie mogę korzystać z aparatu, ponieważ nie ma on uprawnień, a także nie jest wyświetlany w ustawieniach, aby je włączyć.Uprawnienia do aparatu iOS nie pojawiają się w ustawieniach niektórych urządzeń.

Jak to wygląda na urządzenie, które działa:

enter image description here

I tak to wygląda w urządzeniach, które nie działa.

enter image description here

Kiedy wziąłem te screeny, aplikacja powinna już poprosił o uprawnieniach już, ale tak się nie stało.

Sprawdziłem również, że te urządzenia nie mają włączonych ograniczeń.

Wszelkie pomysły?

UPDATE 1: Dodano kod

Jest to kod używam pokazać aparat (to pod widoku niestandardowym, nie natywny sterownik kamera)

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]; 
+0

Aparat pojawi się tam tylko wtedy, gdy aplikacja prosi o pozwolenie. Czy możesz pokazać kod, którego używasz, aby poprosić o pozwolenie? –

+0

Dodano. Czy ten kod nie pyta automatycznie o uprawnienia po uruchomieniu sesji przechwytywania? W aplikacji jest inne miejsce, w którym używam UIImagePickerController do robienia zdjęć. Być może nie mam uprawnień obsługi poprawnie, ale jeśli wcześniej otworzyłem UIImagePickerController, to uprawnienia są włączone? – lucaslt89

+0

Mam ten sam problem i bardzo rozpaczliwie potrzebuję rozwiązania. Daj mi znać, jeśli znalazłeś sposób na rozwiązanie tego ...! – durazno

Odpowiedz

8

Trzeba poprosić o pozwolenie przed otwarciem sesji. Użyj

[AVCaptureDevice requestAccessForMediaType:completionHandler:] 
+1

Nie, to nie jest prawda. "Zauważ, że okno dialogowe autoryzacji zostanie automatycznie wyświetlone, jeśli status jest AVAuthorizationStatusNotDetined podczas tworzenia AVCaptureDeviceInput." i robi dokładnie to, jeśli nie pytasz ręcznie o pozwolenie, a także, gdy robisz to ręcznie, otrzymujesz pytanie. Jednak mam ten sam problem z lucaslt89. Nawet po zresetowaniu lokalizacji i prywatności aplikacja nie żąda pozwolenia i tego samego wyniku po ręcznym wywołaniu [AVCaptureDevice requestAccessForMediaType: completionHandler:]. Dzieje się tak z niektórymi urządzeniami, ale z niektórymi innymi nie występuje taki problem. CZEMU?!! – durazno

+0

Mam również ten sam problem. Aplikacja nie prosi o pozwolenie. Czy to poprawiłeś? – abhi1992

3

Krok 1: Podaj odpowiednią wiadomość dostępu wiadomość kamera na Info.plist stosując następujący klucz (bez cudzysłowów)

"Privacy - Camera Usage Description" 

Krok 2: Na Objective-C/SWIFT trzeba wystąpić o pozwolenie na dostęp kamera

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 
     } 
    }) 
Powiązane problemy