2015-09-09 100 views
0

你好,我有一個工作代碼AVCaptureVideoPreviewLayer ..這是一個部分條形碼閱讀器:AVCaptureVideoPreviewLayer黑屏

let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

    do { 
     let input = try AVCaptureDeviceInput(device: captureDevice) as AVCaptureDeviceInput 
     session.addInput(input) 
     print("input done..") 
    } catch let error as NSError { 
     print(error) 
    } 

    let output = AVCaptureMetadataOutput() 
    output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 
    session.addOutput(output) 
    output.metadataObjectTypes = output.availableMetadataObjectTypes 

    previewLayer = AVCaptureVideoPreviewLayer(session: session) as AVCaptureVideoPreviewLayer 
    previewLayer.frame = self.view.bounds 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
    self.view.layer.addSublayer(previewLayer) 
    self.view.bringSubviewToFront(self.highlightView) 
    session.startRunning() 

它的啓動和運行也,有沒有任何錯誤messeage和我在我的舊iPhone使用我也可以看到相機的圖片。但2天前我的iPhone已被替換,我沒有改變代碼中的任何東西。現在的應用程序開始,但我只能看到黑屏。

有沒有人知道可能會導致這種情況?

謝謝!

+0

在設置>隱私 - >相機檢查設備,並確保您的應用已啓用訪問攝像機 –

+0

不,它沒有啓用..但我怎樣才能訪問使用相機?這是相同的代碼..我的舊設備並沒有要求我既不啓用訪問相機。 – solarenqu

+0

所以沒有一個彈出窗口,我可以啓用。 – solarenqu

回答

0

從iOS 8的需要請求許可,您可以做這樣的事情

if ([AVCaptureDevice respondsToSelector:@selector(requestAccessForMediaType: completionHandler:)]) { 
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { 

     if (granted) { 
      // Got the permission 
     } else { 
      // Permission has been denied. 
     } 
    }]; 
} else { 
    // below ios 6 
} 

您可以執行swifth

if AVCaptureDevice.respondsToSelector(Selector("requestAccessForMediaType")) 
{ 
    AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (grandted:Bool) -> Void in 
      //Check if granted and if its true do camera work else permission denied 
    }) 
} 
else 
{ 
// Below iOS 6 
} 
+0

當然,但在我的其他設備上它爲什麼工作?它是ios9測試版。我沒有改變代碼中的任何東西。 – solarenqu

+0

您的其他設備是否正在運行iOS9測試版?如果是這種情況,那麼你必須要求許可, –

+0

@solarenqu有沒有可能你忘記了讓你的應用程序訪問了以前的設備上的相機? – Gliderman

0

此權限的方法是我用來測試的代碼出:

override func viewDidLoad() { 
    super.viewDidLoad() 
    var session = AVCaptureSession.new() 
    session.sessionPreset = AVCaptureSessionPresetMedium 

    let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

    let input = AVCaptureDeviceInput(device: captureDevice, error: nil) as AVCaptureDeviceInput 
    session.addInput(input) 
    print("input done..") 

    var previewLayer = AVCaptureVideoPreviewLayer(session: session) as AVCaptureVideoPreviewLayer 
    previewLayer.frame = self.view.bounds 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
    self.view.layer.addSublayer(previewLayer) 
    session.startRunning() 
} 

我看來問題是你沒有通過NSError需要AVCaptureDeviceInput。 Xcode不確定try聲明也試圖做什麼。我現在只是簡單地將nil傳入構造函數中,但你想要確保處理它。我還刪除了設置輸出的部分,因爲這與我的測試無關。隨意添加回來。

我在運行iOS 7.1的iPhone 4上測試了這個參考。

+0

謝謝..但在iOS 9此代碼不工作.. – solarenqu

+0

無法找到類型'AVCaptureDeviceInput',接受類型的參數列表'(device:AVCaptureDevice !,error:nil)' 這是第一個錯誤.. :) – solarenqu

+0

@solarenqu你有AVFoundation.framework添加到你的項目嗎?隨着你的代碼頂部的'import AVFoundation'? – Gliderman

-1

我將整個代碼複製到一個新的項目中,並且在重新部署之後,它向攝像機請求權限.. :)我不知道這是什麼。感謝您的回答。