私のアプリが iOS 8 で初めてカメラにアクセスしようとすると、iOS 7 のマイク アクセス用のマイクのような、カメラのアクセス許可ダイアログがユーザーに表示されます。
iOS 7 では、事前にマイクの許可ダイアログを呼び出して、許可が付与されているかどうかを確認することができました (たとえば、この質問を参照してください)。iOS 8 でカメラの許可ダイアログを呼び出す同様の方法はありますか? マイクとカメラのアクセス許可のためにダイアログを組み合わせることができますか?
私のアプリが iOS 8 で初めてカメラにアクセスしようとすると、iOS 7 のマイク アクセス用のマイクのような、カメラのアクセス許可ダイアログがユーザーに表示されます。
iOS 7 では、事前にマイクの許可ダイアログを呼び出して、許可が付与されているかどうかを確認することができました (たとえば、この質問を参照してください)。iOS 8 でカメラの許可ダイアログを呼び出す同様の方法はありますか? マイクとカメラのアクセス許可のためにダイアログを組み合わせることができますか?
ユーザーが最初にプロンプトが表示されたときにカメラへのアクセスを拒否した場合、ボタンを押してスナップショットを撮ると、カメラモードで黒い画面が表示されます。
ただし、ユーザーがアクセスを拒否したことを検出し、オンにする必要があることを確認したいのですが、現在のユーザーのカメラ アクセスを確認する機能が見つかりません。そのような機能はありますか?
編集: 次のチェックにより、IOS 8 でカメラ アクセスについて通知されます。
#import <AVFoundation/AVFoundation.h>
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){ // Access has been granted ..do something
} else { // Access denied ..do something
}
}];
}
この情報は、次の質問 ( iOS8 でアプリケーションがカメラにアクセスできるか、プログラムでアクセスできないかを知る方法) で見つかりました。
これが私の Swift ソリューション (iOS 8) です。QR スキャン用のカメラが必要だったので、実際にその使用を促す必要がありました。
これにより、
デフォルトのカメラ アクセス許可の質問の前に、許可を選択するようユーザーに促します。
ユーザーが最初の要求を拒否した場合に設定にアクセスする簡単な方法。
ViewDidAppear/またはViewDidLoadなどでコールチェックカメラを実行するには、viewDidAppearを使用する必要があったため、カスタムカメラビューの制約が設定されました。
func checkCamera() {
let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
switch authStatus {
case .authorized: break // Do your stuff here i.e. allowScanning()
case .denied: alertToEncourageCameraAccessInitially()
case .notDetermined: alertPromptToAllowCameraAccessViaSetting()
default: alertToEncourageCameraAccessInitially()
}
}
func alertToEncourageCameraAccessInitially() {
let alert = UIAlertController(
title: "IMPORTANT",
message: "Camera access required for QR Scanning",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Allow Camera", style: .cancel, handler: { (alert) -> Void in
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
}))
present(alert, animated: true, completion: nil)
}
func alertPromptToAllowCameraAccessViaSetting() {
let alert = UIAlertController(
title: "IMPORTANT",
message: "Please allow camera access for QR Scanning",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel) { alert in
if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 {
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
DispatchQueue.main.async() {
self.checkCamera() } }
}
}
)
present(alert, animated: true, completion: nil)
}
dispatch_async を使用するためのヒントについては、上記の jamix に感謝します - 新しく設定されたカメラ機能を表示するための応答が非常に高速になります。
末尾のクロージャーが混在して申し訳ありません..それらを試してみたかった.
マイクとカメラの両方のアクセス許可を確認する回答はないようです。私たちのコードは、カメラのアクセス許可が付与されているが、マイクへのアクセスが拒否されているシナリオをチェックします。
私たちは Swift に慣れていないので、ぎこちなくネストされたクロージャーとif
ステートメントが最適である可能性は低いです。コードを改善するための提案を共有してください! しかし、少なくともテストではこれまでのところ機能しています。
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (videoGranted: Bool) -> Void in
if (videoGranted) {
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeAudio, completionHandler: { (audioGranted: Bool) -> Void in
if (audioGranted) {
dispatch_async(dispatch_get_main_queue()) {
// Both video & audio granted
}
} else {
// Rejected audio
}
})
} else {
// Rejected video
}
})
Swift 3.0 ソリューション
AVFoundation のインポート
注: Info.plist に Privacy - Camera Usage Description キーを追加します。
//MARK: カメラの取り扱い
func callCamera(){
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = UIImagePickerControllerSourceType.camera
self.present(myPickerController, animated: true, completion: nil)
NSLog("Camera");
}
func checkCamera() {
let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
switch authStatus {
case .authorized: callCamera() // Do your stuff here i.e. callCameraMethod()
case .denied: alertToEncourageCameraAccessInitially()
case .notDetermined: alertPromptToAllowCameraAccessViaSetting()
default: alertToEncourageCameraAccessInitially()
}
}
func alertToEncourageCameraAccessInitially() {
let alert = UIAlertController(
title: "IMPORTANT",
message: "Camera access required for capturing photos!",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Allow Camera", style: .cancel, handler: { (alert) -> Void in
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
}))
present(alert, animated: true, completion: nil)
}
func alertPromptToAllowCameraAccessViaSetting() {
let alert = UIAlertController(
title: "IMPORTANT",
message: "Camera access required for capturing photos!",
preferredStyle: UIAlertControllerStyle.alert
)
alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel) { alert in
if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 {
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
DispatchQueue.main.async() {
self.checkCamera() } }
}
}
)
present(alert, animated: true, completion: nil)
}
viewWillAppear
Swift 3 の場合、最初のビュー コントローラーのメソッドにこれを追加できます。
AVFoundation
最初にフレームワークをインポートします
import AVFoundation
それで:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let authorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
switch authorizationStatus {
case .notDetermined:
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
if granted {
print("access granted")
}
else {
print("access denied")
}
}
case .authorized:
print("Access authorized")
case .denied, .restricted:
print("restricted")
}
}
Privacy - Camera Usage Description
キーを追加することを忘れないでくださいInfo.plist
私にとって、これは iOS7 と iOS8 で動作します:
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
case ALAuthorizationStatusAuthorized:
break;
case ALAuthorizationStatusRestricted:
case ALAuthorizationStatusDenied:
break;
case ALAuthorizationStatusNotDetermined:
break;
}