[iPhone] UIImagePickerController による Camera撮影

iOSでカメラを扱うにはUIImagePickerControllerがあります。撮影して、保存、アルバムで確認するアプリが作れます。
 
簡単に扱える半面できないこともあり、詳細を設定したい場合はAVCapturePhotoOutput あるいは AVCaptureVideoDataOutputを使います。
iOS11から NSPhotoLibraryAddUsageDescription を追加
 

 

Swift 4.0
Xcode 9.0

 

UIImagePickerController

 
Cameraを扱う場合ユーザー許可を得ないとcrashします。
 

Cocoa Keys

 
Cocoa Keys

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

こういうエラーが表示されたら、説明の通りInfo.plist にNSCameraUsageDescriptionの設定を行いましょう。
加えて、フォトライブラリーも当然使うためNSPhotoLibraryAddUsageDescriptionも加えておきます。

iOS11から
NSPhotoLibraryAddUsageDescription が必要になりました

NSCameraUsageDescriptionというkeyを設定して、valueにはその理由を説明せよという事らしいですね。
 
Info.plistの編集
 
Info.plistをプロジェクトで開いてKeyとvaleを追加します。
 

 
一番Topを選択すると「+」ボタンが表示されこれで「Key」の項目を作成でき、そのValueも追加することができます。
ただし、info.plistでは表示が変わります

  • NSCameraUsageDescription
    • Privacy – Camera Usage Description
  • NSPhotoLibraryAddUsageDescription
    • Privacy – Photo Library Additions Usage Description


 
もっとも、Finderからファイルを直接編集してしまう方が早いでしょう。
 

 
これをそのまま叩くとXcodeで前と同じになりますので、アプリを選択して「テキストエディット.app」とか自前で用意したエディタで編集すれば簡単です。
 
Info.plist

 
これを設定するとこんなDialogが表れます。
 
img_0667
 
これにユーザーに許可をdialogで求めるのは最初だけで、その後は自動的に許可されています。ただし、設定のアプリから詳細設定でこの許可・不許可がいつでも設定できるようです。
 
なんかAndroidのRuntime Permissionのようになってきましたね。
ただし、不許可にした場合dialogが出てこない、機能が使えないだけでエラーになるわけでもない。
 
以前から使っていたNSPhotoLibraryUsageDescriptionは読み出しでは必要なのかとも思いましたが…iOS11では要らないような気がします。古いバージョンに対応する時は入れておきましょう。Ref: Cocoa Keys

  • NSPhotoLibraryAddUsageDescription
    • Specifies the reason for your app to get write-only access to the user’s photo library. See NSPhotoLibraryAddUsageDescription for details.
      iOS 11 and later
  • NSPhotoLibraryUsageDescription
    • Specifies the reason for your app to access the user’s photo library. See NSPhotoLibraryUsageDescription for details.
      iOS 6.0 and later

 

camera app plan

 
Storyboard にアプリの構想もかねて部品を配置してみます

  1. カメラを起動させる
    • ボタン:UIButton「Start」
    • カメラ起動の action
  2. 撮影した画像を表示
    • 画像表示:UIImageView
  3. 画像を保存
    • ボタン:UIButton「Save」
    • 画像を保存する action
  4. 保存した画像を確認する
    • ボタン:UIButton「Album」
    • アルバムに移動する action
  5. それぞれのステータスを表示
    • ラベル:UILabel

 

 
ボタンを3つ作成して、それぞれに「Start」「Save」「Album」と名前を付け、背景色も付けます
 
UIImageView を配置し、ラベルをその下に入れます。まあ、このへんは好みですので適当で
 

UIImagePickerController

 
まずUIImagePickerController というクラスを使います
このクラスの親クラスは UINavigationController です
 
そのためデリゲートとして以下のDelegateをを設定

  • UINavigationControllerDelegate
  • UIImagePickerControllerDelegate

IBOutlet と部品との関係は
「UILabel」-> label
「UIImageView」-> cameraView
です、これに合わせて、storyboard の部品と紐付けします
 
また、それぞれの action は
startCamera
savePicture
showAlbum
でそれぞれのボタンに紐付けし記述します
 
ViewController.swift

 
カメラでの撮影は
 
1. カメラを利用する設定
2. カメラが利用可能かチェック
3. UIImagePickerController のインスタンスの作成
4. デリゲートを設定
5. present では
UIViewControllerが管理しているビューにを全画面を覆う画像の表示をします
 
self.present(cameraPicker, animated: true, completion: nil)
 
イメージピッカーはカメラ以外にも使います

  1. UIImagePickerControllerSourceType.camera
    • カメラ
  2. UIImagePickerControllerSourceType.photoLibrary
    • フォトライブラリ

そのため、UIImagePickerControllerSourceType
にどれを使うか指定します。
カメラを使う所と、アルバムを表示するところはほとんど同じです
 
 
関連:

Reference:
UIImagePickerController – UIKit | Apple Developer Documentation


ページのトップへ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする