カメラを起動するボタンを使ってiOSアプリをやっています。
デバイスにカメラが使用可能かどうかにかかわらず、ボタンを有効/無効にしたい。
デバイスにカメラがあるかどうか、またデバイスにカメラがあるかどうかを検出したいのですが、制限されているため( this )、使用できません。
これらの2つのオプションをどのように検出できますか?
ありがとう
アプリでカメラの許可ステータスを確認するには、次のスニペットを使用します。
@import AVFoundation;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(status == AVAuthorizationStatusAuthorized) {
// authorized
} else if(status == AVAuthorizationStatusDenied){
// denied
} else if(status == AVAuthorizationStatusRestricted){
// restricted
} else if(status == AVAuthorizationStatusNotDetermined){
// not determined
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if(granted){
NSLog(@"Granted access");
} else {
NSLog(@"Not granted access");
}
}];
}
}
カメラ制限AVAuthorizationStatus
では不十分かどうかを確認します。ドキュメントで述べたように:
通常、このステータスは表示されません。デバイスを検出するためのAVCaptureDeviceクラスのメソッドは、ユーザーがアクセスを制限されているデバイスを返しません。
したがって、適切なチェックを行うには、たとえば、次のようにキャプチャデバイスを作成する必要があります。
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusAuthorized) {
BOOL atLeastOne = NO;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
if (device) {
atLeastOne = YES;
}
}
if (!atLeastOne) {
authStatus = AVAuthorizationStatusRestricted;
}
}
ユーザーが初めてiOS6でカメラを使用しようとすると、自動的に許可を求められます。コードを追加する必要はありません(その前に、authorizationstatusはALAuthorizationStatusNotDeterminedです)。
したがって、ユーザーが最初に拒否した場合、再度質問することはできません。
ALAssetsLibraryを使用してこれを確認できます。この解決策については、この回答を確認してください: ask-permission-to-access-camera
それがあなたを助けることを願っています。
Swift3
カメラボタンを有効(または非表示)にするかどうかを決定するには、以下を確認する必要があります。
if UIImagePickerController.isSourceTypeAvailable(.Camera){ }
しかし、次に、AppleがPhotoPickerの例( PhotoPickerの例Objective-C )で示唆しているように、ユーザーがカメラへのアクセスを許可したかどうかを確認します。
* 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)
}