Ir para o conteúdo

Usar a câmera

Quase todos os dispositivos de computação modernos têm algum tipo de câmera. Neste tutorial, vamos escrever uma nova aplicação capaz de solicitar acesso a essa câmera, tirar uma fotografia, e depois mostrar essa fotografia na nova aplicação que usa a câmera do dispositivo.

Este tutorial não vai funcionar em todas as plataformas!

Infelizmente, no momento, este tutorial só funciona no macOS e no Android.

Embora todos os iPhones tenham câmeras, o Simulador de iOS não tem uma câmera funcional. Os dispositivos Windows e Linux também têm câmeras, mas atualmente o Toga não tem a capacidade de aceder à câmera nessas plataformas.

O código apresentado aqui vai correr no Windows ou no Linux, mas vai apresentar um erro quando tentar tirar uma foto.

O código vai funcionar se for executado num dispositivo iOS real, mas não conseguirá tirar uma foto se for implementado no simulador do iOS.

Iniciar um novo projeto

Para este tutorial, não vamos desenvolver a aplicação a partir do tutorial principal - vamos iniciar um novo projeto. 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] Nova aplicação 'Hello Camera' gerada

Para executar sua aplicação, escreva:

 $ 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 da nova aplicação para que 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(
            "Tirar foto",
            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 não!",
                    "A API de Camera não está implementada nesta plataforma",
                )
            )
        except PermissionError:
            await self.main_window.dialog(
                toga.InfoDialog(
                    "Oh não!",
                    "Não tem permissão de tirar fotos",
                )
            )


def main():
    return HelloCamera()

Esse código tem duas alterações em relação á aplicação predefinida que é gerada pelo Briefcase. Essas adições estão destacadas em cima:

  1. O primeiro bloco de código destacado (no método startup()) adiciona os dois widgets necessários para controlar a câmera: uma Vista e Imagem para mostrar uma foto e um Botão para acionar a câmera.
  2. 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 a aplicação 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 de await; enquanto a aplicação está à espera que o utiliador confirme as permissões ou tire a foto, o ciclo de eventos da aplicação pode continuar em segundo plano.

Se a câmera tirar uma foto com sucesso, ela vai retornar um objeto Image que pode ser atribuído como conteúdo do ImageView. Se o pedido de foto tiver sido cancelado pelo utilizador, a chamada self.camera.take_photo() vai retornar None e o resultado pode ser ignorado. Se o utilizador 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 será mostrada uma caixa de diálogo ao utilizador.

Adicionar permissões de dispositivo

Parte deste código que acabamos de adicionar pede permissão para usar a câmera. Esta é uma funcionalidade comum das plataformas de aplicações modernas - não pode aceder a recursos de hardware sem antes solicitar explicitamente a permissão do utilizador.

No entanto, essa solicitação vem em duas partes. A primeira está no código que acabamos de ver; mas antes que a aplicação possa solicitar permissões, ela 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 secção de configuração [tool.briefcase.app.hellocamera] do ficheiro pyproject.toml da sua aplicação, adicione o seguinte (logo por cima da declaração sources):

permission.camera = "A aplicação vai tirar fotos de rostos."

Isso declara que a sua aplicação precisa aceder à 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á mostrada ao utilizador como informação adicional quando o diálogo de permissão for apresentado.

Agora podemos gerar e executar a aplicação:

(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 a aplicação for executada, vai ver um botão. Pressione o botão, e a caixa de diálogo da câmera predefinida da plataforma será exibida. Tire uma foto; o diálogo da câmera vai desaparecer e a foto será exibida na aplicação, logo por cima do botão. Poderá depois tirar outra foto, que vai substituir a primeira.

Adicionar mais permissões

As permissões são declaradas nos ficheiros que são gerados durante a chamada original para briefcase create. Infelizmente, o Briefcase não pode atualizar esses ficheiros se eles já tiverem sido gerados inicialmente; portanto, se você quiser adicionar uma nova permissão à sua aplicação ou modificar as permissões existentes, será necessário recriar a aplicação. Pode fazer isso executando novamente o briefcase create; isto vai avisa-lo se a aplicação existente var ser sobrescrita e, em seguida, gerar novamente a aplicação com as novas permissões.