2010-09-04 18 views
53

Tôi đang viết một ứng dụng iOS và tôi cần có khả năng phát hiện xem thiết bị có máy ảnh hay không. Trước đây, tôi sẽ kiểm tra xem thiết bị có phải là iPhone hay không, vì chỉ có iPhone có camera - nhưng với sự ra mắt của iPod Touch 4, đây không còn là lựa chọn khả thi. Các chức năng của ứng dụng không có máy ảnh, nhưng sự hiện diện của máy ảnh sẽ thêm chức năng.Phát hiện sự tồn tại của camera trong ứng dụng iPhone?

Vì vậy, bất kỳ ai cũng có thể cung cấp cho tôi mã trả về việc có máy ảnh hay không?

+0

Phiên bản Swift: [Link] (http://stackoverflow.com/a/33697919/1634890) –

Trả lời

152

Bạn có thể sử dụng +isSourceTypeAvailable: phương pháp trong UIImagePickerController:

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) 
    // Has camera 
+1

Cẩn thận: Nếu máy ảnh bị "hạn chế", điều này sẽ trả về false ngay cả khi máy ảnh tồn tại. – pulse4life

+0

Tôi đang làm việc trên một ứng dụng ngay bây giờ với quyền truy cập máy ảnh được đặt thành giới hạn nhưng điều này trở lại đúng, vì vậy nhận xét của @ pulse4life không chính xác (ít nhất là không còn nữa - sử dụng iOS 10). Đối với ủy quyền truy cập, bạn nên sử dụng 'AVAuthorizationStatus'. – shim

+1

Tôi vừa thử nghiệm lại điều này trên iOS 10.3.2. Nó sẽ trả về false nếu máy ảnh bị hạn chế trên thiết bị của bạn. Bằng cách hạn chế, tôi có nghĩa là vào Settings> General> Restrictions và tắt máy ảnh (điều này thường được thực hiện bởi một quản trị hệ thống). Tôi tin rằng đây là hành vi mong muốn mà Apple muốn vì nó không có sẵn về mặt kỹ thuật mặc dù máy ảnh tồn tại. – pulse4life

19

Vâng, có một API được cung cấp để làm việc đó:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
19

Nếu bạn đang sử dụng các lớp AV Foundation thay vì UIImagePickerController bạn có thể làm:

BOOL hasCamera = ([[AVCaptureDevice devices] count] > 0); 

Nếu bạn đang sử dụng UIImagePicker Điều khiển nó có lẽ không phải là giá trị nó, vì bạn sẽ phải thêm AVFoundation.framework vào dự án của bạn.

+17

Điều này không nhất thiết phải hiệu quả. Nếu các giới hạn đã bật máy ảnh, điều này có thể xuất ra micrô làm thiết bị nhưng không có máy ảnh nào khả dụng.Tốt hơn để sử dụng [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] count] – Jbryson

4

Nếu bạn cần phải biết cho dù thiết bị đặc biệt có một camera phía trước hoặc phía sau, sử dụng này:

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; 
+0

Đây phải là câu trả lời hay vì điều này không phụ thuộc vào trạng thái "bị hạn chế" – iGranDav

10

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){ 

    //Your code goes here 
    //For example you can print available media types: 

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera)) 

    } 
-2

Để kiểm tra của máy ảnh có sẵn (Swift)

if(!UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) 
12

SWIFT

Như Juan Boero viết kiểm tra:

if UIImagePickerController.isSourceTypeAvailable(.camera){ } 

Nhưng tôi sẽ thêm kiểm tra khác để xem nếu người dùng cho phép truy cập vào máy ảnh như táo cho thấy trong ví dụ PhotoPicker của họ (PhotoPicker example Objective-C):

* xin lưu ý bạn phải nhập khẩu AVFoundation

let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) 

if authStatus == AVAuthorizationStatus.denied { 
    // Denied access to camera 
    // Explain that we need camera access and how to change it. 
    let dialog = UIAlertController(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.", preferredStyle: UIAlertControllerStyle.alert) 

    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil) 

    dialog.addAction(okAction) 
    self.present(dialog, animated:true, completion:nil) 

} else if authStatus == AVAuthorizationStatus.notDetermined {  // The user has not yet been presented with the option to grant access to the camera hardware. 
    // Ask for it. 
    AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (grantd) in 
    // If access was denied, we do not set the setup error message since access was just denied. 
     if grantd { 
     // Allowed access to camera, go ahead and present the UIImagePickerController. 
      self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera) 
     } 
    }) 
} else { 

    // Allowed access to camera, go ahead and present the UIImagePickerController. 
    self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera) 

} 

func showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType) { 

    let myPickerController = UIImagePickerController() 
    myPickerController.delegate = self; 
    myPickerController.sourceType = sourceType 
    self.present(myPickerController, animated: true, completion: nil) 
} 
+1

cảm ơn vì mã ví dụ siêu tiện dụng! – Fattie

Các vấn đề liên quan