O técnico chega no cliente, abre o celular, vê o caso, tira foto do defeito, capta a localização GPS, assina digitalmente o laudo e sincroniza com o Dynamics — tudo sem abrir o laptop. Esta lição reúne os recursos nativos de mobile do Power Apps para um app de campo completo.
Ao final, você terá um app mobile com câmera para fotos do defeito, captura de GPS, assinatura digital e salvamento de todos os dados no Dataverse como anotações vinculadas ao caso — funcionando no iOS e Android.
Captura imagem direto da câmera do celular. Salva como anexo no caso do Dynamics.
Captura latitude/longitude no momento do atendimento. Registra local do serviço no caso.
Campo de assinatura touch. Salva como imagem PNG no Dataverse vinculada ao caso.
Salva em coleção local quando sem sinal. Sincroniza quando a conexão volta.
Insert → Media → CameracamFotoAdicione um botão para capturar:
Collect(colFotos, {foto: camFoto.Photo, timestamp: Now()})Adicione uma gallery abaixo para mostrar as fotos tiradas:
colFotosThisItem.fotoPhoto do componente Camera retorna a última foto tirada como uma imagem base64. Cada clique no botão Fotografar adiciona à coleção — o técnico pode tirar múltiplas fotos do defeito.Insert → Icons → Location (ou um Button)Set(varLocalizacao, {lat: Location.Latitude, lon: Location.Longitude, precisao: Location.Altitude})Exiba as coordenadas na tela:
"📍 " & Text(varLocalizacao.lat, "0.000000") & ", " & Text(varLocalizacao.lon, "0.000000")Location.Latitude retorna 0. Verifique com If(Location.Latitude = 0, "Sem localização", ...)) para dar feedback adequado.Insert → Input → Pen inputpenAssinaturaDrawOnSelect: Reset(penAssinatura)// 1. Atualizar o caso com localização e resolução
Patch(
Cases,
LookUp(Cases, caseid = SelectedCase.caseid),
{
description: txtLaudo.Text & " | GPS: " & Text(varLocalizacao.lat) & "," & Text(varLocalizacao.lon),
statecode: 1,
statuscode: 5
}
);
// 2. Salvar assinatura como nota
Patch(
Annotations,
Defaults(Annotations),
{
subject: "Assinatura do cliente — " & Text(Now()),
documentbody: penAssinatura.Image,
mimetype: "image/png",
objectid_incident: {caseid: SelectedCase.caseid}
}
);
// 3. Salvar cada foto como nota
ForAll(
colFotos,
Patch(
Annotations,
Defaults(Annotations),
{
subject: "Foto do defeito — " & Text(timestamp),
documentbody: foto,
mimetype: "image/jpeg",
objectid_incident: {caseid: SelectedCase.caseid}
}
)
);
Notify("Atendimento finalizado e sincronizado!", NotificationType.Success);
Navigate(ListaScreen, ScreenTransition.UnCover)Connection.Connected — Boolean, true se tem internetIf(
Connection.Connected,
// Online: salva direto no Dataverse
Patch(Cases, LookUp(Cases, caseid = SelectedCase.caseid), {...}),
// Offline: salva em coleção local para sincronizar depois
Collect(colPendentesSync, {caso: SelectedCase, laudo: txtLaudo.Text, fotos: colFotos, assinatura: penAssinatura.Image, timestamp: Now()});
Notify("Sem conexão — atendimento salvo localmente para sincronização", NotificationType.Warning)
)Visible: Connection.Connected && CountRows(colPendentesSync) > 0ForAll(colPendentesSync, Patch(Cases, ...));
Clear(colPendentesSync);
Notify(Text(CountRows(colPendentesSync)) & " atendimentos sincronizados!")Para distribuir o app para todos os técnicos sem precisar que cada um acesse o link e instale manualmente, use o Microsoft Intune (gerenciamento de dispositivos móveis). O Power Apps tem integração nativa com Intune: você publica o app para grupos de usuários e ele aparece automaticamente no portal do Intune em cada celular gerenciado pela empresa.
Este é o padrão para implementações enterprise — sem distribuição manual por link, sem dependência do técnico saber instalar o app.
Você passou por Canvas App, Patch(), Edit Form, variáveis e coleções, componentes reutilizáveis e um app de campo completo com câmera, GPS, assinatura e offline. O Módulo 5 começa na Lição 33 com Power BI conectado ao Dynamics.