Estou desenvolvendo um aplicativo de vídeo muito simples. Eu uso o controle oficial: UIImagePickerController.
Aqui está o problema. Ao apresentar o UIImagePickerController pela primeira vez, o iOS solicitará a permissão. O usuário pode clicar em sim ou não. Se o usuário clicar em não, o controle não será descartado. Em vez disso, se o usuário continuar clicando no botão Iniciar, os cronômetros continuarão enquanto a tela estiver sempre preta e o usuário não poderá parar os cronômetros ou voltar. A única coisa que o usuário pode fazer é matar o aplicativo. Na próxima vez que o UIImagePickerController for apresentado, ele ainda será uma tela preta e o usuário não poderá voltar se clicar em iniciar.
Eu queria saber se é um bug. Existe alguma maneira de detectar a permissão da câmera para decidirmos mostrar o UIImagePickerController ou não?
fonte
UIImageViewController
é anotado como sendo adicionado no iOS 2.0 e os documentos nunca anotados para refletir que o AVAuthorizationStatus deve ser usado, mas reside em outra estrutura.Respostas:
Verifique
AVAuthorizationStatus
e manuseie os casos corretamente.fonte
#import <AVFoundation/AVFoundation.h>
ou similarBundle ID
o aplicativo toda vez que eu quiser testar isso. Uma dor no bumbum, mas alguma coisa, pelo menos. Lembre-se de definir o ID de volta quando tiver terminado ;-) #Swift 4 e mais recente
Tenha certeza de:
O código abaixo verifica todos os possíveis estados de permissão:
Desde o iOS 10, você precisa especificar a
NSCameraUsageDescription
chave no seu Info.plist para poder solicitar acesso à câmera, caso contrário, seu aplicativo falhará em tempo de execução. Consulte APIs que exigem descrições de uso .Como uma observação interessante, você sabia que o iOS mata o aplicativo se ele estiver sendo executado enquanto você altera as permissões da câmera em Configurações?
No fórum do desenvolvedor da Apple:
fonte
Solução Swift
E então, para usá-lo, você faz
fonte
Como complemento à resposta do @Raptor, o seguinte deve ser mencionado. Você pode receber o seguinte erro começando no iOS 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.
Para corrigir isso, lembre-se de lidar com os resultados do thread principal da seguinte maneira (Swift 3):
fonte
Especifique a chave NSCameraUsageDescription no Info.plist primeiro. Em seguida, verifique AVAuthorizationStatus se autorizado e apresente o UIImagePickerController. Vai funcionar.
fonte
Swift: Usando AVFoundation
@IBAction func cameraButtonClicked (remetente: AnyObject) {
fonte