Pesquisar este blog

sábado, 25 de fevereiro de 2017

Coletar Dados Php - Resultado da Mega Sena



Sejam bem vindos.

Esta é uma série de vídeos que mostra como coletar dados, com a devida autorização, de sites na web utilizando um servidor php. O exemplo utilizado coleta o último resultado da Mega Sena no site da Caixa Economica Federal. São utilizados alguns conceitos aplicados na engenharia de software para incentivar as boas práticas de desenvolvimento aos interessados.

As informações aqui apresentadas são para fins didáticos e não nos responsabilizamos pela sua má utilização, entendendo que cada usuário é responsável por seus atos perante a Lei.

No primeiro é mostrado o projeto a ser executado . No use case o ator é o servidor que acessa a pagina web indicada e coleta  os dados  para exibí-los ao usuário. O fluxograma inicia quando o servidor acessa o endereço web solicitado e coleta os dados existentes, caso encontre alguma dificuldade para executar a tarefa um log será mostrado contendo o respectivo erro finalizando o processo. Em caso de sucesso os dados coletados serão processados para a retirada da informação proposta, o resultado da mega sena, na sequência essa informação é mostrada ao usuário finalizando com sucesso o fluxo. Por se tratar de um exemplo didático simples, onde não são utilizadas as orientações a objetos nem a eventos não será mostrado o diagrama de classes como de costume em nossas séries.

Para facilitar um arquivo contendo todo o conteúdo aqui mostrado está disponível para donwload no artigo referente aos vídeos da série no blog CustomerSys, com o link na descrição.

No segundo é mostrado como criar os arquivos php que irão receber a estrutura de programação necessária para a execução do projeto aqui proposto.

Para que se possa efetivamente observar os resultados é necessário que se tenha um servidor devidamente instalado na sua máquina e que ele contenha o php. Caso isso não ocorra é necessário que se providencie a instalação. Outro ponto importante é o editor, existem vários muito bons e cada um é livre para escolher o que melhor lhe convier, o que está sendo utilizado para a criação deste projeto é o bluefish.

São necessários dois arquivos para acomodar a programação envolvida. O primeiro trata de receber a solicitação da informação, ou seja, o resultado propriamente dito e o segundo é onde são mantidas todas as funções necessárias para executar o processo.

A primeira ação é testar se o servidor está funcionando corretamente, para isso é feita a chamada do arquivo criado "coletaDadoSite.php" por meio de um browser onde é digitado o endereço. Se tudo estiver funcionando corretamente a mensagem "Servidor Ativo" deve aparecer na tela. A segunda ação é a inclusão do arquivo "funcoesColeta.php" por meio da função require(); Caso tudo esteja certo a mensagem "Funções Para Coletar Dados Ativadas" deverá ser adicionada na tela.

Feito isso, a estrutura necessária para a execução do projeto foi criada.

No terceiro vídeo é mostrado como configurar corretamente uma função php para que ela faça a coleta de dados em sites da web. 

A primeira ação desta fase do projeto é a criação da função getPage($url); ela tem como parâmetro a variável $url e a sua correta configuração vai permitir retornar com todo o conteúdo html contido na página alvo. Logo em sequida é necessário a criação das variáveis $timeOut, $dir, $cookie_File e $ch, elas são necessárias para a correta configuração da função.

A biblioteca php responsável pela ação específica de coletar os dados é a curl, existem outras mas essa é a mais recomendada, essa biblioteca precisa estar instalada no php, caso não esteja é necessário configurar o arquivo php.ini. A primeira ação é inicializá-la por meio da variável $ch=curl_init($url); informando a url que é exigida no parâmetro e, naturalmente tudo que começa precisa terminar utilizando curl_close($ch); A partir daí é necessário a configuração de alguns elementos por meio de curl_setop(); conforme segue:

O primeiro é curl_setopt($ch, CURLOPT_FAILONERROR, true);  Verdadeiro para falhar silenciosamente se o código HTTP retornado for maior ou igual a 400. O comportamento padrão é retornar a página normalmente, ignorando o código.

O segundo é  curl_setopt($ch, CURLOPT_HEADER, 0);  Verdadeiro para incluir o cabeçalho na saída.

O terceiro é curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); O nome do arquivo que contém os dados do cookie. O arquivo de cookie pode estar em formato Netscape, ou simplesmente cabeçalhos de estilo HTTP despejados em um arquivo. Se o nome for uma string vazia, nenhum cookie será carregado, mas o manuseio de cookie ainda estará ativado.

O quarto é curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); O nome de um arquivo para salvar todos os cookies internos quando o identificador é fechado, após uma chamada para curl_close.

O quinto é curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); Verdadeirp para seguir qualquer cabeçalho "Location:" que o servidor envia como parte do cabeçalho HTTP (observe que este elemento é recursivo, PHP seguirá como muitos cabeçalhos "Location:" que são enviados, a menos que  CURLOPT_MAXREDIRS esteja definido).

O sexto é curl_setopt($ch, CURLOPT_ENCODING, "" ); O conteúdo do cabeçalho "Accept-Encoding:". Isto permite a descodificação da resposta. As codificações suportadas são  "identity", "deflate", and "gzip". Se uma string vazia, "", for definida, um cabeçalho contendo todos os tipos de codificação suportados será enviado.

O sétimo é curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); Verdadeiro para retornar a transferência como uma seqüência de caracteres do valor de retorno de curl_exec () em vez de sair diretamente. 

O oitavo é curl_setopt($ch, CURLOPT_AUTOREFERER, true ); Verdadeiro para definir automaticamente o Referer: campo em pedidos onde segue um Location: redirect.

O nono é curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout ); O número de segundos a aguardar ao tentar se conectar. Use 0 para aguardar indefinidamente.

O décimo é curl_setopt($ch, CURLOPT_TIMEOUT, $timeout ); O número máximo de segundos para permitir que as funções cURL sejam executadas.

O décimo primeiro é curl_setopt($ch, CURLOPT_MAXREDIRS, 10 ); A quantidade máxima de redirecionamentos de HTTP a seguir. Use essa opção ao lado de CURLOPT_FOLLOWLOCATION.

O último é curl_setopt($ch, CURLOPT_REFERER, 'http://www.loterias.caixa.gov.br'); O conteúdo do cabeçalho "Referer:" a ser usado em uma solicitação HTTP.

Essas são algumas das possibilidades de configuração, dentro da documentação oficial disponível no site do php, existem várias outras que podem e devem ser estudadas para serem aplicadas conforme a necessidade de cada projeto. Após terminadas as configurações é preciso executar as ações e manter a resposta em uma variável $pagina. Neste ponto é criado uma condição para que em caso de erro esse seja exibido, contemplando assim, um dos possíveis fluxos vistos no fluxograma do projeto. Em caso de sucesso o caminho feliz é utilizado e todo o conteúdo coletado é retornado.

No último vídeo é mostrado como trabalhar um conteúdo coletado no site da Caixa Econômica Federal, por meio da função getPage($url); construída anteriormente no projeto, para filtrar e apresentar na tela somente as informações relativas ao resultado da mega sena.

A primeira ação nesta fase de execução do projeto é a criação da variável $url contendo o endereço no qual se pretende coletar os dados, neste caso está sendo utilizado a landing page que contém o resultado da mega sena disponibilizado pela Caixa Economica Federal e de livre acesso, não sendo necessário nenhum tipo de autorização. Lembrando novamente a importância da autorização de acesso para conteúdos privados. Após o carregamento do endereço na variável $url é necessário a chamada da função getPage($url); passando-a como parâmetro o retorno será carregado na variável $pagina e posteriormente impresso na tela. Em caso positivo todo o conteúdo html do endereço solicitado é apresentado na tela, um detalhe interessante é que os links são mantidos e em caso de clique haverá o direcionamento. Também é importante ressaltar a operação hora com o servidor da Caixa, hora com o Localhost consultado a landing page da caixa.

O próximo passo é a identificação, dentro do código fonte da página, do trecho que apresenta as informações pertinentes ao resultado da mega sena. Neste ponto é muito importante o entendimento sobre strings pois, todo o conteúdo html foi carregado na variável página com tipo string sendo assim, serão utlilizados alguns recursos pertinentes. Primeiro para o mapeamento do trecho em seguida para capturá-lo. A partir de agora não será mais necessário a impressão da variável $pagina pois, será construída a função responsável para a captura do trecho contendo o resultado e que daqui para frente será chamado de subString. Após identificada a string inicial do trecho é necessário carregar essa informação em uma variável $stringInicial.  Em seguida é preciso encontrar o final do trecho com todas as informações sobre o resultado da mega e carregá-lo em uma variável $stringFinal. 

Agora todos os parâmetros necessários para a construção da função getResultado já estão disponíveis e o próximo passo é a criação dela solicitando os três parâmetros criados $pagina, $stringInicial, $stringFinal. Em seguida será feita a chamada da função getResultado que irá carregar a variável $resultado. É muito importante, para quem desenvolve, ir testando o código passo-a-passo para se certificar que está tudo certo, existem pequenos detalhes pertinente as linguagens que geralmente passam desapercebidos como uma aspa, um ponto vírgula, entre outros, nesse caso foi um sinal de igual que impediu o correto funcionamento da função. Se tudo correr bem será impresso na tela que a "Função Resultado Entrou" e é possível continuar com o desenvolvimento.

Agora serão criadas as variáveis responsáveis pelo mapeamento do trecho que contém o resultado e para isso é utilizada a função nativa do php strpos($pagina, $stringInicial); com ela é possível achar o ponto inicial do trecho e carregar uma variável com o tipo int $inicio. Haystack significa palheiro e Needle significa agulha, ou seja, procurando agulha em um palheiro. O parâmetro offset não será utilizado nesse projeto. Novamente, será utilizada a função nativa do pho strpos($pagina, $stringFinal); para mapear o final do trecho desejado. Na sequência é criada uma variável $comprimento para que nela seja carregado o tamanho da subString desejada por meio de uma subtração $fim-$inicio.

A partir de agora todos os parâmetros necessários para a captura da subString já estão disponíveis. Essa ação é possível por meio da função nativa php substr($pagina, $inicio, $comprimento); onde $pagina contém todo o conteúdo do endereço solicitado, $início é a posição inicial da subString em inteiro e $comprimento é o tamanho desejado da subString. Essa informação é carregada em uma variável $resultado que é retornada. Sendo assim a função getResultado está concluída. Como a chamada da função getResultado($pagina, $stringInicial, $stringFinal); já foi criada no arquivo "coletaDadoSite.php", o sistema está pronto para imprimir na tela somente as informações relativas ao resultado da mega sena, deixando todo o restante de lado. 

Sendo assim, é possivel observar que a impressão inicia na $stringInicial e termina na $stringFinal. Naturalmente, é possível continuar a formatação desta saída de dados deixando-a com um visual mais amigável ficando isso a critério de cada um, o objetivo do projeto era a coleta do resultado da mega sena e esse foi concluído com sucesso.

Terminamos então, mais uma jornada em busca do conhecimento. Para você que nos acompanhou até aqui um Muito Obrigado!

Fica a dica, se gostou de um like e inscreva-se no canal para nos ajudar a continuar trabalhando. Até a próxima! 

terça-feira, 21 de fevereiro de 2017

Planejamento Estratégico



Este é um vídeo no qual são mostradas algumas dicas para a montagem de um bom planejamento estratégico para a sua empresa ou projeto e como o planejamento pessoal muitas vezes vem ao encontro misturando-se, sendo necessário então, encontrar o equilíbrio entre as duas atividades. 

Para muitos planejamento estratégico causa incômodo mas, para a construção de um bom são necessários passos simples e possíveis de serem feitos por qualquer empresa ou pessoa, já que é possível planejar quando se casar ou comprar um carro por exemplo, assim como, aumentar as vendas ou abrir uma filial, melhorando a visão de futuro, proporcionando crescimento estruturado e correto.

Para se conseguir chegar em algum lugar primeiro é necessário saber onde ele fica. Sem um norte a possibilidade de chegar em algum lugar não esperado e com surpresas desagradáveis aumenta. Qualquer pessoa ou empresa pode se beneficiar de um bom planejamento para alcançar metas.

Sendo assim, é necessário olhar para o futuro e mapear essas mudanças no presente. Lembrando que a missão ou propósito deve ser levado em consideração sempre. Para ajudar na criação de uma missão ou de um propósito ou saber se esta indo pelo caminho certo é possível utilizar uma ferramenta simples respondendo a 2 perguntas: 

1. Se sua empresa fosse uma pessoa, por quais atitudes ela deveria ser conhecida, lembrada e admirada?

2. Essa lista de atitudes poderia servir como a lista de valores do seu negócio? Se não, refaça a lista de atitudes.

Se você ainda não definiu a missão e valores da sua empresa ou o seu propósito pessoal, esta ferramenta vai ajudá-lo a ter um norte melhor definido.


Planejamento da Empresa x Planejamento Pessoal


Na maioria dos casos as pessoas se confundem com os seus negócios utilizando dinheiro da empresa para pagamento de contas pessoais por exemplo. Agir desta forma simplesmente vai condenar o negócio ao fracasso. Outro ponto importante é o do propósito pessoal confrontado com a missão da empresa como aquele indivíduo que tem como propósito pessoal a defesa dos animais mas, empreende em um matadouro onde a missão é servir a carne mais saborosa. A existência deste conflito também pode condenar o seu negócio ao fracasso. Outros aspectos como a jornada semanal e a procura de sócios devem ser levados em consideração.

Ter estes pontos claros facilita a criação de um panorama geral pois, é muito importante conhecer os pontos em comum ou onde eles se cruzam como por exemplo um casamento marcado justamente na época em que se faz necessário a abertura de uma filial. São acontecimentos favoráveis mas, será possível conciliar os dois?

Alguns pontos que podem ajudar na hora de elaborar um planejamento. 

- Ter consciência das suas forças e fraquezas

- Analisar as oportunidades e ameaças

- Estabelecer uma visão a longo prazo — aonde você quer chegar

- Metas da 10, 5 e 01 ano

- Planejamento anual, com revisão semestral ou bimestral

Achar que o planejamento deve ser executado somente em épocas específicas como por exemplo em julho e dezembro é outro erro comum pois, a única certeza de que se tem certeza é a mudança. Para minimizar essa variável é possível por em prática o ciclo PDCA ou, plan - planejar, do - fazer ou executar, check - controlar e action - ação corretivas ou preventivas. Principalmente no início os ciclos devem ser observados com maior frequência.

É muito importante que se conheça o ciclo do negócio em questão e para isso é necessário conhecer o negócio a fundo. O mundo corporativo não perdoa amadores, simplesmente os elimina por meio da concorrência. Ao perceber dificuldade no mapeamento do ciclo é muito interessante procurar ajuda de profissionais.

A partir deste ponto é necessário a definição dos tomadores de decisão, para que todos possam refletir a respeito e que cada um elabore uma lista com as metas desejadas para o futuro, em seguida, uma reunião para que todas a metas desejadas sejam compartilhadas e que todos os pontos de vista sejam observados, mesmo que para isso se faça necessário uma pessoa na figura de mediador garantindo o bom andamento dos trabalhos.

Após entendido o ciclo do negócio e definidas as metas desejadas é hora de estudar quais os motivos que são impedimentos para que as metas possam ser alcançadas. Lembrando que discursos como "falta isso" ou "falta aquilo" podem fazer o cérebro dos envolvidos no processo entender que não precisa fazer nada a respeito sendo exatamente ao contrário, o cenário sempre pode ser mudado.

A técnica do "porquê" é eficiente para um melhor entendimento dos reais motivos que impedem determinada ação de ser realizada, por exemplo.

Não temos dinheiro. Por quê?

Gastamos muito no últimos mês. Por quê?

Não temos controle do caixa. Por quê?

Não utilizamos uma planilha eficiente.

Após todos os empedimentos serem devidamente mapeados é hora de agir para corrigí-los. Lembrando que é necessário determinar a ação por colaborador e não por grupos como o setor do almoxarifado. O Carlos do almoxarifado vai fazer isso até a data X com o recurso Y. Isso vai gatantir que as ações tenham responsáveis e que estejam sempre sendo monitoradas.

Assim como, é possível aplicar a ferramenta do PDCA para se definir o ciclo do negócio e efetuar ajustes em determinados períodos, para tarefas internas com ciclos menores também é aconselhado pois, desta forma, além de um acompanhamento eficiente é possível a criação de um banco de dados que podem ser posteriormente transformado em informação para tomadas de decisões mais rápidas o que é comumente chamado de BI ou business inteligence. Lembrando que as metas devem ser claras para que se possa ter objetividade na definição delas serem ou não cumpridas. Para isso é interessante a criação de métricas como por exemplo o aumento das vendas em x por cento no período de 90 dias. A diminuição do consumo de energia elétrica em y por cento.

A disciplina é a chave do sucesso, a missão da empresa precisa estar alinhada com os propósitos pessoais, as metas precisam ser paupáveis, a comunicação entre as partes interessadas deve ser constante e em caso de dúvida o simples, o objetivo e o direto são as melhores escolhas.

Fonte: Sebrae - Endeavour

sábado, 11 de fevereiro de 2017

Curso Geolocalização Android Studio (Com Material de Apoio)


Olá, sejam bem vindos!

Está é uma série de vídeos, em formato de curso on-line e com material de apoio disponível para baixar no final do artigo, que mostra como receber a latitude e a longitude, que compõe a coordenada geográfica, referente a localização do dispositivo Android que envia a solicitação aos servidores do Google. São utilizados alguns conceitos de engenharia de sofware, no que diz respeito a parte de projetos, para que exista ambientação das boas práticas por aqueles que buscam a informação aqui contida.

No primeiro, são apresentados o use case, o fluxograma e o diagrama de classes que serão utilizados no decorrer da série.

No use case o usuário solicita a sua posição, latitude e longitude, ao servidor. É possível visualizar o fluxo dos dados por meio do fluxograma, onde a ação inicia ao se solicitar as coordenadas, logo em seguida o sistema verifica se existe a permissão para esse tipo de operação, que é classificada de risco pelo Android, em caso negativo o fluxo é encerrado, se a permissão for positiva, é feita a verificação da condição do Gps do dispositivo, se estiver inativo é informado um Log de erro e o fluxo é encerrado, estando ativo o servidor envia a posição e está é informada para o usuário, finalizando o processo. Para finalizar a parte teórica desta série é apresentado o diagrama de classes que contém somente uma classe denominada receberCoordenadas a qual possue dois atributos base, double latitude e double longitude, e também o método lerCoordenadas().

No segundo, é mostrado como configurar um projeto Android Studio para poder operar em conjunto com o Google Maps API, por meio de uma chave de acesso. O projeto é criado na IDE Android Studio e denominado ReceberCoordenadas, a menor versão do S/O Android é a 3.0. Ele é iniciado com uma activity em branco onde serão acomodados os componentes necessários para que o objetivo final de receber as coordenadas seja alcançado.

A classe ReceberCoordenadas é criada e a primeira ação a ser feita é a aquisição da chave de acesso no Google Maps API, para isso é necessário ter uma conta. Dentro das páginas da API existe uma documentação que informa com detalhes todas as posibilidades de utilização, inclusive com passo a passo. É necessário seguir os passos e criar uma chave de acesso para que se possa dar continuidade ao trabalho. Após a criação os próximos passos são copiar e informar o seu valor no arquivo manifest do projeto como mostrado a seguir.

Dentro do arquivo manifest são necessárias algumas inclusões, começando com as permissões de acesso, elas se dividem em categorias gerais e de risco, isso porque é importante que o usuário do aplicativo tenha noção do tipo de atividade que está sendo executada, principalmente quando se trata da possibilidade de rastreamento. Sendo assim, é solicitada a permissão geral de acesso a internet e as permissões de risco fine_location e coarse_location. Também é necessário a inclusão da chave de acesso a API Google Maps por meio da tag meta-date, dentro da tag aplication. Ela é composta por nome e valor onde o valor é a chave propriamente dita como pode ser visto.

Outro ponto importante a ser visto para que a aplicação possa funcionar corretamente é a compilação do projeto com o serviço do Google chamado de Google Play Services. Para que isso aconteça é necessário que o SDK tenha feito o donwload deste pacote, caso a sua IDE não o possua é necessário providenciar. Feito isto, na guia de estrutura do projeto, em app nas dependências é possível selecionar quais tipos de serviço devem ser compilados junto com o projeto em si. Especificamente, para esse trabalho é necessário o serviço google-play-service-maps que nessa oportunidade se encontra na versão 10.0.1. Após a IDE Android Studio compilar a solicitação do serviço ela está pronta para a sequência dos trabalhos que é a criaçao da tela para acomodar a estrutura necessária para a conclusão do objetivo de receber as coordenadas de localização do dispositivo.

No terceiro vídeo da série, é mostrado a construção da tela que vai comportar  o mecanismo da aplicação. Após as configurações para que a IDE Android Studio faça a compilação do serviço de mapas do Google, junto com a aplicação propriamente dita, é necessário a construção da tela com todos os componentes para o correto funcionamento. 

A primeira ação a ser executada é modificar o layout da activity de relativo para linear com a orientação vertical. A segunda é, em modo design, inserir um TextView, um Button, outro TextView e um Fragment, nesta ordem. Para o Fragment deve ser selecionado o tipo de serviço que será implementado, neste caso é o SupportMapFragment pois, é nele que será apresentado o google map da aplicação.

É necessário observar que o emulador do Android Studio não suporta mapas por isso, é preciso compilar e rodar o projeto junto a um dispositivo Android conectado ao computador. Para ajudar, este projeto está disponível para donwload com o link do endereço colocado na descrição do vídeo no YouTube e também no blog.

A próxima ação é configurar, em modo text, cada componente da activity. O primeiro TextView com o texto "Receber Coordenadas" e a id titulo, o Button com o texto "Receber Coordenadas" e a id btnReceberCoordenadas, o segundo TextView com o texto em branco pois, é nela que as coordenadas recebidas aparecerão para o usuário e a id receberCoordenadas e finalmente o Fragment com a id mapa.

Sendo assim, o layout da activity está pronto e agora se faz necessário a configuração da classe java para integrá-la. Dentro da classe é necessário declarar, em modo global, os componentes da activity, utilizando de forma padrão o mesmo valor da id para facilitar. Após feita a declaração é necessário integrar a classe ao layout unindo a id do componente junto a variavel global java. Um detalhe importante a ser percebido neste momento é que o fragment mapa não foi declarado, ele será trabalhado em momento oportuno futuramente. A última ação a ser executada nesta parte do processo é ativar o Button criado para que ele receba as operações que compõe o projeto.

Agora o projeto já está configurado para receber o serviço de mapas do Google assim como, a activiry está com o layout pronto e interligado com a classe java.

No quarto vídeo é mostrado como solicitar a permissão do úsuário para que a aplicação possa utilizar os recursos de geolocalização do dispositivo. As permissões são divididas em gerais como a internet por exemplo e de risco como as que possibilitam o rastreamento dos dispositivos, ação essa que pode colocar a vida do usuário em risco se utilizada com intenções criminosas, como um sequestro por exemplo. Por este motivo, os usuários devem ser informados de todas as atividades consideradas de risco pela aplicação e podem permitir ou negar o acesso a essas informaçõe a qualquer momento, ficando a cargo do algoritmo lidar com o fato de que a permissão foi negada.

Para iniciar essa fase serão criadas as variáveis globais, são elas a latitude e a longitude em forma de double e permissão em formato de inteiro. Também será criado o método lerCoordenadas() conforme colocado no diagrama de classes deste projeto. Para o correto funcionamento da aplicação é necessário que a classe ReceberCoordenadas implemente a interface LocationListener para que seja possível a utilização do métodos @overrride nela contidos. Destes métodos somente será utilizado o onLocationChanged() para informar as alterações das coordenadas por tempo ou deslocamento.

A verificação da permissão será feita por meio de um if() onde o ContextCompact compara as solicitadas no arquivo manifest com as  que estão garantidas no PackageManager. Caso sejam diferentes será solicitado ao S/O que informe ao usuário da necessidade de utilização deste recurso, lembrando que não é possível interagir nesse processo pois, ele é exclusivo do Android. A classe responsável por esse pedido é a ActivityCompact por meio do método requestPermission() que deve ser carregado com uma string[] contendo todas as permissões de risco registradas no arquivo manifest para que se faça o pedido apenas uma vez tornando a interação com o usuário, nesse detalhe técnico, mais agradável. Uma observação importante é que as permissões de risco são divididas em blocos, ou seja, fine_location e coarse_location tem a mesma função de geolocalização sendo assim, pedindo a permissão para uma automaticamente o S/O autoriza ou nega para as duas.

O próximo passo é a implementação do método @override onRequestPermissionResult() ele solicita o parâmetro requestCode que nada mais é do que a variável permissao. Ao se analisar a documentação do Android verifica-se que este parâmetro deve conter um valor inteiro maior ou igual a zero 0=>.

Na sequência será criado um swtich() com o parâmetro requestCode e o case: com a variável permissao e no nosso exemplo será utilizado apenas um if() para verificar se a permissão foi consedida pelo usuário e em caso positivo vai executar o método lerCoordenadas(). Como agora existe a permissão a aplicação estará liberada para continuar mas, em caso negativo, conforme mencionado anteriormente, o algoritmo deverá tratar essa possibilidade.

Caso existam mais requisições é possível colocá-las, pois estão em um vetor de strings, em um laço for() e executar uma a uma.

No quinto vídeo da série é mostrado como solicitar a latitude e a longitude, formando assim a coordenada geográfica, junto ao servidor do Google. Nesta etapa a primeira ação é a criação de uma variável global do tipo Location denominada location para que se possa receber as coordenadas do servidor Google.

Em seguida, é necessário a criação de uma variável locationManager para receber o serviço de localização e também uma variável boolean para identificar a condição do gps do dispositivo. Caso o gps do dispositivo esteja habilitado é possível continuar, senão é informado um log contendo a string "Gps Desativado". Neste ponto é possível solicitar ao usuário que o ative. Outro detalhe importante é que é possível operar com gps_provider e também com o network_provider, um trata do gps e o outro trata da rede cada um com as suas características, podendo ser utilizados em conjunto. Para este projeto será utilizado somente o gps_provider por se tratar de um exemplo didático.

Agora se faz necessário examinar a condição da variável location, se ela for nula é preciso carregá-la com uma requisição de atualização da posiçao por meio do gps, recebendo assim a última posição conhecida. Se a condição da variável location for diferente de nula, ou seja, contém informação, está será passada para as variáveis latitude e longitude e informada para o usuário no TextView receberCoordenadas.

Para finalizar o método onLocationChanged() informa por meio de um log cada mudança de posição que foi configurada no locationManager.requestLocationUpdate() em seus parâmetros de tempo, que nesse caso é zero, e de deslocamento, que nesse caso também é zero resultando em notificação a cada deslocamento. É importante ficar atento ao detalhe de consumo da bateria pois, em uma configuração como está o consumo é extremamente alto já que o gps fica ativo de forma contínua. 

Uma observação importante é que se a verificação da condição da variável location ficar em um if()else o Button terá de ser precionado duas vezes para informar a coordenada. Na primeira ele carrega os valores e somente na segunda é que ela estará diferente de nulo e habilitada a carregar as informações. Sendo assim é necessário que a verificação da condição da variável locatio seja feita em dois if(), caso ela seja nula é carregada e na sequência, como não é mais nula informa a coordenada e se não for nula segue o ciclo normalmente.

No último vídeo é apresentado como se inserir um mapa do GoogleMaps em uma activity Android por meio da tag fragment. Nessa etapa do processo é necessária a criação de uma variável mapFragment do tipo SupportMapFragment e a integração da mesma com o componente fragment que esta acomodado na activity, esta integração é feita por meio do método findFragmentById() e a captura do mapa por meio do método getMapAsync().

Para que a aplicação funcione corretamente é necessário que a classe RecebeCoordenadas também implemente a interface onMapReadyCallBack para que se possa utilizar o método @override onMapReady(). É nesse método que são feitas todas as configurações referentes a apresentação do mapa na tela do usuário como o tipo do mapa, se satélite ou normal por exemplo, quais as ferramentas que estarão disponíveis nesse caso está sendo disponibilizada a barra de ferramentas padrão e também o botão de minha localização.

Este é o principal ponto de todo o contexto apresentado até agora nessa série de vídeos pois, o método lerCoordenadas() executa exatamente a mesma função do botão minha localização com a diferença de que a coordenada nesse caso é conhecida e pode ser manipulada, em um contexto onde se utiliza somente a API do Google essa informação fica no servidor dele. Dependendo da finalidade da aplicação essa informação da coordenada pode ou não ser útil, lembrando que cada aplicação tem 1000 acessos dia gratuitos, caso esse volume seja superado é necessário pagar ou a qualidade do serviço fica comprometida. Por isso é muito importante que se tenha um algoritmo de alto nível muito bem elaborado para não acabar com custos operacionais desnecessários. Todas as possibilidades de configurações dos mapas são abordadas nos tutoriais e na documentação oficial da API.

O próximo passo é a criação de uma variável coordenadas do tipo LatLng para capturar a informação contida nas varáveis globais latitude e longitude. Feito isso, é necessário a criação do marcador que vai apontar as coordenadas no mapa por meio do método MarkerOptions().

E o último passo dessa jornada é a configuração da apresentação das coordenadas no mapa por meio de uma variável update do tipo CameraUpdate que vai proporcionar uma experiência agradável ao usuário ao movimentar o marcador no mapa. Todas as configurações de câmera e de marcação podem ser vistas com maior profundidade na documentação oficial da API GoogleMaps pois, trata-se de um assunto extenso com múltiplas possibilidades de configuração e esse projeto tem uma abordagem mais simples porque se destina a fins de aprendizagem e o contexto principal é como receber as coordenadas dos servidores do Google, fato este que foi concluído com sucesso.

Esse projeto está disponível para donwload aqui.

Para você que nos acompanhou até aqui Muito Obrigado e... 

Fica a dica, se gostou de um like e inscreva-se no canal para nos ajudar a continuar trabalhando. Até a próxima.