আইওএসে ক্যামেরার অনুমতি সনাক্ত করুন


143

আমি একটি খুব সাধারণ ভিডিও অ্যাপ বিকাশ করছি। আমি অফিশিয়াল কন্ট্রোলটি ব্যবহার করি: UIImagePickerController।

এখানেই সমস্যা। প্রথমবারের জন্য ইউআইআইজেজপিকার কনট্রোলার উপস্থাপিত করার সময়, আইওএস অনুমতি চাইবে। ব্যবহারকারী হ্যাঁ বা না ক্লিক করতে পারেন। ব্যবহারকারী যদি না ক্লিক করেন তবে নিয়ন্ত্রণটি বরখাস্ত হবে না। পরিবর্তে, যদি ব্যবহারকারী স্টার্ট বোতামটি ক্লিক করে রাখে, স্ক্রিনটি সর্বদা কালো থাকাকালীন টাইমারগুলি চলতে থাকে এবং ব্যবহারকারী টাইমারগুলি থামাতে বা ফিরে যেতে পারে না। ব্যবহারকারীটি কেবলমাত্র অ্যাপটি মারতে পারে। পরের বার UIImagePickerController উপস্থাপন করা হবে, এটি এখনও একটি কালো পর্দা এবং ব্যবহারকারী ক্লিক শুরু করতে যদি ফিরে যেতে পারে না।

আমি ভাবছিলাম এটি কোনও বাগ কিনা। ক্যামেরার অনুমতি সনাক্ত করার কোনও উপায় আছে যাতে আমরা ইউআইআইজেজপিকারকন্ট্রোলারটি দেখানোর সিদ্ধান্ত নিতে পারি বা না?


পুনঃ এটা কি বাগ? আইএমএইচও, আমারও তাই মনে হয়, কারণ যা ঘটেছিল তা হ'ল ভিসি হার্ডওয়্যার থেকে ডেটা প্রদর্শন করছে তবে ওএস মূলত মৃত বাতাস প্রেরণ করছে। আইওএস এখানে কীভাবে পেল তা সম্ভবত পণ্য পরিবারের বিবর্তনের একটি পার্শ্ব প্রতিক্রিয়া। UIImageViewControllerআইওএস ২.০-এ যোগ করা হয়েছে বলে উল্লেখ করা হয়েছে এবং অ্যাভিএরাইজেশন স্ট্যাটাসটি ব্যবহার করা উচিত, তবে অন্য ফ্রেমওয়ার্কে বাস করে এমন দস্তাবেজগুলি কখনই এটিকে টীকায়িত করে না।
21

উত্তর:


229

AVAuthorizationStatusকেসগুলি পরীক্ষা করুন এবং কেসগুলি সঠিকভাবে পরিচালনা করুন।

NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if(authStatus == AVAuthorizationStatusAuthorized) {
  // do your logic
} else if(authStatus == AVAuthorizationStatusDenied){
  // denied
} else if(authStatus == AVAuthorizationStatusRestricted){
  // restricted, normally won't happen
} else if(authStatus == AVAuthorizationStatusNotDetermined){
  // not determined?!
  [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
    if(granted){
      NSLog(@"Granted access to %@", mediaType);
    } else {
      NSLog(@"Not granted access to %@", mediaType);
    }
  }];
} else {
  // impossible, unknown authorization status
}

19
এছাড়াও প্রয়োজন: #import <AVFoundation/AVFoundation.h>বা অনুরূপ
toblerpwn

9
একটি সম্ভবত দরকারী টিপ - যদি আপনি কোডটি পরীক্ষা করে থাকেন যা এটি ব্যবহার করে, আপনি কেবল পরীক্ষার ডিভাইস থেকে আপনার অ্যাপটিকে মুছতে পারবেন না এবং তারপরে পুনরায় ইনস্টল করতে পারবেন না। এটি করলে আইওএস ব্যবহারকারীর কাছে অনুরোধটি পুনরায় প্রকাশ করবে না! আমার জন্য যা কাজ করেছে তা হ'ল Bundle IDপ্রতিটি সময় আমি এটি পরীক্ষা করতে চাইলে অ্যাপটির পরিবর্তন করা । মাথায় ব্যথা, তবে কিছু না হলেও। আপনার শেষ হয়ে গেলে আইডিটি সেট করতে কেবল মনে রাখবেন ;-)
বেনজোহান

25
@ বেঞ্জহান: বান্ডিল আইডি পরিবর্তন করা অপ্রয়োজনীয়। আপনি সেটিংস> সাধারণ> পুনরায় সেট করতে যেতে পারেন এবং এমন একটি সেটিংস খুঁজে পেতে পারেন যা ডিভাইসে সমস্ত অনুমতি প্রম্পটগুলিকে পুনরায় সেট করবে। মঞ্জুর, এটিও বিরক্তিকর কারণ এটি আপনার ডিভাইসের অন্যান্য সমস্ত অ্যাপ্লিকেশনগুলিকেও প্রভাবিত করে। যদি কেবল অ্যাপল
সেটিংস.অ্যাপের

3
@ কেনিডিয়ারিমেকার :-) অ্যাপল উত্তর দিতে পারে যে আমাদের পরীক্ষার জন্য ডেডিকেটেড ডিভাইস ব্যবহার করা উচিত! আমার জন্য আমার নিয়মিত ফোনটি রিসেট করার পার্শ্ব প্রতিক্রিয়াগুলি বেশ চটুল হত। বান্ডিল আইডি পরিবর্তন করা ছিল যুক্তিসঙ্গতভাবে ব্যথাহীন বিকল্প। আমিও জমা দেওয়ার আগে এটি আবার বদলে দেওয়ার কথা মনে
রেখেছিলাম

8
আপনি সম্পূর্ণ রিসেট না করেছেন তা নিশ্চিত করুন! কেবল গোপনীয়তা এবং অবস্থান সেটিংস (আইওএস 8) পুনরায় সেট করা যথেষ্ট হবে।
ক্যানকলস্যান্ডউইচ

81

সুইফট 4 এবং আরও নতুন

নিশ্চিত করা:

import AVFoundation

নীচের কোডটি সমস্ত সম্ভাব্য অনুমতিগুলির জন্য যাচাই করে:

let cameraMediaType = AVMediaType.video
let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: cameraMediaType)
    
switch cameraAuthorizationStatus {
case .denied: break
case .authorized: break
case .restricted: break

case .notDetermined:
    // Prompting user for the permission to use the camera.
    AVCaptureDevice.requestAccess(for: cameraMediaType) { granted in
        if granted {
            print("Granted access to \(cameraMediaType)")
        } else {
            print("Denied access to \(cameraMediaType)")
        }
    }
}

আইওএস 10 যেহেতু আপনাকে NSCameraUsageDescriptionক্যামেরা অ্যাক্সেসের জন্য জিজ্ঞাসা করতে সক্ষম হতে আপনার তথ্য.প্লেস্টে কী নির্দিষ্ট করতে হবে, অন্যথায় আপনার অ্যাপ রানটাইমের সময় ক্রাশ হবে। ব্যবহারের বিবরণগুলির জন্য প্রয়োজনীয় API গুলি দেখুন ।


একটি আকর্ষণীয় পার্শ্ব নোট হিসাবে, আপনি কি জানেন যে সেটিংসে ক্যামেরার অনুমতিগুলি পরিবর্তন করার সময় আইওএস চলমান থাকলে অ্যাপটি মারা যায়?

অ্যাপল বিকাশকারী ফোরাম থেকে:

ব্যবহারকারী যদি সেটিংসে আপনার অ্যাপ্লিকেশনটির ক্যামেরায় অ্যাক্সেস টগল করে তবে সিস্টেমটি আসলে আপনার অ্যাপ্লিকেশনটিকে হত্যা করে । সেটিংস → গোপনীয়তা বিভাগের কোনও সুরক্ষিত ডেটাগ্লাসে এটি একই প্রযোজ্য।


ক্যামেরা এবং ফটো গ্যালারী অনুমোদিত সম্পর্কে কি ??
হাজার ELKOUMIKHI

4

সুইফট সলিউশন

extension AVCaptureDevice {
    enum AuthorizationStatus {
        case justDenied
        case alreadyDenied
        case restricted
        case justAuthorized
        case alreadyAuthorized
        case unknown
    }

    class func authorizeVideo(completion: ((AuthorizationStatus) -> Void)?) {
        AVCaptureDevice.authorize(mediaType: AVMediaType.video, completion: completion)
    }

    class func authorizeAudio(completion: ((AuthorizationStatus) -> Void)?) {
        AVCaptureDevice.authorize(mediaType: AVMediaType.audio, completion: completion)
    }

    private class func authorize(mediaType: AVMediaType, completion: ((AuthorizationStatus) -> Void)?) {
        let status = AVCaptureDevice.authorizationStatus(for: mediaType)
        switch status {
        case .authorized:
            completion?(.alreadyAuthorized)
        case .denied:
            completion?(.alreadyDenied)
        case .restricted:
            completion?(.restricted)
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: mediaType, completionHandler: { (granted) in
                DispatchQueue.main.async {
                    if granted {
                        completion?(.justAuthorized)
                    } else {
                        completion?(.justDenied)
                    }
                }
            })
        @unknown default:
            completion?(.unknown)
        }
    }
}

এবং তারপরে এটি ব্যবহার করার জন্য আপনি করেন

AVCaptureDevice.authorizeVideo(completion: { (status) in
   //Your work here
})

ক্যামেরা এবং ফটো গ্যালারী অনুমোদিত সম্পর্কে কি ??
হাজার ELKOUMIKHI

2

@ রেপটরের উত্তর যুক্ত হিসাবে নিম্নলিখিতটি উল্লেখ করা উচিত। আপনি আইওএস 10 দিয়ে শুরু করে নিম্নলিখিত ত্রুটিটি পেতে পারেন:This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.

এটির সমাধানের জন্য, নিশ্চিত হয়ে নিন যে আপনি নীচে মূল থ্রেড থেকে ফলাফলগুলি পরিচালনা করেছেন (সুইফট 3):

private func showCameraPermissionPopup() {
    let cameraMediaType = AVMediaTypeVideo
    let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: cameraMediaType)

    switch cameraAuthorizationStatus {
    case .denied:
        NSLog("cameraAuthorizationStatus=denied")
        break
    case .authorized:
        NSLog("cameraAuthorizationStatus=authorized")
        break
    case .restricted:
        NSLog("cameraAuthorizationStatus=restricted")
        break
    case .notDetermined:
        NSLog("cameraAuthorizationStatus=notDetermined")

        // Prompting user for the permission to use the camera.
        AVCaptureDevice.requestAccess(forMediaType: cameraMediaType) { granted in
            DispatchQueue.main.sync {
                if granted {
                    // do something
                } else {
                    // do something else
                }
            }
        }
    }
}

অস্বীকারের ক্ষেত্রে, অনুরোধঅ্যাক্সেস পদ্ধতিটি কাজ করবে না। ব্যবহারকারীকে সেটিংসে যেতে এবং অনুমতি দেওয়ার জন্য আপনাকে ম্যানুয়ালি একটি সতর্কতা দেখাতে হবে।
আবদুল্লাহ উমার

0

প্রথমে তথ্য.পিস্টে এনএসকামেরাউসেজ বিবরণ কী উল্লেখ করুন। তারপরে অনুমোদনপ্রাপ্ত হলে AVAuthorizationStatus চেক করুন UIImagePickerController উপস্থাপন করুন। এটা কাজ করবে।


-4

সুইফট: এভিফাউন্ডেশন ব্যবহার করে

  1. লক্ষ্যগুলিতে AVFoundation যুক্ত করুন -> পর্যায়গুলি তৈরি করুন -> গ্রন্থাগারগুলির সাথে বাইনারি লিঙ্ক করুন।
  2. ভিউকন্ট্রোলারে এভিফাউন্ডেশন আমদানি করুন।
  3. ইনফো.প্লিস্টে, নিম্নলিখিতগুলি যুক্ত করুন:

এখানে চিত্র বর্ণনা লিখুন

  1. দেখুন নিয়ন্ত্রণকারী:

@ আইবিএ ফান ক্যামেরা বাটন ক্লিক করেছে

let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
print(authorizationStatus.rawValue)

if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) ==  AVAuthorizationStatus.Authorized{
    self.openCameraAfterAccessGrantedByUser()
}
else
{
    print("No Access")

    dispatch_async(dispatch_get_main_queue()) { [unowned self] in
        AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted :Bool) -> Void in
            if granted == true
            {
                // User granted
                self.openCameraAfterAccessGrantedByUser()
            }
            else
            {
                // User Rejected
                  alertToEncourageCameraAccessWhenApplicationStarts()
            }
        });
    }
}


//Open camera

    func openCameraAfterAccessGrantedByUser()
    {
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){
        self.cameraAndGalleryPicker!.sourceType = UIImagePickerControllerSourceType.Camera
        cameraAndGalleryPicker?.delegate = self
        cameraAndGalleryPicker?.allowsEditing =  false
        cameraAndGalleryPicker!.cameraCaptureMode = .Photo
        cameraAndGalleryPicker!.modalPresentationStyle = .FullScreen
        presentViewController(self.cameraAndGalleryPicker!, animated: true, completion: nil)
    }
    else
    {

    }
}

//Show Camera Unavailable Alert

func alertToEncourageCameraAccessWhenApplicationStarts()
    {
        //Camera not available - Alert
        let cameraUnavailableAlertController = UIAlertController (title: "Camera Unavailable", message: "Please check to see if it is disconnected or in use by another application", preferredStyle: .Alert)

let settingsAction = UIAlertAction(title: "Settings", style: .Destructive) { (_) -> Void in
    let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
    if let url = settingsUrl {
        dispatch_async(dispatch_get_main_queue()) {
            UIApplication.sharedApplication().openURL(url)
        }

    }
}
let cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
cameraUnavailableAlertController .addAction(settingsAction)
cameraUnavailableAlertController .addAction(cancelAction)
self.window?.rootViewController!.presentViewController(cameraUnavailableAlertController , animated: true, completion: nil)
}

তথ্য.প্লেস্ট এন্ট্রিগুলির সাথে কী আছে? উৎস?
বিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.