Escolar Documentos
Profissional Documentos
Cultura Documentos
Faculdade de Ciências
Departamento de Informática
2012
UNIVERSIDADE DE LISBOA
Faculdade de Ciências
Departamento de Informática
ESTÁGIO
Trabalho orientado pelo Prof. Doutor Carlos Eduardo Ramos dos Santos Lourenço
e co-orientado por Eng.º Diogo Vitorino
2012
Agradecimentos
i
ii
Abstract
Great developments are being observed in mobile technologies today, with special
focus on mobile phones and other mobile electronic devices. This is where this paper is
focused.
In the mobile applications market, we now begin to see a strong competition, with
the leading brands fighting for their place in the market, encouraging the development
of applications for the operating system installed on their mobile device. One such
brand is Google, bringing the Google Android [1] operating system, which is installed
in many of the smartphones used today, by the general public. In this effort to
encourage the development of applications for Google Android, Google has created an
application store, online accessible by any terminal — Google Play [2] (before was
known as Android Market) — where you can search and buy/download applications
which are then used in Android devices.
Addition Serviços e Projectos Informáticos, Lda [3] begins developing
applications for the Android operating system with two simple applications. The first
one is a utility that manages the alert sounds (calls and text messages) of the device,
taking into account the surrounding environment. The second is an application that aims
to show the interactions (calls and test messages) on a chart that purports to be a simple
way to view user communication over a period of time.
This document describes the planning and development of these two applications,
plus the release and promotion stage of the first one.
iii
iv
Conteúdo
Capítulo 1 Introdução............................................................................................. 1
1.1 Motivação..................................................................................................... 1
1.2 Objectivos .................................................................................................... 1
1.3 Contribuições ............................................................................................... 2
1.4 Estrutura do documento ............................................................................... 2
1.5 Trabalho Relacionado .................................................................................. 3
1.5.1 Gestor de Alertas Sonoros..................................................................... 3
v
4.2.1 Algoritmo utilizado para tratar os dados do sensor de proximidade... 30
vi
vii
Lista de Figuras
viii
ix
x
Capítulo 1 Introdução
1.1 Motivação
Observa-se actualmente um grande desenvolvimento na área das tecnologias
móveis, começando estas a assumir um papel preponderante na forma como as pessoas
se relacionam, não só com as chamadas tecnologias de informação, mas também com os
dispositivos electrónicos em geral.
Começa-se a perceber uma cada vez maior adesão a estas tecnologias, em detrimento
dos tradicionais computadores pessoais, o que implica também uma mudança na forma
como se utiliza o software. Agora, as aplicações para o público geral têm que ser criadas
para os smartphones ou tablets, etc., ou pelo menos devem ter uma versão que seja
compatível com estes dispositivos.
Nenhuma empresa de desenvolvimento de software, pode dar-se ao luxo de ignorar esta
revolução, sob pena de não adquirir know how em tempo útil, perdendo competitividade
num futuro muito próximo. A Addition não é excepção. As duas aplicações tratadas
neste relatório são o seu primeiro esforço de experimentação, e também de
reconhecimento do mercado das aplicações para o sistema operativo Google Android.
1.2 Objectivos
Os objectivos deste trabalho são, como já foi dito atrás, o planeamento e
desenvolvimento de duas aplicações para o sistema operativo Google Android, bem
como o lançamento e divulgação de uma delas.
A primeira aplicação, a que chamaremos de “Gestor de Alertas Sonoros”, deve fazer
uma gestão automática dos alertas sonoros de que o dispositivo dispõe. Esta gestão deve
ter em conta as condições que rodeiam o dispositivo, desde o nível de ruído que o
rodeia, passando pela posição em que este se encontra e acabando na forma como este
está guardado. Para além disto, existe também uma segunda versão desta aplicação, que
tem como um dos seus objectivos, a leitura automática de mensagens escritas,
recorrendo para isso à síntese de voz.
1
A segunda aplicação , que será referida como “Visualizador de Comunicação”, pretende
mostrar, num gráfico de fácil compreensão, a interacção — em termos de chamadas e
mensagens escritas — que o utilizador teve com o dispositivo num determinado
período. A forma como os registos das chamadas e das mensagens escritas são
mostrados, deve ser simples, de modo a que, com uma rápida observação, o utilizador
se aperceba facilmente, por exemplo, se aquele foi um dia em que utilizou o telemóvel
para tratar de mais assuntos do foro pessoal ou do foro profissional. Esta aplicação foi
encomendada à Addition por uma empresa de design de interfaces denominada
CADA[4], pelo que os requisitos, tanto funcionais, como não funcionais, foram
definidos por um colectivo externo à Addition.
1.3 Contribuições
Este relatório aborda o desenvolvimento de duas aplicações para o sistema
operativo Google Android.
O desenvolvimento de aplicações para dispositivos móveis tem restrições, tanto ao nível
do hardware em que correm, como ao nível do desenho de interfaces gráficas
compatíveis com uma forma não tradicional de interagir com os dispositivos. Este
relatório centra-se nestas questões, entre outros assuntos.
Por fim é abordado o lançamento de um produto da Addition, neste caso, uma das
aplicações móveis desenvolvidas no âmbito deste projecto, e são tiradas conclusões
quando ao sucesso/insucesso da aplicação.
2
1.5 Trabalho Relacionado
Durante a fase de planeamento das aplicações, foi feito um esforço para descobrir
aplicações que abordassem os mesmos problemas.
Embora coexistam no mercado aplicações muito parecidas entre si, não era isso que se
pretendia. Pretendia-se sim, de alguma forma, preencher um espaço desocupado de
forma a trazer algo de novo. Foi o que se conseguiu em ambas as aplicações, como
veremos adiante.
De todas as aplicações testadas, destacam-se algumas que se aproximam dos objectivos
do trabalho desenvolvido, embora não os atingindo na totalidade.
3
Ainda assim, pode-se avançar que não foi encontrada nenhuma aplicação no mercado
que mostre a comunicação feita no dispositivo da mesma forma que o Visualizador de
Comunicação.
A título de exemplo, existe uma aplicação Call Log Manager Pro [8], que também lida
com o histórico de chamadas do dispositivo, permitindo o rastreamento de chamadas no
histórico, visualização de estatísticas e gestão das entradas (apagar, exportar para
ficheiro, etc.).
É importante estabelecer que esta aplicação não permite a criação de gráficos nem inclui
as mensagens recebidas/enviadas, funcionalidades que estão incluídas no Visualizador
de Comunicação, como será descrito no Capítulo 2.
4
Capítulo 2 Objectivos
Neste capítulo descreve-se o que se pretendia atingir com cada aplicação. São
apresentados os requisitos funcionais e não funcionais de cada aplicação e são descritos
os resultados finais, permitindo assim uma comparação entre planeamento e produto
final.
5
A versão Premium [9], comercializada no Google Play [10] pelo preço de 1,54 €, tem
todas as funcionalidades descritas nos três modos e não terá publicidade como fonte de
receita.
A versão Free [11] é grátis e distribuída também através do Google Play, mas tem
como fonte de receita um espaço reservado para publicidade e não tem todas as
funcionalidades presentes na versão Premium. No modo outPocket, não permite definir
um período diário de silêncio. Não tem o modo headPhones.
Elaborando um pouco mais esta estratégia da Addition, podemos justificá-la pela
quantidade de aplicações grátis que existem no mercado Android. Segundo o relatório
de Junho de 2010 [12] da Distimo [13], nessa altura 57% das aplicações do Android
Market eram grátis. Assim, a intenção é que os utilizadores que estão dispostos a
comprar a aplicação, tenham a possibilidade de experimentar uma versão grátis da
mesma, que embora não tenha o mesmo nível de funcionalidade, permite travar
conhecimento com as funcionalidades centrais.
6
2.3 – Modo headPhones: Sempre que este modo esteja activo, e que o utilizador
tenha auscultadores ou auriculares ligados ao dispositivo, todas as mensagens escritas
que cheguem sejam lidas em voz alta, utilizando as capacidades de síntese de voz do
sistema operativo Android.
2.3.1 – A este modo deve ser adicionada uma funcionalidade que, nas
mesmas condições, permita ler em voz alta o nome do contacto das chamadas recebidas.
3 – A aplicação deve ser desactivável a qualquer momento pelo utilizador.
4 – Quando activa, a aplicação deve estar acessível através da Status Bar [14] do
sistema operativo.
7
Visto que as diferenças entre as versões Premium e Free são apenas ao nível da
funcionalidade e que, as funcionalidades da versão Free são um subconjunto daquelas
que estão presentes na versão Premium, podemos a partir daqui assumir que, salvo
indicação contraria, nos estamos sempre a referir à versão Premium.
Passando a uma descrição pormenorizada da aplicação, começamos pelo seu ecrã
inicial:
Como podemos ver, existem quatro botões que permitem activar ou desactivar a
aplicação (o primeiro a contar de cima) e os seus três modos.
Do lado direito dos botões que activam/desactivam os modos da aplicação, temos o
nome de cada modo. Quando o utilizador toca na zona que vai do final do botão até ao
final do sinal de maior (>), é encaminhado para o ecrã do modo correspondente.
Por baixo dos três modos vemos o atalho (about) que leva o utilizador ao ecrã que
contém os contactos da empresa responsável pelo desenvolvimento.
Por último temos uma área de estatísticas em que mostra a percentagem de tempo em
que o dispositivo esteve dentro do bolso (desde que a aplicação foi lançada pela última
vez) e o nível de ruído no momento em que o ecrã inicial foi mostrado ao utilizador.
8
Esta última funcionalidade não está presente na última versão dos requisitos. Foi
inserida um pouco à margem destes, mas com a noção de que não interfere em nada
com as restantes funcionalidade ou qualidades da aplicação.
Passando ao ecrã do modo inPocket:
Neste ecrã vemos, em cima e à esquerda, o botão que permite activar e desactivar o
modo.
Por baixo temos uma pequena explicação das suas funcionalidades. Ainda mais abaixo
temos duas caixas de selecção que dizem respeito a duas funcionalidades distintas:
1 – A primeira está nos requisitos funcionais. Quando activa, permite ao utilizador
receber um pequeno alerta vibratório quando o dispositivo detecta que entrou/saiu do
bolso. Deve ser utilizada apenas durante um período de adaptação, de forma a que o
utilizador perceba a forma como funciona este modo.
2 – A segunda funcionalidade, embora não esteja prevista na versão final dos requisitos
funcionais, aparece porque, durante o desenvolvimento e teste, se percebeu que existem
algumas diferenças ao nível do hardware entre os dispositivos móveis onde a aplicação
9
pode ser instalada. Não adiantando muito mais sobre as razões da sua existência para já
(serão explicadas no capítulo 4), podemos apenas dizer que quando activa, a aplicação
utiliza o sensor de aceleração para detectar a posição em que o dispositivo tem o ecrã
virado para baixo.
Esta última opção apenas deve estar activada se for necessária, ou seja, se a aplicação
não conseguir detectar que o dispositivo tem o ecrã voltado para baixo sem recorrer ao
sensor de aceleração. Isto é algo que depende do hardware presente no dispositivo.
Continuando, temos o modo outPocket:
Para além do botão que activa ou desactiva o modo e de uma pequena explicação,
vemos uma caixa de selecção e duas barras horizontais.
Começando pelas barras horizontais, estas existem como forma de demonstrar o
funcionamento do modo ao utilizador. A primeira mostra em tempo real o nível de ruído
detectado pelo dispositivo. A segunda mostra o volume de alerta calculado pela
aplicação para aquele nível de ruído.
10
A cima destas, a caixa de selecção permite activar ou desactivar o período diário de
silêncio. Se estiver desactivado, ao tocar na caixa, o utilizador precisa depois de
introduzir a hora de inicio e de fim do período, para o poder activar.
O último ecrã de modo corresponde ao modo headPhones:
11
Figura 5 - Ecrã about
Ainda assim, podemos concluir que os desvios em relação aos requisitos não atingem as
funcionalidades centrais, nem inviabilizam nenhum dos requisitos não-funcionais.
No relatório preliminar estava presente uma figura, que recuperamos em seguida, que
representava a interface gráfica inicialmente prevista para esta aplicação.
12
Figura 6 - Interface gráfica inicial da aplicação Droid inPocket
Como podemos ver, a interface era muito mais simples, mas também muito menos
flexível.
Em discussão com o Eng.º Diogo Vitorino (responsável pelo desenvolvimento de
software da Addition), chegou-se à conclusão que seria necessário tornar a interface
mais apelativa ao utilizador tipo dos sistemas Android, isto é, a pessoas com
conhecimentos de tecnologias móveis acima da média.
Desta decisão estratégica resultou uma interface que dá um controlo mais fino das
funcionalidades, permitindo activar ou desactivar cada uma delas a gosto do utilizador,
para além de ser também mais amigável, uma vez que contém mais e melhores textos
explicativos de cada opção que o utilizador pode tomar.
A concretização da interface foi feita em conjunto com o responsável pelas artes
gráficas da Addition — Pedro Rufino [15] — seguindo as mais recentes orientações de
estilo para aplicações Android [16], ao nível dos estilos gráficos, ícones, caixas de
selecção, botões, etc.
13
Figura 7 - Interface da versão Free, com espaço publicitário
A publicidade incluída na interface vem através de um serviço que por sua vez é cliente
de várias redes de anúncios para aplicações móveis. Esse serviço chama-se Mobclix
[17], e permite a instalação (recorrendo a uma API[18]) do dito espaço publicitário.
Cada clique (no caso mais comum das aplicações móveis, um clique é um toque no
anúncio) representa um valor monetário variável, que normalmente se situa algures
entre os 0.01 US$ e 0.10 US$.
À primeira vista, estes valores podem parecer irrisórios e, sem mais análise, pode-se
ficar com a ideia de que esta é uma má forma de financiamento. Ideia que pode
rapidamente ser desmentida se tivermos em conta alguns números. Em 2010, a então
independente Mobclix foi adquirida pela Velti [19] (empresa do mesmo ramo). Nessa
altura, a rede Mobclix mostrava mais de 3280 anúncios por segundo, atingindo os 8,5
mil milhões de anúncios por mês [20].
14
2.2 Visualizador de Comunicação
Esta aplicação pretende ser um visualizador da comunicação feita através do
dispositivo em que está instalada.
De uma forma simplista, pretende-se gerar um gráfico representativo de um período
temporal, em que cada evento de comunicação — envio/recepção de chamadas ou
mensagens escritas — é representado através de um símbolo diferente. Para além disto,
pretende-se também distinguir os vários eventos consoante o seu destinatário/remetente.
A Addition não é responsável pelo desenho da aplicação, apenas pela sua
implementação. O desenho ficou a cargo da empresa que encomendou a aplicação, que
entregou uma especificação de requisitos, que a Addition ficou responsável por cumprir.
Desta forma, a este capítulo fica um pouco mais abreviado no que diz respeito ao
visualizador de comunicação.
15
diferentes têm cores diferentes. Comunicações diferentes do mesmo contacto têm cores
iguais.
4 – A comunicação que chega ao dispositivo (chamadas recebidas e mensagens escritas
recebidas) e a comunicação que sai deste (chamadas feitas e mensagens escritas
enviadas) devem aparecer em zonas distintas do gráfico.
5 – Devem existir símbolos diferentes para chamadas e mensagens escritas. As
chamadas recebidas não atendidas também devem ser diferenciáveis das restantes.
6 – O tamanho dos símbolos deve reflectir a intensidade da comunicação que
representam. Crescem com a duração da chamada ou o tamanho da mensagem escrita.
7 – A linha temporal deve ser navegável entre o passado e o presente, mantendo sempre,
para o passado, os gráficos inalteráveis.
8 – Qualquer gráfico deve poder ser exportado para uma imagem a guardar na memória
persistente do dispositivo.
9 – Qualquer gráfico deve poder ser partilhado, recorrendo às redes sociais que o
utilizador tenha configuradas no dispositivo.
10 – Deve ser possível ao utilizador fazer zoom em qualquer gráfico, sendo que este lhe
deve ser apresentado inicialmente sem qualquer efeito de zoom.
11 – O gráfico deve ser navegável, de forma a que, para cada símbolo, seja possível, ao
utilizador, saber qual o contacto e a data/hora da comunicação.
12 – Deve ser possível criar um wallpaper a partir do gráfico gerado pela aplicação.
Este wallpaper, deve conter a informação mais actualizada.
16
Figura 8 - Ecrão inicial da aplicação Today
Como podemos ver, existem vários símbolos, que mudam em forma, tamanho e cor. A
lógica subjacente a estas diferenças será explicada mais à frente.
17
• No fundo temos uma barra de botões que têm como função (da esquerda para a
direita):
o Mostrar um ecrã com informações sobre a aplicação.
o Mostrar um menu que permite exportar o gráfico para um ficheiro de
imagem, ou partilha-lo através dos meios disponíveis no Android (e-
mail, redes sociais, etc.).
o Mostrar um menu que permite comutar entre um período de visualização
de um dia ou de uma semana.
o Ir para o período de comunicação anterior (se existir).
o Ir para o período de comunicação seguinte (se existir).
18
Figura 11 - Ecrã com menu de exportação da aplicação Today
19
Figura 13 - Live Wallpaper definido pela aplicação Today
20
Capítulo 3 O Trabalho realizado na Addition
21
em que o dispositivo está inserido são executadas em paralelo. A nova arquitectura será
explicada em detalhe mais à frente.
No início de Dezembro de 2011 foi feita a submissão desta primeira versão totalmente
funcional no Google Play, altura em que já estavam previstas mudanças significativas:
• Uma nova interface com o utilizador
• A inclusão na interface, de um ecrã com os contactos da empresa
• A criação de duas versões Free e Premium
• A inclusão das funcionalidades descritas anteriormente na versão Premium
Em Janeiro deu-se início à concretização das mudanças previstas, começando pela
análise e desenho das novas funcionalidades, respeitantes à versão Premium.
Recuperando os requisitos funcionais que lhes dizem respeito:
2.3 – Modo headPhones: Sempre que este modo esteja activo, e que o utilizador
tenha auscultadores ou auriculares ligados ao dispositivo, todas as mensagens escritas
que cheguem sejam lidas em voz alta, utilizando as capacidades de síntese de voz do
sistema operativo Android.
2.3.1 – A este modo deve ser adicionada uma funcionalidade que, nas
mesmas condições, permita ler em voz alta o nome do contacto das chamadas
recebidas.
Estas novas funcionalidades demoraram cerca de um mês a desenhar e implementar
pelo aluno.
No início de Março o aluno começou então a definir a nova interface gráfica, em
conjunto com Pedro Rufino e com o Eng.º Diogo Vitorino.
22
3.1.1 Diferenças entre o planeamento e a execução
Nem todas as tarefas do projecto foram finalizadas de acordo com os prazos
estabelecidos no relatório preliminar. Recordando a lista de tarefas e respectivos prazos:
1. Até ao final de Novembro de 2011:
Comportamento da aplicação Gestor de Alertas Sonoros e respectivos testes.
Submissão no Android Market.
3. Até ao final de Janeiro de 2012:
Definição e implementação de uma forma de divulgação da aplicação Gestor de
Alertas Sonoros.
4. Até ao final de Fevereiro de 2012:
Definição e análise dos requisitos da nova versão da aplicação Gestor de
Alertas Sonoros.
23
3.2 Aplicação Today
A aplicação Today teve dois responsáveis pelo seu desenvolvimento — Filipe
Uva e Luís Loureiro — antes de chegar às mãos do aluno.
Foi em Outubro de 2011 que o aluno entrou para este projecto. Nessa altura a aplicação
já tinha algo de funcional, no que diz respeito à pesquisa e organização da informação
sobre a comunicação feita através do dispositivo. Também a geração de gráficos estava
praticamente feita.
O trabalho do aluno neste projecto esteve muito ligado à interface com o utilizador e à
garantia de correcção dos gráficos apresentados, algo que envolveu uma detalhada
inspecção do código fonte da aplicação, bem como um período de testes alargado.
Para além disto, e visto que a CADA pretendia vender a aplicação através do Google
Play, foi necessário implementar um mecanismo de verificação de licenças de
utilização, que permite verificar se dada instalação da aplicação está licenciada pelo
Google Play.
Toda a intervenção do aluno descrita acima foi feita em discussão permanente como
Eng.º Diogo Vitorino, e foi concluída a 10 de Janeiro de 2012.
24
Capítulo 4 Desenho e Implementação
25
4.1 Desenho da aplicação Droid inPocket
Como foi dito acima, a arquitectura desta aplicação segue os desígnios da
framework para desenvolvimento de aplicações Android, bem como a utilização de fios
de execução paralelos para as tarefas de interacção com o meio ambiente. Na próxima
figura vemos o diagrama de classes.
26
Figura 14 - Diagrama de classes da aplicação Droid inPocket
27
Descrevendo um pouco o desenho da aplicação, podemos olhar com mais pormenor
para algumas das classes presentes no diagrama da figura 14:
• PocketDroidActivity: Esta é uma classe que estende a classe Activity da
Framework, e que portanto, representa um ecrã da aplicação. Para além disto é
abstracta, definindo apenas alguns comportamentos básicos que todas as suas
subclasses devem ter, como por exemplo, mostrar ou esconder elementos da
interface, desenhar um determinado layout no ecrã, etc.
• MainActivity: Uma subclasse de PocketDroidActivity. Deve representar o
primeiro ecrã da aplicação, e é abstracta porque se trata de um dos poucos
pontos de diferenciação entre as versões Premium e Free. As suas subclasses são
FreeActivity e PremiumActivity.
• PocketDroidService: Sendo uma subclasse da classe de framework Service, esta
é responsável por manter a aplicação a correr, mesmo quando nenhum dos seus
ecrãs está visível. Este serviço mantém um BroadcastReceiver com o objectivo
de receber eventos de telefonia e de alteração das definições de som pelo
utilizador. Para além disto, recebe também eventos dos sensores de proximidade
e acelerómetro.
• PocketDroidBroadcast: Como foi dito acima, o objectivo desta classe é tratar os
eventos de telefonia e de alteração de definições de som pelo utilizador. Assim,
e para poder receber estes eventos, esta classe estende a classe de framework
BroadcastReceiver, que uma vez inicializada e registados os eventos que deve
receber, é capaz apanhar os eventos mediante um callback no método
onReceive, ao qual é passado um parâmetro do tipo Intent que contém
informações sobre o evento. Os eventos tratados por esta classe são os seguintes:
o Mudança de estado da telefonia. Recepção de chamadas, início e
finalização de chamadas provocam a difusão deste evento pelo sistema
operativo.
o Recepção de mensagens escritas.
o Mudança do estado do alerta sonoro. Evento difundido quando as
preferências de alertas sonoros do dispositivo são alteradas, tanto pelo
utilizador como por uma qualquer aplicação, pelo que é necessário
distinguir os dois casos.
• PocketDroidStatus: Esta é a classe que mantém a maior parte da informação
necessária ao funcionamento da aplicação. Conforme se pode ver pelo diagrama
da figura 14, guarda informação sobre os modos activos e respectivas
preferências, o estado de verificação de licença de utilização para a versão
Premium (na versão Free este estado é falso por defeito), e ainda os últimos
valores obtidos pelos sensores de proximidade e acelerómetro.
28
Visto que esta classe é acedida por várias outras em simultâneo, optou-se por
aplicar o padrão de desenho Singleton [25], para garantir que a informação
alimentada e consumida é a mesma para todos produtores e consumidores.
Ainda pelo mesmo motivo, e por o sistema ter múltiplos fios de execução, esta
classe protege o acesso aos seus métodos não privados com um Lock [26], de
forma a garantir a consistência dos seus valores de retorno.
• PocketDroidTask: Esta classe tem como objectivo definir o comportamento
base das suas subclasses, que são as tarefas executadas em paralelo pela
aplicação. Mais concretamente, define a forma como deve ser passada
informação para dentro da tarefa e dada a ordem de execução num só método.
• ProximityListenerTask: Sendo uma subclasse de PocketDroidTask, esta tarefa é
lançada quando o sensor de proximidade retorna um valor. Mais à frente,
explica-se o algoritmo de detecção de utilizado para detectar se o dispositivo se
encontra dentro do bolso.
• AccelerometerListenerTask: Esta classe é responsável por verificar a posição
em que se encontra o telemóvel, de modo a saber qual o alerta sonoro a aplicar
(vibração ou toque).
• ListenTask: Sempre que seja preciso avaliar as condições de ruído do meio
ambiente, é lançada uma tarefa ListenTask. Esta é responsável por avaliar as
condições de ruído e actualizar as preferências de alertas sonoros do dispositivo
de acordo com o valor obtido. Mais à frente será explicado o algoritmo utilizado
para este efeito.
• ContactNameReader e SMSReader: Estas duas classes são chamadas para ler
em voz alta o contacto de uma chamada recebida ou o contacto e o conteúdo de
uma mensagem recebida. Utilizam o serviço TextToSpeech do sistema operativo
Android [27] para o efeito.
29
4.2.1 Algoritmo utilizado para tratar os dados do sensor de
proximidade
O sensor de proximidade é utilizado para detectar se o dispositivo está ou não no
bolso do utilizador.
A ideia base seria, periodicamente, verificar o valor que este retorna (normalmente tem
apenas um conjunto de dois valores possíveis: perto ou longe), e se o retorno fosse
perto, considerava-se que o dispositivo estava dentro do bolso. Caso contrario
considerar-se-ia que o dispositivo estaria fora do bolso.
Na verdade o que a framework permite é implementar a interface SensorEventListener
[28], e registar a implementação como receptora dos eventos do sensor pretendido,
através do método onSensorChanged(Sensor sensor, int accuracy).
A opção tomada foi lançar uma Thread Java [29], por cada valor recebido do sensor de
proximidade e proteger o método de detecção com o Lock [30] comum a todas as
Threads. Abaixo temos o algoritmo desta detecção (no valor de retorno do sensor,
admitimos que o valor booleano verdadeiro significa perto):
detect (boolean value):
inOutLock.lock()
if(status.isTransitioning() and
value=status.hasProximitySensorChanged()):
status.cancelProximityTimer()
status.setNotTransitioning()
else:
toggleNearFar(value)
inOutLock.unLock()
toggleNearFar(boolean value):
status.setTransitioning()
if(status.isProximityTimerRunnging()):
status.cancelProximityTimer()
var newTimerTask:=newTimerTask{
run():
inOutLock.lock()
status.setNotTransitioning()
status.setProximitySensorChanged(value)
if(value):
status.setNear()
else:
status.setFar()
status.nullProximityTimer()
inOutLock.unlock()
checkinOutPocket()
}
status.scheduleNewProximityTask(newProximityTask, TRANSISITON_TIME)
À primeira vista estes artifícios podem parecer demasiado complicados para uma
simples detecção de um obstáculo à frente do sensor de proximidade, mas na verdade o
que se pretende aqui fazer é mais que isso.
30
O sensor de proximidade é reactivo, tanto a um bolso, como a uma mão que
inadvertidamente o utilizador lhe põe à frente e, como tal, não queremos que o sistema
“se deixe enganar” tão facilmente. É aqui que entra o conceito de transição.
Sempre que o valor do sensor for actualizado é chamada a rotina detect, e esta verifica
se o sistema está em transição.
Se estiver em transição e o valor actual for diferente do último e perto, ou então, igual
ao último e longe, conclui-se que o caso é um “falso alarme” e a transição pode ser
descartada.
Caso contrario dá-se início a uma nova transição, o que implica, com um atraso t, lançar
uma nova tarefa paralela, que anula alguma eventual tarefa anterior do mesmo tipo, e
define como valor de proximidade o valor recebido pela tarefa que a lançou.
O atraso t é o valor de afinação deste algoritmo, já que representa o tempo de transição
em que a aplicação precisará de estar constantemente a detectar um objecto perto do
dispositivo, sem interrupções, para que o considere “dentro do bolso”.
A rotina checkInOutPocket() verifica o valor definido em setNear() ou setFar() para
decidir se considera que o dispositivo está dentro ou fora do bolso.
31
Quando é recebida uma chamada/mensagem escrita e o dispositivo vai tocar, o volume
de toque é posto a zero, momentaneamente, para que o mesmo possa ser ajustado sem
interferências. Se este processo for demasiado lento, o que acontece é que a chamada
pode terminar entretanto.
Explicando um pouco melhor o algoritmo, o que se faz aqui é obter uma amostra do
som ambiente, gravando para um buffer de tamanho BUFFER_SIZE, o qual é depois
percorrido com o objectivo de achar o seu máximo e o seu mínimo.
O valor absoluto (abs) da subtracção destes dois valores é a amplitude máxima
registada na amostra de som obtida. O valor máximo de amplitude registável pelo
dispositivo é o valor máximo do tipo de dados short.
Depois basta aplicar uma regra de três simples (a amplitude máxima está para o volume
máximo de toque assim como a amplitude máxima medida está para o volume a
definir), de forma a relacionar estes dois valores, e daí obter um valor de volume de
toque.
O tempo de gravação é dado pelo tamanho do buffer de gravação sendo que os
pormenores de inicialização do objecto AudioRecord [31] não são aqui descritos.
32
Daqui nasceu a funcionalidade “Use accelerometer sensor”, comum a ambas as versões
e acessível através do ecrã do modo inPocket.
33
associação a contactos), conseguindo-se fazer uma triagem e reduzir o problema ao
algoritmo que atribui as cores aos eventos de cada gráfico.
Cada vez que é gerado um gráfico, é necessário descobrir os eventos para aquele
período de tempo e, para uma correcta atribuição de cores, é necessário saber qual o
ponto de partida, ou seja, qual primeiro evento do primeiro gráfico gerado pela
aplicação: variável P, ponto de partida.
Era aqui que residia o erro, pois esta variável P não era respeitada quando se gerava o
gráfico do período actual. Estava-se a utilizar a primeira cor da palete e a actualizar o
valor da variável com o último contacto do gráfico actual. Ao actualizar a variável P
com um valor errado, o que acontecia era que se estragava a informação que o algoritmo
de cálculo das cores iria utilizar, para atribuir a cor aos contactos de eventos passados.
A solução, como é óbvio, foi apenas utilizar a primeira cor da palete, se o gráfico actual
for o primeiro a ser gerado pela aplicação. Também apenas neste caso se define o valor
da variável P. A partir daí, existirá sempre um ponto de partida para o cálculo de cores,
seja ele passado ou futuro (é futuro quando se calcula um gráfico anterior ao ponto de
partida).
Este mecanismo, dada uma chave, fornecida pelo Google Play para cada aplicação
paga, verifica se o utilizador comprou uma licença de utilização da aplicação. O
resultado desta verificação é dado pelo callback de um de três métodos, diferentes, para
os casos de licença válida, inválida, ou erro na verificação.
O que é recomendado fazer, na documentação da framework, em cada um dos casos é:
• Licença válida: Permitir o acesso do utilizador a todas as funcionalidades da
aplicação.
• Licença inválida: Restringir de alguma forma a utilização de algumas ou todas
as funcionalidades da aplicação.
• Erro na verificação: Considerar a aplicação como não licenciada e aplicar a
politica de licença inválida.
Os dois primeiros casos são pacíficos e as politicas sugeridas parecem-nos acertadas. Já
no caso de erro de verificação, as coisas se tornam um pouco mais complexas.
34
A primeira tentação é de facto seguir a politica sugerida, mas após um olhar mais atento
para a forma como a verificação funciona, percebemos que esta está dependente de uma
conexão à internet para poder ser executada.
Desta forma, seguir a politica sugerida significa restringir o acesso à aplicação a todos
os utilizadores que não tenham conexão à internet no momento da verificação. Se é mau
para quem desenvolve que hajam utilizadores a usar a aplicação sem licença, é
inaceitável restringir o acesso a quem a tenha comprado.
Com um pouco de leitura da documentação deste mecanismo, chega-se à conclusão de
que é feita cache da resposta da validação da licença, mas não é elaborado em que
casos. Se a resposta “erro de verificação” ficar em cache, este é um efeito ainda mais
nefasto, já que não é dada outra oportunidade de verificação enquanto a resposta estiver
em cache, algo que também não é quantificado na documentação.
Por estas razões, foi decidido, na versão Premium da aplicação Droid inPocket, não
seguir a politica sugerida no caso de erro de verificação. Nesse caso permite-se o acesso
total à aplicação, na esperança que da próxima vez que for feita uma verificação já
exista conexão à internet.
35
Figura 15 - Exemplo da aplicação Today sem licença de utilização
36
Capítulo 5 Lançamento da aplicação Droid
inPocket
Esta aplicação foi lançada pela primeira vez no Google Play (na altura chamado
de Google Market) em Novembro de 2010.
A versão da aplicação incluída neste lançamento era um protótipo minimamente
funcional, mas ainda pouco estável e com problemas recorrentes ao nível do consumo
excessivo de bateria e de inconsistências na interface com o utilizador.
Ainda assim, observou-se alguma adesão por parte dos utilizadores, de uma forma até
algo inesperada, dada a curva observada no gráfico de Instalações vs. Tempo:
1400
1200
1000
800
600
400
200
É de notar que, para além do lançamento no mercado, nada mais foi feito para divulgar
a aplicação e que, portanto, é difícil explicar o que causou este aumento repentino de
utilizadores. Ainda mais difícil de explicar se torna, se a isto adicionarmos o facto de
que este crescimento não se mostrou consistente e que pouco depois praticamente
desapareceu, como podemos ver no gráfico seguinte que inclui apenas o ano de 2012.
37
2450
2250
2050
1850
1650
1450
1250
15-Jan
22-Jan
29-Jan
5-Feb
12-Feb
19-Feb
26-Feb
4-Mar
11-Mar
15-Apr
22-Apr
29-Apr
6-May
18-Mar
25-Mar
1-Apr
8-Apr
1-Jan
8-Jan
13-May
20-May
27-May
Figura 17 - Instalações durante 2012 (cumulativo)
38
200
180
160
140
120
100
80
60
40
20
0
4-Dec
11-Dec
18-Dec
25-Dec
1-Jan
8-Jan
5-Feb
12-Feb
19-Feb
26-Feb
4-Mar
11-Mar
18-Mar
25-Mar
1-Apr
8-Apr
15-Apr
22-Apr
29-Apr
13-May
20-May
27-May
15-Jan
22-Jan
29-Jan
6-May
27-Nov
39
quem desenvolve aplicações gratuitas, principalmente se estas forem financiadas através
de publicidade, como é o caso da versão Free.
450
400
350
300
250
200
150
100
50
0
27-Nov 27-Dec 27-Jan 27-Feb 27-Mar 27-Apr 27-May
Olhando para este gráfico consegue-se perceber que, se o número de instalações diárias
não é favorável, o número de instalações activas é ainda menos encorajador.
Depois do período de crescimento inesperado entre Novembro de 2011 e Janeiro de
2012, o número de instalações activas veio sempre a decair até ao começo da campanha
publicitária em Maio de 2012.
Comparando este gráfico com o da figura 18, que mostra o número de instalações e
desinstalações diárias, percebemos que esta tendência foi revertida em Maio, não à custa
da diminuição do rácio de desinstalações, mas à custa de publicidade, ou seja, à custa da
subida do número de instalações.
40
100.00%
90.00%
80.00%
70.00%
60.00%
50.00%
40.00%
30.00%
20.00%
10.00%
0.00%
27-Nov 27-Dec 27-Jan 27-Feb 27-Mar 27-Apr 27-May
Após o período referido atrás como de instabilidade percebe-se que a tendência é que as
desinstalações tenham uma média acumulada de cerca de 58% e as instalações de 38%.
Este é talvez o sinal mais evidente de que a aplicação Droid inPocket não teve o sucesso
esperado, na medida em que para além de um eventual problema em divulgar a primeira
versão da aplicação, os utilizadores a quem esta chegou acabaram por a desinstalar, na
sua maioria.
Pode o leitor questionar-se sobre a razão pela qual foi utilizada um artifício tão
complicado para comparar as instalações com as desinstalações. De facto, à primeira
vista, parece algo rebuscado, mas há que ter em atenção o facto de que, embora
saibamos que no dia D foram feitas i instalações e d desinstalações, não sabemos em
que dia foram feitas as instalações que correspondem às desinstalações do dia D. Por
este motivo, para ver uma tendência, precisamos de acumular estes valores.
41
O ponto diferenciador entre esta e outras soluções que existem em inúmeros outros
websites do mesmo género, é a forma de cobrança desses mesmos lugares de destaque.
Enquanto a maioria cobra ao tempo ou ao clique, o AppBrain apenas cobra quando a
aplicação é efectivamente instalada pelo utilizador que clicou no anúncio. Esta solução
tem, pelo menos, a vantagem de se saber de antemão quantas instalações se conseguem
com determinada quantia em dinheiro.
Como já foi dito atrás, a campanha publicitária começou dia 14 de Maio de 2012 e
ainda está a decorrer. Até ao dia 2 de Junho de 2012, já tinha garantido 496 novas
instalações.
70
60
50
40
30
20
10
0
14-May
15-May
16-May
17-May
18-May
19-May
20-May
21-May
22-May
23-May
24-May
25-May
26-May
27-May
28-May
29-May
30-May
31-May
1-Jun
2-Jun
Como se pode ver pelo gráfico, o número de instalações é bastante instável, mas de
facto o AppBrain não dá garantias nenhumas para além de que apenas cobra por cada
instalação e não por cada clique. Em particular não dá garantias quanto ao número de
visualizações do anúncio, nem quanto ao número de instalações por período de tempo.
Os efeitos desta campanha já foram vistos em parte no capítulo 5.1, em termos de
número total de instalações também de instalações activas, pelo que não repetiremos
aqui essa informação.
Há porém um detalhe que não foi explorado quanto às médias acumuladas das
percentagens de instalações e desinstalações — gráfico da figura 20. Esse detalhe
poderá estar relacionado tanto com a publicidade, como com o lançamento da versão
final. É o que veremos adiante.
42
5.3 Mudança ligeira nas curvas de instalações e
desinstalações
Olhando para o gráfico da figura 20, a aplicação parece estar condenada ao
fracasso, por força do grande impacto que uma média acumulada de 58% de
desinstalações terá nas suas instalações activas.
A previsão piora se tivermos em conta que o lançamento da versão final da aplicação
(bastante mais estável e sem os recorrentes problemas de bateria e inconsistências ao
nível da interface) parece não ter efeito nesta questão.
A verdade é que um olhar mais atento sobre este gráfico, em particular sobre o período
que vai desde o lançamento da versão final até ao dia 2 de Junho, revela que podemos
estar perante uma mudança nesta questão, que poderá salvar a aplicação do fracasso.
60.00%
55.00%
50.00%
45.00%
40.00%
35.00%
11-May
12-May
13-May
14-May
15-May
16-May
17-May
18-May
19-May
20-May
21-May
22-May
23-May
24-May
25-May
26-May
27-May
28-May
29-May
30-May
31-May
1-Jun
2-Jun
Desinstalações Instalações
Figura 22 - Médias cumulativas de percentagem de instalações vs percentagem de desinstalações após o
lançamento da versão final da aplicação
Um olhar atento sobre este gráfico permite perceber uma tendência de subida da média
cumulativa da percentagem de instalações e uma descida da média acumulativa da
percentagem de desinstalações. A manter-se, esta tendência pode, a seu tempo, tornar a
aplicação viável, garantindo uma subida do número de instalações activas.
Para isto poderá estar a contribuir tanto o lançamento da versão final, na medida em que
há um ganho de qualidade relativamente ao protótipo da primeira versão, como a
campanha publicitária, na medida em que poderá estar a divulgar a aplicação junto de
utilizadores mais interessados nesta aplicação.
43
Capítulo 6 Conclusões
44
incompleta documentação do mecanismos de verificação de licenças de utilização
disponibilizado na framework (capítulo 5.5).
45
Bibliografia
46
[20] – Marketwire – Velti Acquires Mobclix:
http://www.marketwire.com/press-release/Velti-Acquires-Mobclix-LSE-VEL-
1328116.htm
[21] – Live Wallpapers – Android Developers:
http://developer.android.com/resources/articles/live-wallpapers.html
[22] – Software Framework – Wikipedia, the free encyclopedia:
http://en.wikipedia.org/wiki/Software_framework
[23] – Application Fundamentals – Android Developers:
http://developer.android.com/guide/topics/fundamentals.html
[24] – User Interface – Android Developers:
http://developer.android.com/guide/topics/ui/index.html
[25] – Singleton Pattern - Wikipedia:
http://en.wikipedia.org/wiki/Singleton_pattern
[26] – Lock (computer science) – Wikipedia:
http://en.wikipedia.org/wiki/Lock_(computer_science)
[27] – TextToSpeech – Android Developers:
http://developer.android.com/reference/android/speech/tts/TextToSpeech.html
[28] – SensorEventListener – Android Developers
http://developer.android.com/reference/android/hardware/SensorEventListener.html
[29] – Thread – Android Developers:
http://developer.android.com/reference/java/lang/Thread.html
[30] – Lock – Android Developers:
http://developer.android.com/reference/java/util/concurrent/locks/Lock.html
[31] – AudioRecord – Android Developers:
http://developer.android.com/reference/android/media/AudioRecord.html
[32] – Licensing Overview – Android Developers:
http://developer.android.com/guide/market/licensing/overview.html
[33] – AppBrain.com: http://www.appbrain.com/
Nota: Os endereços electrónicos listados acima foram acedidos pela última vez a 4
de Junho de 2012.
47