4.4 Aplicação de testes
4.4.1 Necessidades Android
Foi feito um estudo das necessidades para este projeto, uma vez que decidimos usar os sensores presentes no smartphone Android, sensores estes: acelerómetro, sensor de luminosidade, microfone, sensor de proximidade e GPS.
Após a análise e levantamento das interfaces necessárias, com recurso à documen- tação do Android Developer, bem como todos os métodos a elas associadas para o desenvolvimento deste projeto, procedeu-se à importação das bibliotecas Android necessárias. A adaptação destas bibliotecas serviu de base para o projeto apresen- tado neste mesmo documento.
Permissões e Armazenamento
As políticas de permissões (ou falta delas), servem para proteger a privacidade do utilizador do dispositivo. Uma vez que todas as aplicações são independentes umas das outras e ao sistema em si, todas as aplicações necessitam de solicitar ao disposi- tivo a permissão para aceder a conteúdos sensíveis como o acesso a SMS, contactos ou agenda. Para além disso, também alguns elementos de hardware como o Bluetooth ou a Câmara também precisam de permissões para que possam ser acedidos. Por defeito, nenhuma aplicação tem permissão para realizar alguma ação que inter- fira com outras, com o sistema, ou com dados do utilizador. Como tal, são declaradas no manifesto da aplicação as permissões necessárias para o funcionamento da mesma. O sistema operativoAndroid, dependendo depois do tipo de permissão, poderá for- necer automaticamente a permissão (permissão normal), ou terá que solicitar ao utilizador o consentimento do mesmo (permissão perigosa) [10].
Categorias de Permissões
Como referido, existem dois tipos de permissões do sistema, sendo elas as permissões normais e as permissões perigosas [10].
• As permissões normais são aquelas que não representam risco direto à privaci- dade do utilizador ou de outras aplicações. Um exemplo seria a permissão para definir um novo fuso-horário. Após ser declarada no manifesto uma permissão normal, o sistema concede automaticamente esta permissão.
• Já as permissões perigosas permitem que o sistema tenha acesso a dados sen- síveis do utilizador ou dados armazenados acerca de outras aplicações. A capacidade da aplicação aceder aos contactos do utilizador é uma permissão perigosa, por exemplo. Neste caso, após a declaração de uma permissão peri- gosa, o utilizador necessita de aprovar (ou não, se assim o desejar) a cedência de permissão explicitamente.
Em seguida na tabela 4.1 serão apresentadas as diferentes permissões, normais e perigosas, que poderão ser declaradas nas aplicações em geral.
Permissões Normais Permissões Perigosas ACCESS_LOCATION_EXTRA_ COMMANDS READ_CALENDAR ACCESS_NETWORK_STATE WRITE_CALENDAR ACCESS_NOTIFICATION_POLICY READ_CALL_LOG ACCESS_WIFI_STATE WRITE_CALL_LOG BLUETOOTH PROCESS_OUTGOING_CALLS BLUETOOTH_ADMIN CAMERA BROADCAST_STICKY READ_CONTACTS CHANGE_NETWORK_STATE WRITE_CONTACTS CHANGE_WIFI_MULTICAST_STATE GET_ACCOUNTS CHANGE_WIFI_STATE ACCESS_FINE_LOCATION DISABLE_KEYGUARD ACCESS_COARSE_LOCATION EXPAND_STATUS_BAR RECORD_AUDIO FOREGROUND_SERVICE READ_PHONE_STATE GET_PACKAGE_SIZE READ_PHONE_NUMBERS INSTALL_SHORTCUT CALL_PHONE INTERNET ANSWER_PHONE_CALLS KILL_BACKGROUND_PROCESSES ADD_VOICEMAIL MANAGE_OWN_CALLS USE_SIP MODIFY_AUDIO_SETTINGS BODY_SENSORS NFC SEND_SMS READ_SYNC_SETTINGS RECEIVE_SMS READ_SYNC_STATS READ_SMS RECEIVE_BOOT_COMPLETED RECEIVE_WAP_PUSH REORDER_TASKS RECEIVE_MMS REQUEST_COMPANION_RUN_ IN_BACKGROUND READ_EXTERNAL_STORAGE REQUEST_COMPANION_USE_ DATA_IN_BACKGROUND WRITE_EXTERNAL_STORAGE REQUEST_DELETE_PACKAGES REQUEST_IGNORE_BATTERY_ OPTIMIZATIONS SET_ALARM SET_WALLPAPER SET_WALLPAPER_HINTS TRANSMIT_IR USE_FINGERPRINT VIBRATE WAKE_LOCK
Neste trabalho foram usadas tanto permissões normais como perigosas. As permis- sões definidas foram então:
<manifest ...> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ... </manifest>
As permissões normais de bluetooth foram utilizadas para permitir que o dispositivo fosse capaz de detetar uma ligação bluetooth multimédia como uma coluna ou um headphones.
As permissões perigosas foram utilizadas para determinar se o dispositivo está a receber ou a efetuar alguma chamada telefónica, aceder à memória externa para escrita e leitura respetivamente, dos dados que iriam ser armazenados.
Como referido anteriormente, uma permissão perigosa implica que o utilizador con- ceda à aplicação essa mesma permissão explicitamente, como tal, na Figura 4.14, será apresentada a interface que é mostrada ao utilizador nesse mesmo instante.
Figura 4.14 – Exemplo de caixa de diálogo onde o sistema solicita uma permissão perigosa ao utilizador [10]
Armazenamento
O SO Android permite que dados/ficheiros sejam gravados de várias formas, no- meadamente na memória interna ou externa do dispositivo [33]. No presente caso, por uma questão de facilidade entre a passagem dos dados recolhidos pelos senso- res do dispositivo para o computador, para posterior processamento, foi decidido armazenar os dados nessa mesma memória do dispositivo.
Após concedida a permissão para a aplicação aceder, escrever e ler na memória do dispositivo é então necessária a criação desse ficheiro para armazenamento de dados. Este armazenamento de dados é fundamental para o pós-processamento dos dados nesta fase inicial do projeto, uma vez que os dados serão inicialmente processados com acesso à ferramenta Octave. É ainda necessário definir no separador das dependências uma biblioteca que permite escrever, ler, apagar e adicionar a ficheiros dados.
dependencies {
compile ’com.snatik:storage:2.1.0’ ...
}
Vamos portanto descrever como funciona esta API e o seu algoritmo para armaze- namento de dados.
• Inicialização - é definida uma nova Storage e um caminho para essa Storage. Storage storage = new Storage(getApplicationContext()); String path;
• Diretório - é depois definido o caminho para a Storage criada. No nosso caso foi definido como sendo o diretório dos Downloads.
String path =
storage.getExternalStorageDirectory
(Environment.DIRECTORY_DOWNLOADS);
• Nome do ficheiro e tempo de criação - é definido uma string que con- tém o nome do ficheiro, e outra que converte o tempo atual do sistema em milissegundos numa string, com o intuito de diferenciar o nome dos diferentes ficheiros criados, através do tempo de criação do mesmo.
String filename = "/data" ;
Long tsLong = System.currentTimeMillis() / 1000 ; String timeStamp = tsLong.toString() + ".txt" ;
• Criação do ficheiro - depois de definidos todos os parâmetros, é altura de criar o ficheiro propriamente dito. Esta declaração deve conter o caminho (diretório) bem como o nome do ficheiro.
storage.createFile(path+filename1+ts, "");
É de salientar que o nome do ficheiro vai ser ‘’data + tempo de criação do mesmo‘’. Assim, serve para distinguir umas recolhas de dados de outras. • Gravação dos dados - nesta fase só falta concatenar os dados que estão a
storage.appendFile (path + filename1 + ts,
new StringBuilder().append(dados).toString());
Neste passo salientamos o facto de ‘’dados‘’ ser a variável correspondente aos dados recolhidos propriamente ditos.