質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Swift

    7227questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

カメラアクセスと写真のアップロードができない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 626
退会済みユーザー

退会済みユーザー

作ったアプリでカメラアクセスと写真のアップロードができません。
Xcodeから自分のiPhoneでエミュレータを起動したのですが
Camera access ボタンとPhoto upload ボタンは自分のiPhoneで表示されたのですが
それらは押せるだけで本当の機能ができません。
ボタンはコントローラにくっついています。
OSは10.12(Sierra)でボタンを押した時に何もエラーは出ません。
コントローラには

import UIKit

class SendController:UIViewController,
UINavigationControllerDelegate,UIImagePickerControllerDelegate{

    let ButtonCamera = 0
    let ButtomRead = 1
    let ButtonWrite = 2

    var imageView:UIImageView!
    var btnCamera:UIButton!
    var btnRead:UIButton!
    var btnWrite:UIButton!


    override func viewDidLoad() {
        super.viewDidLoad()


       self.view.addSubview(btnCamera)

       self.view.addSubview(btnRead)

       self.view.addSubview(imageView)
    }

    func onClick(sender:UIButton){
       if sender.tag == ButtonCamera {
          openPicker(sourceType: UIImagePickerControllerSourceType.camera)
       }else if sender.tag == ButtomRead {
           openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
        }

    }

    func showAlert(title: String?, text: String?) {
        let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        present(alert, animated: true, completion: nil)
    }

    func openPicker(sourceType:UIImagePickerControllerSourceType){
        if !UIImagePickerController.isSourceTypeAvailable(sourceType){
            showAlert(title: nil, text: "UnableUse")
            return
        }

        let picker = UIImagePickerController()
        picker.sourceType = sourceType
        picker.delegate = self

        present(picker, animated: true, completion: nil)
           }


    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage]as! UIImage
        imageView.image = image

        picker.presentingViewController?.dismiss(animated: true,completion:nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.presentingViewController?.dismiss(animated: true, completion: nil)
    }


}


と書きました。
どう直せばいいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

ボタン等の部品が生成されていないのではないでしょうか?

import UIKit

class ViewController:UIViewController,
UINavigationControllerDelegate,UIImagePickerControllerDelegate{

    let ButtonCamera = 0
    let ButtomRead = 1
    let ButtonWrite = 2

    var imageView:UIImageView = UIImageView()

    var btnCamera:UIButton = UIButton(type: .custom)
    var btnRead:UIButton = UIButton(type: .custom)
    var btnWrite:UIButton = UIButton(type: .custom)


    override func viewDidLoad() {
        super.viewDidLoad()

        imageView.frame = CGRect(x: 150, y: 100, width: 200, height: 200)
        imageView.contentMode = .scaleAspectFit
        view.addSubview(imageView)

        btnCamera.frame = CGRect(x: 0, y: 100, width: 100, height: 100)
        btnCamera.setTitle("Camera", for: .normal)
        btnCamera.tag = ButtonCamera
        btnCamera.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
        btnCamera.backgroundColor = UIColor.green
        self.view.addSubview(btnCamera)

        btnRead.frame = CGRect(x: 0, y: 200, width: 100, height: 100)
        btnRead.setTitle("Read", for: .normal)
        btnRead.tag = ButtomRead
        btnRead.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
        btnRead.backgroundColor = UIColor.red
        self.view.addSubview(btnRead)

        btnWrite.frame = CGRect(x: 0, y: 300, width: 100, height: 100)
        btnWrite.setTitle("Write", for: .normal)
        btnWrite.tag = ButtonWrite
        btnWrite.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
        btnWrite.backgroundColor = UIColor.blue
        self.view.addSubview(btnWrite)
    }

    func onClick(sender:UIButton){
        if sender.tag == ButtonCamera {
            openPicker(sourceType: UIImagePickerControllerSourceType.camera)
        }else if sender.tag == ButtomRead {
            openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
        }

    }

    func showAlert(title: String?, text: String?) {
        let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        present(alert, animated: true, completion: nil)
    }

    func openPicker(sourceType:UIImagePickerControllerSourceType){
        if !UIImagePickerController.isSourceTypeAvailable(sourceType){
            showAlert(title: nil, text: "UnableUse")
            return
        }

        let picker = UIImagePickerController()
        picker.sourceType = sourceType
        picker.delegate = self

        present(picker, animated: true, completion: nil)
    }


    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage]as! UIImage
        imageView.image = image

        picker.presentingViewController?.dismiss(animated: true,completion:nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.presentingViewController?.dismiss(animated: true, completion: nil)
    }
}

plistに以下を追加することも忘れずに。

<key>NSCameraUsageDescription</key>
<string>カメラの使用許可をお願いします</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>フォトライブラリの使用許可をお願いします</string>
<key>UILaunchStoryboardName</key>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/26 21:15

    <plist version="1.0">
    <dict>
    <key>NSCameraUsageDescription</key>
    <string>カメラの使用許可をお願いします</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>フォトライブラリの使用許可をお願いします</string>
    <key>UILaunchStoryboardName</key>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
    <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    </dict>
    </plist>
    のようにplistに記載したのですが、formatが違い読み込めない、と言われました。どのようにplistに記載すればいいのでしょうか?xcodeのInfo.plistからはどのように追加すればいいのかわかりませんでした..。

    キャンセル

  • 2017/02/26 22:04

    挿入するところが分からないのでしたら、無理してソースで入れるのでは無くて通常の`Property List`表示でkeyと文字列を設定してみてください。

    キャンセル

  • 2017/02/27 20:47

    ありがとうございます!全部やってみたのですが、やはり動かず...。

    キャンセル

  • 2017/02/27 20:48

    <dict>
    <key>UILaunchStoryboardName</key>
    <string></string>
    <key>CFBundleGetInfoString</key>
    <string></string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>フォトライブラリの使用許可をお願いします</string>
    <key>CFBundleDisplayName</key>
    <string></string>
    <key>NSCameraUsageDescription</key>
    <string>カメラの使用許可をお願いします</string>
    <key>LSApplicationCategoryType</key>
    <string></string>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
    <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    </dict>

    キャンセル

  • 2017/02/27 20:49

    のようにplistを書いたのですが、やはり何か間違ってますかね...?

    キャンセル

  • 2017/02/27 20:50

    ちなみに、コントローラには
    import UIKit

    class SendController:UIViewController,
    UINavigationControllerDelegate,UIImagePickerControllerDelegate{

    //定数
    let ButtonCamera = 0
    let ButtomRead = 1
    let ButtonWrite = 2

    //変数
    var imageView:UIImageView = UIImageView()
    var btnCamera:UIButton = UIButton(type: .custom)
    var btnRead:UIButton = UIButton(type: .custom)
    var btnWrite:UIButton = UIButton(type: .custom)


    //ロード完了時に呼ばれる
    override func viewDidLoad() {
    super.viewDidLoad()

    // //カメラボタン生成
    // self.view.addSubview(btnCamera)
    // //読み込み
    // self.view.addSubview(btnRead)
    // // イメージビューの生成
    // self.view.addSubview(imageView)

    imageView.frame = CGRect(x: 150, y: 100, width: 200, height: 200)
    imageView.contentMode = .scaleAspectFit
    view.addSubview(imageView)

    btnCamera.frame = CGRect(x: 0, y: 100, width: 100, height: 100)
    btnCamera.setTitle("Camera", for: .normal)
    btnCamera.tag = ButtonCamera
    btnCamera.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
    btnCamera.backgroundColor = UIColor.green
    self.view.addSubview(btnCamera)

    btnRead.frame = CGRect(x: 0, y: 200, width: 100, height: 100)
    btnRead.setTitle("Read", for: .normal)
    btnRead.tag = ButtomRead
    btnRead.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
    btnRead.backgroundColor = UIColor.red
    self.view.addSubview(btnRead)

    btnWrite.frame = CGRect(x: 0, y: 300, width: 100, height: 100)
    btnWrite.setTitle("Write", for: .normal)
    btnWrite.tag = ButtonWrite
    btnWrite.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
    btnWrite.backgroundColor = UIColor.blue
    self.view.addSubview(btnWrite)
    }

    //ボタンクリック時に呼ばれる
    func onClick(sender:UIButton){
    if sender.tag == ButtonCamera {
    openPicker(sourceType: UIImagePickerControllerSourceType.camera)
    }else if sender.tag == ButtomRead {
    openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
    }

    }

    //アラートの表示
    func showAlert(title: String?, text: String?) {
    let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
    present(alert, animated: true, completion: nil)
    }

    //イメージピッカーのオープン
    func openPicker(sourceType:UIImagePickerControllerSourceType){
    if !UIImagePickerController.isSourceTypeAvailable(sourceType){
    showAlert(title: nil, text: "利用できません")
    return
    }

    //イメージピッカーの生成
    let picker = UIImagePickerController()
    picker.sourceType = sourceType
    picker.delegate = self

    //ビューコントローラーのビューを開く
    present(picker, animated: true, completion: nil)
    }

    // // イメージピッカーのイメージ取得時に呼ばれる
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage]as! UIImage
    imageView.image = image
    //ビューコントローラーのビューを閉じる
    picker.presentingViewController?.dismiss(animated: true,completion:nil)
    }

    // //イメージピッカーのキャンセル取得時に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.presentingViewController?.dismiss(animated: true, completion: nil)
    }


    }

    キャンセル

  • 2017/02/27 20:50

    のように書きました

    キャンセル

  • 2018/01/21 14:21

    https://qiita.com/peka2/items/9a3f1b92cb4f88064b89

    こちらもご覧になってください
    iOS11以降では<key>NSPhotoLibraryAddUsageDescription</key>も追記が必要です
    plistではどこに追記しても問題はないかと思います(もちろんstringとセットですが)

    それでならないのであれば具体的にどういうエラー文が出ているか、コピペ等でこちらに投げてみてはいかがでしょうか。より的確な対応ができるかなと。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7227questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています