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.

segunda-feira, 16 de janeiro de 2017

Curso Envio de Dados Android Php (Inclui o Projeto)



Sejam todos bem vindos.

Sou R J Iwancheche e sou desenvolvedor de soluções Android, os aplicativos da série LotoPp que geram palpites da sorte para as loterias brasileiras da Caixa Econômica Federal são de minha autoria. Como estou trabalhando em um upgrade para melhorar o desempenho deles precisei procurar alguns recursos para incrementar a relação dos usuários com o sistema, iniciando pela comunicação junto a um servidor. Por ser um sistema único não existe a necessidade de nenhum recurso pesado como os que as grandes empresas utilizam. Por isso, a opção ideal, na minha opinião, é a linguagem Php. Fica a dica, quando se desenvolve para sistemas como o bancário por exemplo, um servidor Java ou Enode são soluçoes necessárias pelo grande volume de dados trafegados e pela enorme quantidade de acessos simultâneos, sem falar da velha e boa segurança. Já quando se desenvolve soluções com necessidades únicas, como para o LotoPp, um servidor Php supre as necessidades com tranquilidade, mantendo um nível de segurança aceitável.

Como estava comentando, iniciei a pesquisa para saber qual seria a melhor forma de implementação desta comunicação mas, existe uma enorme barreira a ser superada por nós, desenvolvedores brasileiros, que é a Língua Portuguesa a maioria dos materiais está em inglês, tudo bem é sabido da necessidade do entendimento desta linguagem para a comunicação mundial mas, porque não se ter materiais bons em português? Outra dificuldade encontrada, entre os vários materiais disponíveis e de boa qualidade diga-se de passagem, foi a objetividade. Quando se procura algo, quem procura sabe qual é a sua dificuldade e, geralmente, se depara com muito conteúdo que não condiz com a busca, por exemplo: a busca é para a conexão com o servidor e o material começa com a montagem das tabelas no banco de dados.

Outro ponto desfavorável é a constante mudança dos métodos nativos do Android, quer seja por segurança, quer seja por desempenho o S/O está em constante mudança e junto com elas a depreciação de todo os materiais publicados até então.

Por este motivo que a série Enviar Dados Android Php foi criada é um material atualizado e se destinada a mostrar como enviar dados de um dispositivo Android para um servidor Php, especificamente. 

Como diferencial a série inicia mostrando alguns pontos utilizados na engenharia de software mas, não segue a risca as normas padrão. Por isso, caso o seu nível seja avançado e encontre algo que esteja em desacordo por favor, deixe anotado nos comentários, será um prazer analisar um por um pois, críticas construtivas são sempre bem vindas. A programação não inclui a utilização de Web Service já que o objetivo principal é o estudo do Sistema Operacional Android. Entendendo assim, que todo o conteúdo exibido é para fim didático.

Alguns métodos utilizados no processamento são nativos do Android, são necessários para a integração das operações propostas no projeto. Também serão encontrados alguns, aqui chamados de adaptados, que são uma mescla entre o algoritmo criado para este projeto e os nativos android, além dos criados exclusivamente para o funcionamento do sistema. O ator utilizado no use case é o usuário, que envia dados por meio de um dispositivo Android para um servidor Php. O fluxograma inicia na coleta dos dados que, posteriormente, serão enviados para o servidor. Caso o servidor esteja indisponível uma mensagem de alerta será exibida, estando disponível, os dados enviados serão devolvidos como resposta e exibidos ao usuário, finalizando o processo. No diagrama de classes é possível verificar a existência de 3 classes contendo os seus atributos e as suas operações, mais conhecidas como métodos, e se relacionando entre si. O sistema contém a classe ColetarDados, EnviarDadosRegistrados e RetornoServidor.

A principal conclusão que esta série passa é a complexidade do desenvolvimento de  um software. Para o envio de um simples campo preenchido por um usuário qualquer, em um dispositivo Android, são acionadas nada mais, nada menos do que 9 operações, ou métodos, acomodados em 3 classes distintas. Para facilitar a vizualização o tema foi dividido em 8 vídeos montando um índice pelo título, cada um tratando de um tema específico e importante para o desenvolvimento de uma solução simples e objetiva, para a conexão de um dispositivo Android com um servidor Php. 

O principal propósito da série é ajudar pessoas com essa necessidade específica, caso uma pessoa se beneficie com este material a meta foi alcançada. E se essa pessoa foi você, deixe o seu recado nos comentários, ficaremos muito felizes.

Se gostou, dê um Like e inscreva-se no Canal.

Até a próxima.

segunda-feira, 9 de janeiro de 2017

Leitura Obrigatória Para Acelerar o Crescimento da Sua Empresa




1. Organizações Exponenciais. por que elas são 10 vezes melhores, mais rápidas e mais baratas que a sua (e o que fazer a respeito), por Salim Ismail

O impacto que empresas inovadoras como o Uber, o TED, o Google, o Waze e o Snapchat é desproporcionalmente maior, pelo menos 10 vezes e a medida que as tecnologias se misturam o ritmo da inovação aumenta. No livro são apresentados 10 atributos externos e internos que estas organizações possuem.

2) A Mentalidade do Fundador. por Chris Zook e James Allen

A mensagem trazida por esta leitura é que a principal vantagem competitiva que uma organização pode ter é a mentalidade do seu fundador. Os autores analisaram, por meio de workshops em mais de 50 países, e encontraram algumas características em comum na mentalidade dos fundadores dessas empresas especiais e duradouras que têm uma missão clara, uma cabeça de dono e uma obsessão com a linha de frente dos negócios. Assim sendo, esse livro mostra como é possível embutir a mentalidade de fundador em todas as esferas da empresa encontrando assim, crescimento.

3) Execução. a disciplina para atingir resultados, por Larry Bossidy e Ram Charam

Um dos cargos melhores renumerados dentro das coorporações é o de executivo e, como o próprio nome diz, a ele é creditado a função de fazer as coisas acontecerem. Não é por acaso que uma das maiores dificuldades encontradas por muitas empresas não está no planejamento mas sim, na execução do planejado. Este livro ajuda a quem está desenvolvendo ou recomeçando o planejamento estratégico a implementar uma cultura voltada para a execução dentro do seu quadro de colaboradores, desde o recrutamento até o formato das reuniões.

4) Built to Last. succesful habits of Visionary Companies, por Jim Collins

“Este não é um livro sobre líderes visionários carismáticos. Nem mesmo sobre conceitos de produtos inovadores com insights de mercado inéditos. Este é um livro sobre algo muito mais importante, duradouro e substanciais: organizações visionárias.”. Assim inicia-se esse livro considerado por alguns um guia prático na contrução de uma organização de sucesso. Quebrando determinados paradigmas como o de que é preciso uma grande ideia para começar uma empresa, de que as decisões devem ser tomadas por meio de complexos planejamentos estratégicos e de que é necessário se concentrar primeiramente em acabar com os concorrentes. Sendo assim, é proposto um mapa utilizando-se de empresas conhecidas para a construção de empresas duráveis.

5) Discovery Driven-Growth. A Breakthrough Process to Reduce Risk and Seize Opportunity, por Rita Gunther McGrath e Ian C. MacMillan

Neste livro são apresentadas ferramentas que mostram para os empreendedores como é possível planejar visando crescimento agressivo com ousadia. Planejar, testar por meio de checkpoints e criar uma cultura executiva baseada em evidências e aprendizados fazem com que as empresas possam controlar melhor os seus custos minimizando erros assim como, descartar projetos suspeitos de não chegarem a lugar algum antes de absorver algum  prejuizo.

Fonte: Sebrae - Endeavor 

segunda-feira, 2 de janeiro de 2017

StartUp para 2017


Quais são as melhores opções para a montagem de uma StartUp em 2017? Especialistas apontam algumas áreas de atuação como uma boa opção de investimento. 

O setor de tecnologia para a agricultura é uma aposta interessante para 2017 assim como, o de construção civil melhorando a gestão de projetos e a produtividade da cadeia. Ferramentas de comunicação e mobilidade para as cidades inteligentes vão continuar ganhando espaço e as fintechs devem continuar a transformação do mercado financeiro. Além da saúde com ferramentas para pacientes encontrarem o médico adequado, alternativas inovadoras aos planos de saúde tradicionais e também na educação com soluções de preparação para o Enem e vestibulares.

Software como serviço SaaS se consolidou como formato e deve continuar, o mercado B2B traz mais oportunidades que o B2C, na visão dos investidores, pelo fato de monetizar com mais rapidez.

Com a crise muitos profissionais competentes deixaram os seus postos nas grandes empresas e estão disponíveis para colaborar nas startups.

Uma melhora na economia também fará com que a confiança dos investidores melhore, inclusive com a participação das grandes empresas no papel, pois até então, o Brasil está sendo visto como um mercado de risco. 

Então, vamos ao trabalho.

Fonte: Sebrae - PEGN

terça-feira, 27 de dezembro de 2016

StartUp Dica Quente


"Serviços bancários são essenciais, bancos não são.” 


Esta celebre frase foi pronunciada por Bill Gates em 94 quando o Departamento de Justiça americano travou um negócio de US$ 1,5 bilhão ofertado pela Microsoft para a compra da Intuit que desenvolvera uma ferramenta voltada para a gestão pessoal chamada Quicken. Muitos anos se passaram e a egemonia das grandes instituições financeiras permanece mas, o aparecimento das fintechs ressuscita a frase de uma forma provocativa.

As startups de tecnologia financeira tem como objetivo fornecer serviços ou produtos financeiros que substituam ou melhore os oferecidos pelos bancos tradicionais, gerando preocupação entre eles. Destacam-se pela agilidade e inovação atraindo jovens ambientados com o mundo digital. São pequenas, ágeis e voltadas para a solução de problemas e por esse motivo conseguem mudar o rumo dos negócios rapidamente em detrimento as grandes e lentas estruturas da instituições financeiras. Atuam em vários segmentos como crédito, empréstimo, entre outros mas, existem várias outras possibilidades de negócios a serem exploradas.

Especialistas apostam na inovação nas áreas de crédito, empréstimos para pequenas empresas com ou sem garantia e financiamento imobiliário. Modelos como os praticados na Europa com investimentos exclusivos para mulheres ou jovens é uma tendência, afirmam eles. 

Por outro lado, a maior dificuldade enfrentada pela fintechs é a ampliação de portofólio pois, conseguem ofertar apenas um bom serviço ou produto. Ainda não houve startup que tenha ofertado possibilidades similares a de um banco. Assim como, aumentar a base de clientes é uma barreira a ser superada. Outro ponto a se observar é o jurídico pois, os ambientes regulatórios variam de país para país.

Por mais que se pense ao contrário, atualmente, o ambiente entre os bancos e as fintechs é de cooperativismo a ponto de serem criadas encubadoras como CUBO do Itaú e InovaBRA do Bradesco  para estreitar a relação. Se por um lado os bancos procuram aprender e entender os modelos de negócios praticados, por outro eles tentam buscar a colaboração quando os interessa  e até mesmo absorvem por meio de compra.

A criação de uma fintech pode ser uma boa opção para quem pretende empreender em 2017.

Fonte: Sebrae - PEGN

segunda-feira, 12 de dezembro de 2016

Tendências para 2017


As empresas brasileiras comprovaram em 2016 que na crise surgem oportunidades. O consumo menor forçou uma corrida por eficiência e redução dos custos por meio da tecnologia. Assim como, surgiram novos modelos de negócios e diferentes possibilidades de relacionamento com os seus clientes. Logo que a economia demonstre sinas de que está se recuperando será a hora de manter em pé os pontos positivos conseguidos.

As empresas se enxugaram inovando na comunicação e na produção por exemplo. A tendência para 2017 é inovar com agressividade pois foi percebida a necessidade  de transformação nos seus modelos de negócios. A compra de uma start-up, que atraiu 3,2 milhões de homens interessados em receber um kit de barbear, pela quantia de US$ 1 bilhão pela Unilever é um exemplo. Segundo alguns analistas, uma empresa do porte da Unilever dificilmente coseguiria criar um modelo de negócio deste tipo na sua estrutura corporativa. Isso significa que empresas deste porte tendem a buscar por novos modelos de negócios em uma tentativa de prosperar. 

A tecnologia é o eixo motor para que se possa inovar internamente e externamente em qualquer área de atuação. Ela tem possibilitado a relação das empresas por canais nunca antes utilizados e para isto se torna necessário, quase obrigatório, a criação de conteudo pois, como o consumidor é orgânico as empresas precisam expor as suas marcas em todos os lugares onde ele consome informação.

As grandes empresas estão se reinventado produzindo videos e séries 100% on-line sem ter a intenção de conduzir estes consumidores para os seus sites entendendo que as campanhas se resolvem pelo fato deste simplesmente assistir ao seu conteudo. Esse tipo de comunicação tem se mostrado eficiente para "encantar" os clientes que enxergam isso como uma forma de evolução refletindo a importância da inovação.

Em meio a uma crise o consumo é reduzido retirando determinados produtos do carrinho mas, este cliente ainda quer ser encantado pelas marcas. E as marcas que tem se renovado por meio de inovações são as que encantam.  

A evolução do marketing digital está trazendo modelos que condicionam a mensagem ao consumidor a sua etapa de navegação. Para conhecer o produto existe uma mas, se ele já tem conhecimento a mensagem é outra, tendo em mente de que não adianta mostrar uma mensagem genérica nas diferentes etapas de relacionamento.

A inteligência artificial veio para ficar e já está sendo explorada no relacionamento empresa cliente. Um exemplo claro disso são os chatbots onde robôs se encarregam de atender os usuários conseguindo responder a altura. Esse é um exemplo de inovação que reduz custos e fica disponível 24/7. Com a inteligência artificial será possível escalar qualquer modelo de negócio.

A principal tendência para 2017 é se conscientizar de que as marcas precisam passar uma mensagem e que nesta mensagem é muito interessante divulgar qual é o propósito da sua empresa.

Fonte: Sebrae - PEGN

quarta-feira, 7 de dezembro de 2016

Quais as principais tecnologias que a sua empresa precisará até 2020.




Se você é dono de empresa, formal ou não, administra algum tipo de negócio ou pretende iniciar algum empreendimento, precisa começar a se preocupar com a velocidade que as tecnologias estão avançando e qual o impacto disso na sua área.

Os obstáculos a serem ultrapassados são complexos:

  • Qualificação de mão-de-obra. Um dos principais problemas, existe desde que mundo é mundo, tende a ficar cada vez pior pois a tecnologia não perdoa, quando ela entra em um ambiente  e os colaboradores que compõe as equipes não estão preparados o resultado é catastrófico, a concorrência agradece.
  • Flexibilidade. Uma das grandes reclamações dos colaboradores é ter que atender a pedidos inusitados do seu chefe via Smartphone, geralmente depois do fim do expediente e independente do local que se encontra. Lidar com isso é um grande desafio, para patrões e colaboradores, já que o mercado moderno funciona 24/7 e pouco se importa com o fator humano.
  • Impedimentos jurídicos. Sabe aquela ideia fantástica que vai revolucionar o mundo? Provavelmente, existe algum entrave jurídico para a sua implementação, basta olhar a quantidade de processos que o UBER enfrenta para poder se manter em pé. Por isso, tenha em mente que consultar um bom advogado, assim como um contador, pode poupar muitas dores de cabeça e também o seu precioso dinheiro além de direcionar o seu projeto para o caminho do sucesso.
  • Comportamento Organizacional. A mudança do comportamento dos envolvidos em todo o processo é fundamental para a criação de uma cultura que esteja pronta para absorver o impacto das constantes mudanças que a tecnologia impõe.
Superados estes obstáculos você e a sua empresa estão prontos para usufruir de uma produtividade elevada proporcionada pela tecnologia.
  • Inteligência Artificial. De acordo com o físico Stephen Hawking este será um dos grandes desafios que a humanidade terá de enfrentar pois, com o passar do tempo os softwares, compostos por algoritmos capazes de desempenhar tarefas que normalmente necessitariam de mão-de-obra humana, passam a executá-las. Se por um lado tira empregos, por outro, gera novas possibilidades em um caminho que não tem mais volta, empresas como o Google e Facebook já utilizam alguns conceitos para disponibilizar material de acordo com o perfil do usuário.
  • Realidade aumentada. Colocar informações, por meio de tecnologia, para melhorar a experiência do usuário em produtos ou serviços. O recente sucesso do jogo Pokémon Go é um exemplo a ser observado.
  • Blockchain. É um recibo eletrônico para transações com bitcoins, por meio de uma plataforma, garantindo que apenas os interessados tenham acesso as informações. Caso você nunca tenha ouvido falar em bitcoins é bom começar a pesquisar assim como, a inteligencia artificial, é um caminho sem volta.
  • Drones. Veículos comandados a distância por pessoas ou softwares que já estão sendo utilizados em alguns lugares do mundo como a Suiça pelo serviço de correios possibilitando assim, a entrega de encomendas em lugares remotos com tempo e custo reduzidos, outras empresas como Amazon já tem estudos para entregar produtos comprados na sua plataforma de e-commerce.
  • Internet das Coisas (IoT). Hardwares interligados via sensores a softwares processando informações via intranet ou internet, com a finalidade de melhoria na produtividade e gerando também economia de recursos e de dinheiro. É uma área com possibilidades infinitas.
  • Robôs. A cada dia que passa as pessoas ficam mais velhas e com necessidades especificas está é somente uma das áreas onde se pode utilizar robôs para a execução de tarefas como o monitoramento por exemplo. É impossível pensar em robôs e esquecer da inteligência artificial pois, estão intimamente ligados. Outras áreas como fábricas e a construção civil também serão afetadas pela entrada desses equipamentos no mercado.
  • Realidade virtual. Treinamento com simuladores de carro para auto-escolas, em linhas de alta voltagem para companhias elétricas ou manequins virtuais para lojas de roupa são algumas das possibilidades que se abrem, não se esquecendo dos vídeos games. Para que a experiência seja positiva, em alguns casos, é necessário a utilização de dispositivos como óculos.
  • Impressoras 3D. As possibilidades que a impressão 3D está proporcionando são infinitas e ainda sem serem exploradas em sua totalidade. Áreas como a dos polímeros, plástico, estão um pouco mais avançadas que as outras mas, é somente a ponta do iceberg.
Estas tecnologias chegaram para ficar e vão causar muito barulho o UBER é um exemplo atual mas, em um passado recente música era ouvida em vinil onde existia uma estrutura ou indústria completa voltada para a sua produção. O impacto que o mp3 causou foi grande e quando começou não parou, toda aquela estrutura teve que se adequar as mudanças. Tenha como meta se manter atualizado para poder oferecer uma experiência positiva aos seus clientes porque senão a concorrência o fará.

Fonte: Sebrae - Exame.com

sexta-feira, 5 de fevereiro de 2016

Estudo Sobre Alarm Manager Android

Alarmes (com base na classe AlarmManager ) oferecem uma maneira de executar operações baseadas em tempo fora do tempo de vida de sua aplicação. Por exemplo, você poderia usar um alarme para iniciar uma operação de longa duração, como iniciar um serviço uma vez por dia para baixar a previsão do tempo.

Os alarmes devem ter as seguintes características:

  • Eles permitem disparar Intenções em datas fixas e / ou intervalos.
  • Você pode usá-los em conjunto com receptores de radiodifusão para iniciar os serviços e executar outras operações.
  • Eles operam fora da sua aplicação, de modo que você pode usá-los para acionar eventos ou ações, mesmo quando o aplicativo não está em execução, e mesmo se o próprio dispositivo está dormindo.
  • Eles ajudam você a minimizar as necessidades de recursos do seu aplicativo. Você pode agendar operações sem depender de temporizadores ou continuamente em execução serviços em segundo plano.

Nota: Para as operações que são garantidos para ocorrer durante o tempo de vida de sua aplicação sincronismo, ao invés considerar o uso do Handler classe em conjunto com Timer e Thread . Esta abordagem dá Android melhor controle sobre os recursos do sistema.

Entenda o trade-offs


Um alarme de repetição é um mecanismo relativamente simples, com flexibilidade limitada. Pode não ser a melhor escolha para a sua aplicação, especialmente se você precisa para desencadear operações de rede. Um alarme de mal projetado pode causar o consumo da bateria e colocar uma carga significativa em servidores.

Um cenário comum para o desencadeamento de uma operação fora do tempo de vida de seu aplicativo é quando estiver sincronizando dados com um servidor. Este é um caso em que você pode ser tentado a usar um alarme de repetição. Mas se você possui o servidor que está hospedando os dados da aplicação, utilizar o Google Cloud Messaging (GCM) em conjunto com o adaptador de sincronização é uma solução melhor do que AlarmManager . Um adaptador de sincronização lhe dará as mesmas opções de agendamento como AlarmManager , mas oferecerá muito mais flexibilidade. Por exemplo, uma sincronização pode ser baseada em uma mensagem de "novos dados" a partir do servidor / dispositivo (pesquise Executando um Adaptador de sincronização para mais detalhes), a atividade do usuário (ou inatividade), a hora do dia, e assim por diante. 

Melhores práticas


Cada escolha que você faz ao projetar seu alarme repetitivo pode ter consequências na forma como seu aplicativo usa (ou abusa) recursos do sistema. Por exemplo, imagine um aplicativo popular que se sincroniza com um servidor. Se a operação de sincronização é baseada na hora do relógio e cada instância do aplicativo sincroniza às 11:00, a carga sobre o servidor pode resultar em alta latência ou mesmo "negação de serviço". Siga estas melhores práticas na utilização de alarmes:


  • Adicionar aleatoriedade para quaisquer solicitações de rede que provocam, como resultado de um alarme de repetição:
  • Fazer qualquer trabalho local quando o alarme dispara. "O trabalho Local" significa qualquer coisa que não bate um servidor ou exigir os dados do servidor.
  • Ao mesmo tempo, programar o alarme que contém os pedidos de rede para disparar contra um certo período de tempo aleatório.
  • Mantenha a sua frequência de alarme a um mínimo.
  • Não acorde o dispositivo desnecessariamente (este comportamento é determinado pelo tipo de alarme, conforme descrito em Escolha um tipo de alarme ).
  • Não faça o tempo de disparo do seu alarme mais vezes do que tem que ser.
  • Use setInexactRepeating() em vez de setRepeating() . Quando você usa setInexactRepeating() , o Android sincroniza repetir alarmes de vários aplicativos e dispara-os ao mesmo tempo. Isto reduz o número total de vezes que o sistema tem de ativar o dispositivo, reduzindo assim a drenagem da bateria. A partir do Android 4.4 (API Nível 19), todos os alarmes de repetição são inexatos. Observe que, enquanto setInexactRepeating() é uma melhoria em relação setRepeating() , ele ainda pode sobrecarregar um servidor se cada instância de um aplicativo atinge o servidor na mesma época. Portanto, para solicitações de rede, adicionar um pouco de aleatoriedade aos seus alarmes, como discutido acima.
  • Evitar basear o seu alarme na hora do relógio, se possível. Alarmes repetitivos que são baseados em um tempo de disparo preciso não funcionam bem. Use ELAPSED_REALTIME se puder. 

Definir um alarme repetitivo


Como descrito acima, alarmes de repetição são uma boa escolha para agendar eventos regulares ou pesquisas de dados. Um alarme de repetição tem as seguintes características:

  • Um tipo de alarme. Para mais discussão, pesquise tipos de alarme .
  • Um tempo de disparo. Se o tempo de disparo você especificar está no passado, o alarme dispara imediatamente.
  • Intervalo do alarme. Por exemplo, uma vez por dia, a cada hora, a cada 5 segundos, e assim por diante.
  • A intenção pendente (PendingIntent) que é acionada quando o alarme é disparado. Quando você define um segundo alarme que usa a mesma intenção pendente, ele substitui o alarme inicial.

Escolher um tipo de alarme

Uma das primeiras considerações na utilização de um alarme de repetição é o seu tipo deve ser.

Existem dois tipos de relógio gerais para alarmes: "o tempo decorrido real" e "relógio de tempo real" (RTC). tempo real decorrido utiliza o "tempo desde a inicialização do sistema", como uma referência, e relógio de tempo real utiliza UTC tempo (relógio de parede). Isto significa que o tempo real decorrido é adequado para a fixação de um alarme com base na passagem de tempo (por exemplo, um alarme que dispara a cada 30 segundos), uma vez que não é afectada pelo tempo de fuso / local. O tipo de relógio de tempo real é mais adequado para os alarmes que são dependentes da localidade atual.

Ambos os tipos têm uma versão "despertar", que diz para acordar a CPU do dispositivo se a tela está desligada. Isso garante que o alarme será acionado na hora programada. Isso é útil se o seu aplicativo tem um exemplo de dependência de tempo, se ele tem uma janela limitada para realizar uma operação particular. Se você não usar a versão de despertar do seu tipo de alarme, em seguida, todos os alarmes de repetição serão acionados quando o dispositivo está for acordado.

Se você simplesmente precisa o alarme para disparar em um intervalo específico (por exemplo, a cada meia hora), use um dos tipos de tempo real decorrido. Em geral, esta é a melhor escolha.

Se você precisar de seu alarme para disparar em um determinado momento do dia, em seguida, escolha um dos tipos de relógio de tempo real baseado em relógios. Note, no entanto, que esta abordagem pode ter alguns inconvenientes: o aplicativo pode não traduzem bem a outras localidades, e se o usuário altera configuração de tempo do dispositivo, que poderia causar um comportamento inesperado no seu aplicativo. Usando um tempo real tipo de relógio de alarme também não escala bem, como discutido acima. Recomendamos que você use um alarme "em tempo real decorrido", se puder.

Lista de tipos:

ELAPSED_REALTIME - Destrói a intenção pendente com base na quantidade de tempo desde que o dispositivo foi inicializado, mas sem acordar o dispositivo. O tempo decorrido inclui qualquer momento durante o qual o dispositivo foi adormecido.
ELAPSED_REALTIME_WAKEUP - Acorda o dispositivo e dispara a intenção em andamento, após o período de tempo especificado tiver decorrido desde a inicialização do dispositivo.
RTC - Queima a intenção pendente no momento especificado, mas não acorda o dispositivo.
RTC_WAKEUP - Acorda o dispositivo para disparar a intenção pendente no momento especificado.
exemplos ELAPSED_REALTIME_WAKEUP

Aqui estão alguns exemplos de como usar ELAPSED_REALTIME_WAKEUP .

Acorde o dispositivo para disparar o alarme em 30 minutos, e a cada 30 minutos depois disso:

 // Hopefully your alarm will have a lower frequency than this!
 alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
         AlarmManager.INTERVAL_HALF_HOUR,
         AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);

Acorde o dispositivo para disparar um alarme de uma só vez (não-repetição) em um minuto:

  private AlarmManager alarmMgr;
 private PendingIntent alarmIntent;
 ...
 alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
 Intent intent = new Intent(context, AlarmReceiver.class);
 alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

 alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
         SystemClock.elapsedRealtime() +
         60 * 1000, alarmIntent);

Exemplos RTC

Aqui estão alguns exemplos de como usar RTC_WAKEUP .

Acorde o dispositivo para disparar o alarme em aproximadamente 14:00, e repetir uma vez por dia, ao mesmo tempo:

  // Set the alarm to start at approximately 2:00 pm
 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, 14);

 // With setInexactRepeating(), you have to use one of the AlarmManager interval
 // constants--in this case, AlarmManager.INTERVAL_DAY.
 alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
         AlarmManager.INTERVAL_DAY, alarmIntent);

Acorde o dispositivo para disparar o alarme, precisamente 08:30, e a cada 20 minutos depois disso:

  private AlarmManager alarmMgr;
 private PendingIntent alarmIntent;
 ...
 alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
 Intent intent = new Intent(context, AlarmReceiver.class);
 alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

 // Set the alarm to start at 8:30 am
 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, 8);
 calendar.set(Calendar.MINUTE, 30);

 // setRepeating() lets you specify a precise custom interval--in this case,
 // 20 minutes.
 alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
         1000 * 60 * 20, alarmIntent);

Decidir como o alarme precisa ser

Como descrito acima, a escolha do tipo de alarme é frequentemente o primeiro passo na criação de um alarme. Uma outra distinção é como você precisa que seu alarme seja. Para a maioria dos aplicativos, setInexactRepeating() é a escolha certa. Quando você usa esse método, o Android sincroniza vários alarmes inexata repetindo e dispara-los ao mesmo tempo. Isso reduz o consumo da bateria.

Para o app rara que tem horários rígidos, por exemplo, o alarme deve disparar precisamente às 8:30 am, e de hora em hora depois de usar setRepeating() . Mas você deve evitar o uso de alarmes exatos, se possível.

Com setInexactRepeating() , não é possível especificar um intervalo personalizado da maneira que você pode com setRepeating() . Tem de utilizar uma das constantes de intervalo, como INTERVAL_FIFTEEN_MINUTES , INTERVAL_DAY , e assim por diante. Veja AlarmManager para a lista completa.

Cancelar um alarme

Dependendo do seu aplicativo, você pode querer incluir a possibilidade de cancelar o alarme. Para cancelar um alarme, ligue para cancel() no Gerenciador de alarmes, passando o PendingIntent você não quer mais ao fogo. Por exemplo:

  // Se o alarme foi definido, cancelá-lo.
 if (alarmMgr! = null) {
     alarmMgr.cancel (alarmIntent);
 }

Iniciar um alarme quando o dispositivo é inicializado

Por padrão, todos os alarmes são cancelados quando um dispositivo é desligado. Para evitar que isso aconteça, você pode projetar seu aplicativo para reiniciar automaticamente um alarme de repetir se o usuário reinicia o dispositivo. Isso garante que o AlarmManager continuará fazendo a sua tarefa sem que o usuário precise reiniciar manualmente o alarme.


Aqui estão os passos:




quinta-feira, 4 de fevereiro de 2016

Exemplo das Classes BroadCast, Notification e Alarm Android Combinadas

Estas três classes Android combinadas são um poderosa ferramenta na mão do desenvolvedor, usadas com inteligência, podem trazer grandes benefícios nas duas pontas da relação usuário aplicativo.

Para o desenvolvimento de uma aplicação que se comunique com o usuário é imprescindível a utilização de notificações periódicas para que ele saiba que o aplicativo existe e todo o projeto não caia no esquecimento, também é possível agendar  coleta de dados para identificar deslocamento entre outras possibilidades.

A grande questão é como fazer essas classes trabalharem juntas ao seu favor. Existem muitos bons materiais publicados na web, inclusive serão utilizados para aprofundar as informações aqui prestadas. A grande dificuldade é encontrar um exemplo completo, por este motivo esta postagem foi criada.

Em resumo será criado uma Activity principal e duas BroadCasts, uma denominada Boot e outra Alarme. É possível analisar o diagrama de classes do exemplo logo abaixo:


As classes, Alarme e Boot, são extensões da super-classe Broadcast herdando assim todas as suas características. Assim como, a classe Main estende a super-classe Activity. O relacionamento entre as classes Alarme e Boot com a Main é de agregação pois,  mesmo depois de destruída a Activity Main o alarme ficará ativo e cada vez que o sistema é reiniciado a classe Boot vai receber a informação de forma independente.

Assim que instalado, no emulador ou em um aparelho, e inicializado o exemplo apenas mostrará uma tela branca com um label: Testar Alarme no centro como mostrado abaixo.


A partir do momento que o S.O. é reinicializado o um sinal de BroadCast (BOOT_COMPLETED) é enviado pelo sistema e a classe Boot o recebe e arma o Alarme para notificar o sistema na inicialização e a cada dez segundo a contar daí. A classe Boot é mostrada abaixo:


A cada alarme é disparado outro sinal de BroadCast (ALARME) o qual a classe Alarme recebe e roda a notificação. A classe Alarme é mostrada abaixo:



A maior dificuldade no entendimento do funcionamento é que somente com um sinal de BroadCast enviado o sistema não  funcionará corretamente. O detalhe é que são dois sinais e que outros sistemas podem receber e enviar múltiplos sinais. Abaixo é possível verificar o Manifest do exemplo:


Foram pedidas a permissões para cada ação que o exemplo utiliza, vibrar e ser informado sobre o Boot do S.O.  Também é possível notar que existem dois receivers um para cada comunicação,  do Alerta e do Boot.

E finalmente a classe Main é mostrada abaixo:


Caso exista a necessidade de aprofundamento nos tópicos exibidos aqui existem estes vídeos explicativos muito bons.

Notification:

   


BroadCast:




AlarmManager: