Usando a câmera¶
Quase todos os dispositivos de computação modernos têm algum tipo de câmera. Neste tutorial, escreveremos um novo aplicativo capaz de solicitar acesso a essa câmera, tirar uma fotografia e, em seguida, exibir essa fotografia no novo aplicativo que usa a câmera do dispositivo.
Este tutorial não funcionará em todas as plataformas!
Infelizmente, no momento, este tutorial só funcionará no macOS e no Android.
Embora todos os iPhones tenham câmeras, o iOS Simulator não tem uma câmera funcional. Os dispositivos Windows e Linux também têm câmeras, mas o Toga não tem a capacidade de acessar a câmera nessas plataformas no momento.
O código apresentado aqui será executado no Windows ou no Linux, mas apresentará um erro quando você tentar tirar uma foto.
O código funcionará se for executado em um dispositivo iOS real, mas não conseguirá tirar uma foto se for implantado no simulador do iOS.
Iniciar um novo projeto¶
Para este tutorial, não vamos desenvolver o aplicativo a partir do tutorial
principal - vamos iniciar um novo projeto. Você pode usar o mesmo ambiente
virtual que usou no primeiro projeto, mas precisamos executar novamente o
assistente briefcase new.
Volte para o diretório que contém a pasta do projeto helloworld e inicie um
novo projeto chamado "Hello Camera":
(beeware-venv) $ cd ..
(beeware-venv) $ briefcase new
...
[hellocamera] Generated new application 'Hello Camera'
To run your application, type:
$ cd hellocamera
$ briefcase dev
(beeware-venv) $ cd hellocamera
Adicionar código para tirar uma foto¶
O assistente gerou um novo projeto Toga vazio. Agora podemos adicionar o código
para tirar e exibir uma fotografia. Edite o app.py do novo aplicativo para que
ele tenha o seguinte conteúdo:
import toga
from toga.style.pack import COLUMN, ROW
class HelloCamera(toga.App):
def startup(self):
main_box = toga.Box()
self.photo = toga.ImageView(height=300, margin=5)
camera_button = toga.Button(
"Take photo",
on_press=self.take_photo,
margin=5,
)
main_box.add(self.photo)
main_box.add(camera_button)
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
async def take_photo(self, widget, **kwargs):
try:
if not self.camera.has_permission:
await self.camera.request_permission()
image = await self.camera.take_photo()
if image:
self.photo.image = image
except NotImplementedError:
await self.main_window.dialog(
toga.InfoDialog(
"Oh no!",
"The Camera API is not implemented on this platform",
)
)
except PermissionError:
await self.main_window.dialog(
toga.InfoDialog(
"Oh no!",
"You have not granted permission to take photos",
)
)
def main():
return HelloCamera()
Esse código tem duas alterações em relação ao aplicativo padrão que é gerado pelo Briefcase. Essas adições estão destacadas acima:
- O primeiro bloco de código destacado (no método
startup()) adiciona os dois widgets necessários para controlar a câmera: umImageViewpara exibir uma foto e umButtonpara acionar a câmera. - O segundo bloco de código destacado (o método
take_photo()) define o manipulador de eventos quando o botão é pressionado. Esse manipulador primeiro confirma se o aplicativo tem permissão para tirar uma foto; se não houver permissão, ela será solicitada. Em seguida, a foto é tirada. A solicitação de permissão e a solicitação para tirar uma foto são solicitações assíncronas e, portanto, exigem o uso deawait; enquanto o aplicativo estiver aguardando que o usuário confirme as permissões ou tire a foto, o loop de eventos do aplicativo poderá continuar em segundo plano.
Se a câmera tirar uma foto com êxito, ela retornará um objeto Image que pode
ser atribuído como conteúdo do ImageView. Se a solicitação de foto tiver sido
cancelada pelo usuário, a chamada self.camera.take_photo() retornará None e
o resultado poderá ser ignorado. Se o usuário não conceder permissão para usar a
câmera ou se a câmera não estiver implementada na plataforma atual, será gerado
um erro e uma caixa de diálogo será exibida para o usuário.
Adição de permissões de dispositivo¶
Parte do código que acabamos de adicionar pede permissão para usar a câmera. Esse é um recurso comum das plataformas de aplicativos modernas: não é possível acessar recursos de hardware sem antes solicitar explicitamente a permissão do usuário.
No entanto, essa solicitação vem em duas partes. A primeira está no código que acabamos de ver; mas antes que o aplicativo possa solicitar permissões, ele precisa declarar as permissões que vai solicitar.
As permissões exigidas por cada plataforma são ligeiramente diferentes, mas o
Briefcase tem uma representação entre plataformas para muitas permissões comuns
de hardware. Na seção de configuração [tool.briefcase.app.hellocamera] do
arquivo pyproject.toml do seu aplicativo, adicione o seguinte (logo acima da
declaração sources):
permission.camera = "App will take mugshots."
Isso declara que o seu aplicativo precisa acessar a câmera e fornece uma breve descrição do motivo pelo qual a câmera é necessária. Essa descrição é necessária em algumas plataformas (principalmente macOS e iOS) e será exibida para o usuário como uma informação adicional quando a caixa de diálogo de permissão for apresentada.
Agora podemos gerar e executar o aplicativo:
(beeware-venv) $ briefcase create
(beeware-venv) $ briefcase build
(beeware-venv) $ briefcase run
(beeware-venv) $ briefcase create android
(beeware-venv) $ briefcase build android
(beeware-venv) $ briefcase run android
Quando o aplicativo for executado, você verá um botão. Pressione o botão, e a caixa de diálogo da câmera padrão da plataforma será exibida. Tire uma foto; a caixa de diálogo da câmera desaparecerá e a foto será exibida no aplicativo, logo acima do botão. Em seguida, você poderá tirar outra foto, que substituirá a primeira.
Adição de mais permissões¶
As permissões são declaradas nos arquivos que são gerados durante a chamada
original para briefcase create. Infelizmente, o Briefcase não pode atualizar
esses arquivos uma vez que eles tenham sido gerados inicialmente; portanto, se
você quiser adicionar uma nova permissão ao seu aplicativo ou modificar as
permissões existentes, será necessário recriar o aplicativo. Você pode fazer
isso executando novamente o briefcase create; isso o avisará que o aplicativo
existente será sobrescrito e, em seguida, gerará novamente o aplicativo com as
novas permissões.