UNIVERSIDADE FEDERAL DO RIO DE JANEIRO ESCOLA POLITÉCNICA Construindo um Aplicativo Android para Vídeo SobDemanda com SOA-MC Autor: Orientador: Examinador: Examinador: _________________________________________________ Filipe Hiroshi Tenorio Yamamoto _________________________________________________ Heraldo Luis Silveira de Almeida, D.Sc. _________________________________________________ Aloysio de Castro Pinto Pedroza, Dr. _________________________________________________ Flávio Luis de Mello, D.Sc. Poli Junho de 2016 Data da Defesa: 16 de Junho de 2016 Curso: Engenharia da Computação e Informação (ECI) DRE 105036308 | [email protected] UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Escola Politécnica - Departamento de Eletrônica e de Computação Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária Rio de Janeiro - RJ CEP 21949-900 Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar qualquer forma de arquivamento. É permitida a menção, reprodução parcial ou integral e a transmissão entre bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem finalidade comercial e que seja feita a referência bibliográfica completa. Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es) e do(s) orientador(es). ii Yamamoto, Filipe Hiroshi Tenorio Construindo um Aplicativo Android para Vídeo Sob- Demanda com SOA-MC / Filipe Hiroshi Tenorio Yamamoto. – Rio de Janeiro: UFRJ/POLI, 2016. XI, 62 p.: il.; 29,7cm. Orientador: Heraldo Luis Silveira de Almeida, D.Sc. Projeto (graduação) – UFRJ/POLI, 2016. Referências Bibliográficas: p. 50. 1. Aplicativo Android. 2. Vídeo Sob-Demanda. 3. SOA-MC. I. Almeida, Heraldo Luis. II. Universidade Federal do Rio de Janeiro. III.Construindo um Aplicativo Android para Video Sob-Demanda. iii A Deus, à minha família e aos meus amigos, que nunca desistiram. AGRADECIMENTOS iv Agradeço a Deus por me dar forças para concluir mais uma etapa da minha vida; aos meus pais, pelo carinho e pelo apoio que sempre me deram; aos meus irmãos, pelo apoio incondicional; aos meus mestres pela paciência, atenção e por sua generosidade ao compartilhar conhecimento; ao meus coordenadores, em especial pelo professor José Ferreira de Rezende e professor Jano Moreira de Souza, por terem sido prestativos; in memoriam ao meu orientador Sergio Villas-Boas por acreditar no meu trabalho e por aceitar se aprofundar nele comigo; ao meu orientador Heraldo Almeida, que mesmo diante das dificuldades, assumiu a orientação com muita presteza; aos membros da banca por aceitarem analisar e discutir este trabalho; aos colegas e amigos que fiz durante esses anos de curso. Resumo do Projeto de Graduação apresentado à Escola Politécnica//UFRJ como parte dos requisitos necessários para a obtenção do grau de Engenheiro de Computação e Informação. v CONSTRUINDO UM APLICATIVO ANDROID PARA VÍDEO SOB-DEMANDA COM SOA-MC Filipe Hiroshi Tenorio Yamamoto Junho/2016 Orientador: Heraldo Luis Silveira de Almeida Curso: Engenharia de Computação e Informação Este trabalho apresenta o desenvolvimento de um software visualizador de transmissão de vídeo sob-demanda para o sistema operacional Android. Sendo um sistema operacional para dispositivos móveis e com filosofia open source, o Android possui grande participação no mercado e o aplicativo construído aproveita seu potencial para visualizar conteúdo de multimídia através da Internet. A construção utiliza a linguagem Java e o ambiente de desenvolvimento Eclipse, além de utilizar a arquitetura de software SOA-MC. Palavras-Chave: Android, Vídeo Sob-Demanda, SOA-MC. Abstract of Undergraduate Project presented to POLI//UFRJ as a partial fulfillment of the requirements for the degree of Computer and Information Engineer. vi BUILDING AN ANDROID APP FOR VIDEO ON-DEMAND USING SOA-MC Filipe Hiroshi Tenorio Yamamoto June/2016 Advisors: Heraldo Luis Silveira de Almeida Course: Computer and Information Engineering This paper presents the development of a software with video on-demand streaming viewing capabilities for the Android operating system. As an operating system for mobile devices and open source philosophy, Android has a large market share and the app built uses its potential to allow viewing of multimedia content through the Internet. The app is constructed with Java programming language and Eclipse as the development environment, and uses the SOA-MC software architecture. Keywords: Android, Video On-Demand, SOA-MC. Sumário vii Conteúdo CAPÍTULO 1 CAPÍTULO 2 INTRODUÇÃO .............................................................................................................. 1 TECNOLOGIA UTILIZADA ...................................................................................... 3 2.1 SISTEMA OPERACIONAL ANDROID .................................................................................................. 3 2.1.1 Sobre o Android .................................................................................................................... 3 2.1.2 Arquitetura ........................................................................................................................... 4 2.1.3 Kernel ................................................................................................................................... 5 2.1.4 Bibliotecas ............................................................................................................................ 5 2.1.5 Android Runtime ................................................................................................................... 6 2.1.6 Framework ........................................................................................................................... 6 2.1.7 Aplicações............................................................................................................................. 7 2.1.8 Ciclo de Vida ........................................................................................................................ 7 2.2 AMBIENTE DE DESENVOLVIMENTO ................................................................................................. 9 2.2.1 Software Utilizado ................................................................................................................ 9 2.2.2 Requisitos de Hardware ....................................................................................................... 9 2.2.3 Configuração ...................................................................................................................... 10 2.2.4 Executando um Aplicativo .................................................................................................. 11 2.3 MAXMIND GEOIP ......................................................................................................................... 14 2.3.1 Características Gerais ........................................................................................................ 14 2.3.2 Implementação do GeoLite ................................................................................................. 14 2.4 VÍDEO ........................................................................................................................................... 16 2.4.1 Codec .................................................................................................................................. 16 2.4.2 Container ............................................................................................................................ 16 2.4.3 Moov Atoms ........................................................................................................................ 17 2.5 ARQUITETURA SOA-MC .............................................................................................................. 17 2.5.1 Camadas ............................................................................................................................. 17 2.5.2 Implementação ................................................................................................................... 18 2.5.3 JSON ................................................................................................................................... 18 2.5.4 Vantagens ........................................................................................................................... 19 2.6 BANCO DE DADOS......................................................................................................................... 19 CAPÍTULO 3 O APP PORTACURTAS ............................................................................................ 21 3.1 REQUISITOS .................................................................................................................................. 21 3.2 ARQUITETURA .............................................................................................................................. 22 3.3 SOFTWARE SERVER-SIDE .............................................................................................................. 23 3.3.1 Busca.asp ............................................................................................................................ 23 3.3.2 Cadastro.asp ....................................................................................................................... 26 3.3.3 Comentar.asp...................................................................................................................... 26 3.3.4 Comentarios.asp ................................................................................................................. 27 3.3.5 ConsultaIP.asp ................................................................................................................... 28 3.3.6 Destaque.asp ...................................................................................................................... 28 3.3.7 Filme.asp ............................................................................................................................ 30 3.3.8 FilmeDaSemana.asp ........................................................................................................... 32 3.3.9 GeoIP.asp ........................................................................................................................... 32 3.3.10 GeoIP.dat ....................................................................................................................... 32 3.3.11 GravaSessao.asp ............................................................................................................ 33 3.3.12 JSON.asp ....................................................................................................................... 33 3.3.13 JSON_UTIL.asp ............................................................................................................. 33 3.3.14 Login.asp ....................................................................................................................... 34 3.3.15 Premios.asp ................................................................................................................... 34 3.3.16 Votar.asp........................................................................................................................ 35 3.4 APP ANDROID ............................................................................................................................... 36 3.4.1 AndroidManifest.xml .......................................................................................................... 36 3.4.2 Layouts ............................................................................................................................... 37 3.4.3 Menu ................................................................................................................................... 38 3.4.4 Values ................................................................................................................................. 40 3.4.5 BancoDados.java................................................................................................................ 40 3.4.6 Busca.java .......................................................................................................................... 41 viii 3.4.7 Busca_Item.java ................................................................................................................. 41 3.4.8 Busca_Montador.java......................................................................................................... 41 3.4.9 Cadastro.java ..................................................................................................................... 42 3.4.10 Comentar.java ............................................................................................................... 42 3.4.11 Comentarios.java ........................................................................................................... 43 3.4.12 Config.java..................................................................................................................... 43 3.4.13 Destaques.java ............................................................................................................... 44 3.4.14 Filme.java ...................................................................................................................... 45 3.4.15 Login.java ...................................................................................................................... 45 3.4.16 Player.java ..................................................................................................................... 46 3.4.17 Principal.java ................................................................................................................ 47 3.4.18 Sobre.java ...................................................................................................................... 48 3.5 DEMONSTRAÇÃO .......................................................................................................................... 49 CAPÍTULO 4 CAPÍTULO 5 CONSIDERAÇÕES FINAIS ...................................................................................... 55 REVISÃO BIBLIOGRÁFICA ................................................................................... 56 ix Lista de Figuras Figura 1 - Arquitetura do Android.................................................................................... 4 Figura 2 - Ciclo de Vida de uma Activity ........................................................................ 8 Figura 3 - Android SDK Manager .................................................................................. 10 Figura 4 - Instalando ADT no Eclipse ............................................................................ 11 Figura 5 - Dispositivo AVD ........................................................................................... 11 Figura 6 - Novo projeto Android .................................................................................... 12 Figura 7 - AndroidManifest.xml..................................................................................... 13 Figura 8 - Implementação ASP do GeoIP com API ....................................................... 15 Figura 9 - Exemplo de uso do GeoIP ............................................................................. 16 Figura 10 - Arquitetura SOA-MC .................................................................................. 18 Figura 11 – Diagrama simplificado das tabelas e colunas utilizadas para retornar um Filme ............................................................................................................................... 20 Figura 12 - Cliente/Servidor ........................................................................................... 23 Figura 13 - Diagrama da consulta SQL para Busca.asp ................................................. 25 Figura 14 - Diagrama da consulta SQL para Cadastro.asp............................................. 26 Figura 15 - Diagrama da consulta SQL para Comentarios.asp ...................................... 28 Figura 16 - Diagrama da consulta SQL para Destaques.asp .......................................... 29 Figura 17 - Diagrama da consulta SQL para Filme.asp ................................................. 31 Figura 18 - Diagrama da consulta SQL para FilmeDaSemana.asp ................................ 32 Figura 19 - Diagrama da consulta SQL para Login.asp ................................................. 34 Figura 20 - Diagrama da consulta SQL para Premios.asp.............................................. 35 Figura 21 - AndroidManifest.xml do Portacurtas........................................................... 37 Figura 22 - Menu no Android ......................................................................................... 39 Figura 23 – Values .......................................................................................................... 40 Figura 24 - Splash Screen ............................................................................................... 49 Figura 25 - Destaques com análise do IP ....................................................................... 49 Figura 26 - Destaques da Semana .................................................................................. 50 Figura 27 - Busca............................................................................................................ 50 Figura 28 - Resultados de Busca .................................................................................... 51 Figura 29 - Ficha do Filme ............................................................................................. 51 Figura 30 - Comentarios do Filme.................................................................................. 52 Figura 31 - Login ............................................................................................................ 52 Figura 32 - Usuário registrando comentário ................................................................... 53 Figura 33 - Usuário registrando voto.............................................................................. 53 Figura 34 - Configurações .............................................................................................. 54 Figura 35 - Exibição do vídeo ........................................................................................ 54 SIGLAS API – Application Programming Interface SDK – Software Development Kit UI – User Interface IDE – Integrated Development Environment UFRJ – Universidade Federal do Rio de Janeiro ADT – Android Development Tools IP – Internet Protocol ii Capítulo 1 Introdução Desde 2005, com a popularização do compartilhamento de vídeos na Internet com o advento do YouTube, o conceito de Video Sob-Demanda (em inglês, Video On- Demand) tem se tornado mais comum e mais acessível à população em geral. O próprio serviço de estatística deste website informa que 100 horas de vídeos são enviadas a cada minuto. No entanto, antes mesmo que o YouTube despontasse no cenário mundial, a Synapse, uma distribuidora de vídeos especializada em acervo de curta-metragem brasileiro, já mantinha no ar um projeto de distribuição e transmissão de vídeo pela Internet em 2002. Esse projeto foi chamado de Porta Curtas. Apesar da banalidade com que se trata a visualização de vídeos hoje, esse projeto esteve na vanguarda do desenvolvimento de Video Sob-Demanda no Brasil e contava com uma parceria com a Locaweb que fornecia a infraestrutura necessária para a hospedagem e transmissão dos arquivos Windows Media Video da época. Com a evolução da velocidade de conexão à Internet e com a adoção de novas tecnologias de compressão e visualização de vídeo, houve a necessidade de evoluir também o software que rodava por trás do sistema do Porta Curtas. Desta forma, a base do software migrou para o uso do Adobe Flash Player, cuja estimativa de penetração nos computadores dos usuários chegou a ser de 99% em Dezembro de 2008. Se a popularização da visualização de vídeos na Internet foi devido ao YouTube, podemos dizer que o dispositivo de telefonia celular iPhone também teve grande parcela de contribuição para a popularização de aparelhos smartphone. Temos hoje diversos modelos de dispositivos móveis, entre celulares, tablets e e-books, e também temos alguns sistemas operacionais para tais dispositivos bem posicionados no mercado: iPhone OS (iOS), Blackberry, Windows Phone e Android. Em termos de comportamento, há uma grande tendência de que as pessoas passem a usar menos tempo com TV e computadores, favorecendo o uso de mais horas em dispositivos móveis. Portanto, havia o questionamento sobre qual sistema operacional deveria ser utilizado para o aplicativo móvel de video sob-demanda. Em 2011, a empresa 1 de consultoria Gartner já indicava que o Android já dominava o mercado com 52,5% de Market Share, contra os 16,9% do Symbian e 15% do iOS. A escolha por desenvolver para Android foi fácil depois dessa análise. Ainda podemos considerar que o desenvolvimento do sistema operacional é da Google, uma das maiores empresas de tecnologia da atualidade, que fornece diversos produtos, serviços e ferramentas relevantes para o usuário comum ou para o desenvolvedor. O Android é gratuito, com filosofia de código aberto e baseado em Linux. O desenvolvimento é facilitado pelo SDK fornecido pela empresa para a construção de aplicativos, usando linguagem de programação Java e plugin para os IDEs mais conhecidos do mercado, incluindo o Eclipse. Como cada celular porta uma versão diferente do Android, também era interessante analisar qual era a versão mais utilizada para maximizar a compatibilidade e aumentar o número de usuários do aplicativo. Celulares com as versões Froyo (2.2) e Gingerbread (2.3.X) dominavam o mercado com 85,9% de Market Share. Versões mais novas ainda não possuiam muita adesão. Tendo elucidado a versão-alvo para com que seria desenvolvido, restava apenas duas definições. A primeira diz respeito ao formato de vídeo, para que a transmissão de vídeo pudesse estar ao nível de visualização no celular, considerando tamanho de tela, resolução, bitrate, velocidade média de conexão à Internet no Brasil e tamanho do aplicativo em si. Foi utilizado vídeos codificados em H.264/MPEG4-Part10 para diminuir o tamanho dos arquivos dos vídeos, sem perder qualidade sensível. A segunda definição a ser feita era sobre o controle do conteúdo multimídia com licenciamento regional por endereço IP. Para isso, foi considerada a solução caixa-preta já utilizada no website Porta Curtas: GeoIP do MaxMind, que é um serviço de geolocalização através do endereço IP. Como este aplicativo Android tem características acadêmicas, foi selecionada a versão gratuita do GeoIP, que é mais leve, possui banco de dados menor, menos características e API mais simplificada e limitada. O aplicativo Android tem como objetivo disponibilizar um subconjunto funcionalidades básicas do Porta Curtas, tais como: navegar pelo acervo disponível, buscar conteúdo, visualizar vídeos e ficha técnica limitada do filme, fazer login no sistema, comentar como usuário registrado, avaliar filme e restringir acesso apenas a endereços IP brasileiros. 2 Capítulo 2 Tecnologia Utilizada 2.1 Sistema Operacional Android Algumas características do sistema operacional Android serão apresentadas a seguir. Elas compreendem o básico para que se possa entender o desenvolvimento do aplicativo Porta Curtas. Além disso, será abordada as configurações feitas no ambiente de desenvolvimento para que se possa rodar o aplicativo no próprio computador através do emulador ou mesmo num dispositivo móvel, externo ao ambiente de desenvolvimento. 2.1.1 Sobre o Android O Android é um sistema operacional desenvolvido primariamente para aparelhos de telefonia celular com funcionalidade touchscreen, mas hoje abrange também outros dispositivos móveis como é o caso dos tablets. Ele se baseia em Linux e nasceu com o objetivo de atender padrões abertos para a indústria de telecomunicações. O Google inicialmente financiava o projeto Android e em 2005 comprou o projeto, passando a ser responsável diretamente pelo desenvolvimento do sistema. Como foi falado anteriormente, o Android atende a filosofia de código aberto e permite que outros desenvolvedores modifiquem e distribuam livremente o software. Justamente por ser aberto e de acesso facilitado, há uma grande comunidade de desenvolvedores que constroem e publicam diversas aplicações, comumente chamadas de Apps. Tais softwares são programados em linguagem Java e, em 2013, já são quase 1 milhão de aplicativos disponíveis no mercado oficial do Google, o Google Play. Com a colaboração da comunidade, tanto no desenvolvimento do sistema, quanto no desenvolvimento dos apps, o Android desbancou facilmente os outros sistemas operacionais que dominavam o mercado anteriormente: Symbian e iOS. 3 2.1.2 Arquitetura O Android foi construido numa arquitetura em camadas da seguinte maneira: Kernel Linux. É a base do sistema, incluindo drivers de hardware, rede, Bibliotecas. Programas que rodam em background (daemons) e serviços, sistema de acesso a arquivos e comunicações entre processos. escritos em C ou C++. Framework de Serviços. Programas em Java que executam num Virtual Machine, que auxiliam o desenvolvimento de software provendo funcionalidades ou controles específicos. Aplicações. Programas em Java que executam no Dalvik Virtual Machine, e constituem as aplicações utilizadas pelo usuário final. Figura 1 - Arquitetura do Android 4 2.1.3 Kernel O Kernel, software que gerencia a comunicação do hardware com as outras camadas de software, utilizado pelo Android é o do Linux. No caso da versão-alvo em que estamos desenvolvendo, é utilizado o Kernel do Linux de versão 2.6. Basicamente, controlam o uso do Audio, Conectividade (WiFi, Bluetooth, redes móveis 3G), dispositivos USB, tela, camera, gerência de energia, gerência de memória RAM, controles de entrada (teclado, mouse), gerência de processos, entre outros. 2.1.4 Bibliotecas O Android possui coleções de implementações que atendem um determinado comportamento. Essas bibliotecas foram escritas em linguagem C/C++ e são utilizadas por várias partes do sistema, além de estarem disponíveis através dos frameworks. As principais bibliotecas são: libc. Biblioteca C padrão do sistema para Linux, customizado para não ter WebKit. Biblioteca de código aberto que renderiza páginas Web com problemas de licença, e para ser pequeno e rápido. suporte a CSS, Javascript, DOM, AJAX, fullscreen, e visualização adaptativa. Media Framework. Biblioteca baseada na plataforma PacketVideo OpenCORE, que suporta vários formatos de vídeo, audio, imagem, e codecs de hardware e de software, incluindo reprodução, transmissão, download e reprodução progressiva de containers 3GPP, MPEG-4, AAC e MP3. Além disso, suporta encoders e decoders de vídeo e imagem, que incluem: MPEG-4, H.263, AVC (H.264) e JPEG. Isto é relevante para o que será abordado posteriormente. SQLite. Biblioteca que serve de armazenamento leve de dados transacionais. Basicamente, um sistema de gerência de banco de dados relacionais. Surface Manager. Biblioteca que ajuda a compor “superfícies”, gerenciando toda renderização de superfícies 2D e 3D, de todas as 5 aplicações. Tais composições podem utilizar aceleração por hardware 2D e OpenGL ES. Audio Manager. Biblioteca que gerencia a rota de cada saída de áudio para cada dispositivo, além de processar múltiplos fluxos de áudio. SGL. Biblioteca construída em cima da OpenGL para implementar funcionalidades de gráficos 3D. FreeType. Biblioteca que ajuda a renderizar fontes e bitmaps. 2.1.5 Android Runtime O Android possui uma implementação de Virtual Machine chamada Dalvik. Isso permite rodar qualquer aplicativo Android independentemente do dispositivo, seja celular ou tablet. Por outro lado, o uso de uma Virtual Machine significa que a performance não será tão rápida quanto num aplicativo completamente compilado. Com isso, o código é interpretado e traduzido para uma representação intermediária, para então ser executado. Com a necessidade de melhorar a performance, o Android implementa, a partir da versão 2.2, o Dalvik com a compilação just-in-time (JIT), fazendo com que o programa fique armazenado na memória em bytecode, mas com um segmento do código que está rodando compilado na máquina física para rodar mais rápido. Os apps são escritos em Java e compilados em Bytecode. Depois é convertido de arquivo .class para um arquivo .dex compatível com o Dalvik. Esse arquivo .dex é chamado de Dalvik Executable e foi criado levando em conta restrições de memória e velocidade de processamento. Além disso, o Dalvik permite instanciação múltipla, ou seja, cada aplicativo pode rodar numa instância própria da Dalvik Virtual Machine, melhorando a eficiência. Deste modo, a execução do app fica otimizada. 2.1.6 Framework Há ainda alguns serviços essenciais para a plataforma Android que são disponibilizados na camada Application Framework. Nele existem abstrações que proveem funcionalidades específicas para o desenvolvedor e que permitem uma melhor reusabilidade de software. 6 Alguns itens relevantes desta camada são: Activity Manager. Gerencia as atividades, que compõe com que o usuário pode interagir, o que significa que acaba gerenciando o ciclo de vida da aplicação. Resource Manager. Gerencia recursos do aplicativo, tais como textos e objetos multimídia. Notification Manager. Gerencia a visualização de notificações na barra de status do dispositivo. View System. Provê vários objetos de UI que podem ser criados e utilizados. 2.1.7 Aplicações A camada de aplicações é onde entra a aplicação feita pelo desenvolvidor para Android. Aqui os apps são escritos em Java, utilizando o SDK do Google, e fazendo uso dos frameworks, bibliotecas e APIs disponibilizadas para o desenvolvimento. O próprio sistema Android já possui algumas aplicações por padrão: Home (app inicial), Contatos, Fone, Navegador, entre outros. 2.1.8 Ciclo de Vida O ciclo de vida de uma aplicação Android passa pelo entendimento de pelo menos dois dos componentes básicos com que se constrói o projeto: Activity e Intent. Activity representa uma tela de interface de usuário. Dentro deste projeto, por exemplo, uma Activity é a tela com informações de um filme. Cada uma dessas activities são únicas, servem um objetivo e representam uma parte da aplicação Android. Intent é uma mensagem assíncrona que ativa uma Activity, podendo até mesmo conectar a componentes de outros aplicativos Android. Assim como a palavra sugere, um Intent representa uma intenção de ação, podendo “ver” ou “enviar” alguma coisa. Em outras palavras, o Intent é o que permite navegar entre Activities diferentes. Quando há uma Intent de chamar uma Activity, o método onCreate() é chamado. Neste momento em que a Activity é criada, alguns objetos estáticos são definidos: views são criados, dados são conectados, etc. Ao final, é seguido de onStart(). 7 Caso a Activity estivesse parada, o método onRestart() é chamado antes de ser seguido por onStart(). No método onStart(), a Activity começa a ser visível ao usuário. Caso a Activity esteja entrando em primeiro plano, o método a seguir é o onResume(). Caso contrário, se estiver sendo escondida, o próximo método a ser chamado é o onStop(). Chegando em onResume(), a atividade começa a ficar disponível para interação com o usuário e fica no topo da pilha de atividades. Caso outra atividade se torne mais prioritária na pilha de atividades ou a atividade atual fique escondida, o próximo método a ser chamado é o onPause(). Em onPause(), a atividade é pausada para que utilize menos recursos disponíveis até que seja retomada com o onResume() ou tornando invisível ao usuário com onStop(). Caso onStop() seja chamado, então outra atividade pode ter sido chamada ou esta chamada está em processo de destruição. Caso esta atividade ainda volte a ser iniciada, é seguido pelo método onRestart(). Se a atividade está sendo destruída, é chamado onDestroy(). Ao chamar o método onDestroy, o sistema finaliza a atividade. Segue abaixo o diagrama do ciclo de vida de uma Activity: Figura 2 - Ciclo de Vida de uma Activity 8 As Activities e os Intents geralmente são registradas num arquivo do projeto chamado AndroidManifest.xml. Este recurso que serve para detalhar diversas configurações do projeto será detalhado mais à frente. 2.2 Ambiente de Desenvolvimento 2.2.1 Software Utilizado Para desenvolver um aplicativo Android foi utilizado um ambiente de desenvolvimento integrado (IDE) com capacidade de desenvolvimento Java, além do kit de desenvolvimento de software (SDK) oficial do Android para o IDE escolhido. Para este projeto, utilizamos o Eclipse como IDE. Apesar de, ao longo do tempo, várias versões do Eclipse terem sido utilizadas, vamos comentar a configuração do ambiente com o Eclipse Standard 4.4 para Windows 32-bit lançado em 25 de Junho de 2014, com suporte ao Java 7 JRE/JDK. Para desenvolver o aplicativo do servidor, foi utilizado o software Notepad++ em versão 6.6.9 para o desenvolvimento em ASP e VBScript. E para manipulação da base de dados SQL Server 2008 R2 foi utilizado o software Toad for SQL Server em versão 6.1.0. Utilizamos a versão gratuita do serviço de geolocalização por endereço IP da empresa MaxMind, o qual descreveremos mais à frente. 2.2.2 Requisitos de Hardware Todos os softwares descritos acima são de versão gratuitas e não possuem requerimentos específicos de hardware. O computador utilizado para o desenvolvimento dos aplicativos tem a seguinte configuração: Processador: Intel Core i5 2500k @ 4500MHz SSD: Crucial M500 512GB Memória RAM: Kingston DDR3 16GB 1600MHz Sistema Operacional: Windows 7 Ultimate x64 O servidor Windows Server é um recurso contratado à Locaweb e possui configurações desconhecidas neste momento. 9 2.2.3 Configuração Antes de começar a usar o Eclipse, é necessário instalar o Android SDK e, usando o Android SDK Manager, selecionar os pacotes referentes às versões do sistema operacional Android. Figura 3 - Android SDK Manager Tendo instalado os pacotes, é necessário instalar um plugin ao Eclipse chamado Android Development Tools (ADT). Há de se notar que já é possível baixar e instalar uma versão em que o Android SDK já venha com o ADT integrado ao Eclipse, mas descreveremos o processo de instalação do plugin à parte. Abrindo o Eclipse e selecionando “Help > Install New Software”, adicionamos o local de onde o plugin será obtido, conforme a imagem abaixo: 10 Figura 4 - Instalando ADT no Eclipse Antes de começar um novo projeto é necessário ainda criar um dispositivo virtual onde o aplicativo será emulado. Dentro do Eclipse, em “Window > Android Virtual Device Manager”, cria-se um dispositivo especificando atributos de hardware e versãoalvo do sistema operacional Android. Figura 5 - Dispositivo AVD 2.2.4 Executando um Aplicativo Um novo projeto de aplicativo Android é criado da seguinte maneira no Eclipse: “File > New > Other > Android > Android Application Project”. O projeto precisa especificar o nome da aplicação, o nome do projeto, o nome do pacote, as versões-alvo do sistema operacional Android às quais o projeto se destina e opções de compilação. 11 Figura 6 - Novo projeto Android Com o projeto criado, algumas pastas e arquivos foram adicionadas para que se possa rodar e exportar o arquivo APK, que é o arquivo final da aplicação. As pastas fazem parte do projeto são: src: onde ficam todos os arquivos-fonte .java do projeto, agrupados em gen: onde o código é gerado para todos os recursos definidos no diretório pacotes que ajudam a categorizar o código de forma lógica. “res”. Android 2.3.3 e outros diretórios Android: possuem todas as classes necessárias para a aplicação do projeto rodar na versão-alvo selecionada. assets: onde se armazena outros tipos de arquivos que precisam ser acessados pelo aplicativo. bin: onde o compilador coloca arquivos gerados a partir do código-fonte, contendo os arquivos .class e o arquivo final .apk. libs: onde outras bibliotecas são armazenadas res: onde a maioria dos recursos da aplicação é armazenada, e é organizada em categorias diferentes: o anim: para arquivos XML que são compilados em objetos de animação 12 o color: para arquivos XML que descrevem cores o drawable: para arquivos bitmap (PNG, JPEG ou GIF), arquivos de imagem e arquivos XML que descrevem formas desenháveis ou objetos que contem múltiplos estados (normal, pressionado, focado). o layout: para arquivos XML que são compilados em layouts de tela o menu: para arquivos XML que definem menus da aplicação o raw: para outros tipos de recursos, similarmente ao “assets” o values: para arquivos XML que são compilados em outros tipos de recursos o xml: para outros arquivos XML que a aplicação precisa acessar Há ainda o arquivo AndroidManifest.xml que provê metadados da aplicação do projeto que o sistema operacional Android vai precisar para a execução. Nesse arquivo há o nome da aplicação, o ícone da aplicação, as Activities da aplicação, as permissões que a aplicação necessita, informações sobre versão-alvo, suporte às telas diferentes, entre outras opções de configuração. Figura 7 - AndroidManifest.xml Com o projeto pronto para execução, basta selecionar “Run > Run” e selecionar o dispositivo AVD criado anteriormente para ver o aplicativo no emulador. 13 2.3 MaxMind GeoIP Uma tarefa importante quando abordamos a distribuição de conteúdo é a restrição geográfica. Para cada país ou região, a Synapse pode determinar qual empresa explorará uma modalidade de distribuição específica para um subconjunto de conteúdo. Por isso, é importante ressaltar que esta implementação no Android também deve possuir um controle sobre onde é possível visualizar os vídeos. Há outras empresas consolidadas no mercado que já fazem essa restrição: Hulu e YouTube. Em alguns casos, são episódios de seriados que são liberados para visualização nos Estados Unidos, mas não são liberados para outros países. A seguir descreveremos como esse controle é implementado. 2.3.1 Características Gerais Um A Synapse usa para o projeto Porta Curtas a solução de geolocalização através do IP com o serviço GeoIP da empresa MaxMind. Há várias categorias, entre localização mais precisas como cidades e até bairros, ou apenas países. O ciclo de atualização do banco de dados de IPs é mensal, e há a possibilidade de contratar a versão off-line, em que se recebe os arquivos em formato .dat ou CSV, ou a versão online, em que você consome um webservice fornecidos por eles. O MaxMind também disponibiliza algumas APIs gratuitas, para algumas linguagens, enquanto a própria comunidade possui algumas APIs não-oficiais para suportar outras linguagens. 2.3.2 Implementação do GeoLite Enquanto a Synapse comprou essa solução paga, há também a versão gratuita chamada GeoLite, que conta com um banco de dados limitado, menos atualizado e com APIs diferentes. Esta será a versão utilizada na implementação Android por ser mais leve, mais fácil de implementar e por se tratar de um trabalho acadêmico, e não comercial. A instalação ocorre da seguinte maneira: No site do MaxMind, baixa-se o arquivo de banco de dados GeoLite para países e a API para a linguagem em questão 14 Faz-se o deploy dos arquivos no servidor, configurando apenas o caminho Faz-se a consulta utilizando a API. do arquivo de GeoIP.dat. o Neste caso fizemos o uso de oGeoIP.lookupCountryName(IP) para recuperar o nome do país o E o uso de oGeoIP.lookupCountryCode(IP) para recuperar o código do país. Com a definição do caminho do arquivo e os devidos tratamentos de erro, fazemos, nesta implementação, retornar com um objeto JSON, uma vez que trataremos todos os webservices com JSON no Android. O resultado final da implementação em ASP do GeoIP fica assim: Figura 8 - Implementação ASP do GeoIP com API O software é considerado caixa-preta, mas o funcionamento com a API é simples: precisamos fornecer um endereço IP utilizando a interface fornecida, e o serviço nos devolve o código do país. E com esse código do país, podemos filtrar o conteúdo por país no Android. Por exemplo: 15 Figura 9 - Exemplo de uso do GeoIP Para esta implementação Android, colocamos a funcionalidade de restrição por IP através de um webservice fornecido pela nossa aplicação server-side. Dessa forma, permitimos que o aplicativo fique consideravelmente mais leve, pois o tamanho dos arquivos necessários para fazer a consulta GeoIP facilmente extrapolaria algumas unidades de megabyte na versão gratuita GeoLite ou até mesmo centenas de megabytes na versão paga. Desta forma, também otimizamos a performance do aplicativo Android, ao transferir esse trabalho da consulta para o servidor executar. 2.4 Vídeo Desde 2011 na Synapse, alguns filmes são convertidos para formatos mais atuais de distribuição para Internet e aplica-se uma compressão para deixar os arquivos pequenos, mas sem perder qualidade de imagem. A troca de arquivos de vídeo WMV para um formato mais recente foi devido ao surgimento do iPhone como um mercado a ser atingido. 2.4.1 Codec Um dos formatos de codec utilizados na nova solução foi o H.264 (também chamado de MPEG-4 Part 10). Esse padrão de software para codificar e decodificar fluxo de dados de vídeo é um dos mais utilizados pela indústria no momento, incluindo o uso em discos Blu-Ray, e serviços de transmissão de vídeo como o YouTube, Vímeo e iTunes. 2.4.2 Container O container utilizado é o MPEG-4 Part 14, conhecido como um arquivo de extensão .mp4. Apesar de ser um padrão desenvolvido pela International Organization 16 for Standardization (ISO), a Apple sempre incluiu grande suporte a este container desde as primeiras versões do seu visualizador multimídia Quicktime. Da mesma forma, os dispositivos criados pela Apple também possuía suporte aos arquivos .mp4 e isso foi determinante para que a Synapse acolhesse esse formato de metarquivo como a solução para o mercado de dispositivos móveis. 2.4.3 Moov Atoms Uma característica importante da transmissão de vídeo com o H.264 é a capacidade de adicionar o índice de frames que precede cada átomo de dados do filme, no início do arquivo. Esses metadados (duração, framerate, escala de tempo, entre outros...) são codificados no filme e são chamados de moov atoms. Quando se codifica o vídeo com o H.264, é possível colocar isso no início do arquivo, permitindo a transmissão progressiva do vídeo. Em outras palavras, significa que o usuário não precisa esperar o download do vídeo terminar para poder começar a assisti-lo. Além disso, isso permite que o protocolo HTTP seja utilizado normalmente, em detrimento de soluções mais específicas e mais caras, como o aluguel de servidores de mídia, que utilizam software proprietário (em sua maioria), como por exemplo o Adobe Media Server. Nem mesmo é necessário o uso de outros protocolos, como o RTMP, o que poderia criar uma dificuldade de implementação no Android. 2.5 Arquitetura SOA-MC A arquitetura SOA-MC significa Service Oriented Architecture – Multiple Client. O propósito é oferecer a aplicação como serviço, disponibilizando uma interface pela Internet, acessível por webservices. No caso do SOA-MC, lidamos com duas camadas que são interligadas pelo protocolo HTTP e utilizamos dados do tipo XML, JSON ou CSV. 2.5.1 Camadas A primeira camada é a que provê o serviço, desempenhando o papel de servidor, implementando as regras de negócio e disponibilizando como webservices. 17 A segunda camada compreende os clientes que irão consumir o serviço disponibilizado. Esses clientes podem ser de plataformas diferentes e por isso recebem a designação de Múltiplos Clientes. Figura 10 - Arquitetura SOA-MC 2.5.2 Implementação Nesta implementação, fica claro que o aplicativo Android rodando num aparelho celular é um dos clientes. Poderíamos utilizar o mesmo serviço para um cliente web, ou até mesmo outra plataforma móvel. No servidor, teremos uma aplicação ASP que fornecerá serviços básicos consultas ao banco de dados, inserção de comentários, entre outras ações, utilizando mensagens JSON. A escolha pela tecnologia ASP se deve ao fato da empresa Synapse possuir sistemas legados em ASP aos quais serão integrados, o que torna a escolha natural para a solução. 2.5.3 JSON 18 A JSON (JavaScript Object Notation) é um padrão aberto para troca de dados. Apesar de ter herdado do Javascript a forma de representar estruturas de dados, é independente de qualquer linguagem, ou seja, qualquer linguagem de programação poderá ler ou escrever neste formato. É um formato muito utilizado para serializar e transmitir dados estruturados pela rede e é alternativo ao XML, que geralmente é mais pesado. Um exemplo de objeto JSON de resposta para a consulta de um filme: [{"Ds_Filme_Titulo":"Ess\u00EAncia","Nm_Arquivo_Foto":"essencia- E.jpg","Ds_Sinopse":"Na busca por \u00E1gua em um mundo seco, um sobrevivente encontra sua ess\u00EAncia.","Genero":"Anima\u00E7\u00E3o","Diretor":"Daniel Raban\u00E9a","Ds_Bitola":"indispon\u00EDvel","Pais":"Brasil","LocalProducao":"Indefinido ","Nr_Duracao":3,"Nr_Ano_Lancamento":2011,"NumComentarios":2,"NumPremios":2,"Nm_ Arquivo_Video":"http:\/\/www.videosrelevantes.com.br\/mp4\/essencia.mp4","Nr_Voto":null," Qt_Voto":null}] 2.5.4 Vantagens Uma grande vantagem de usar o SOA-MC é ter a necessidade de escrever as regras apenas uma vez e fazer a manutenção em apenas um lugar. Além disso, há a separação entre a lógica e a apresentação, o que pode significar um investimento menor ou melhor controlado, uma vez que haverá a equipe que desenvolve a lógica de negócios e outras equipes desenvolvendo os clientes apropriados. Dessa forma, desenvolve-se os clientes de acordo com a necessidade ou capacidade de desenvolvimento da época. 2.6 Banco de Dados O banco de dados que a Synapse utiliza para todos os projetos, incluindo o do Porta Curtas, é o SQL Server 2008 R2 que possui uma compatibilidade natural com os sitemas ASP/VBScript e ASP.Net/C# mantidos pela a empresa. As bases de dados de cada projeto costumam ter mais de 300 tabelas e milhões de registros, e por esse motivo apenas algumas tabelas mais relevantes serão apresentadas neste documento. Nesta seção, no entanto, mostraremos apenas um exemplo e no próximo capítulo, mais detalhes sobre as tabelas e as consultas. Exemplo: 19 Figura 11 – Diagrama simplificado das tabelas e colunas utilizadas para retornar um Filme 20 Capítulo 3 O app PortaCurtas 3.1 Requisitos Para que o aplicativo seja corretamente construído e para que atenda a necessidade inicial da empresa Synapse, é importante que se identifique os requisitos. Muitas vezes não é possível imaginar os desafios de implementação ao conversar com o cliente. Tendo isto em mente, podemos ver, por exemplo, que o aplicativo do lado do servidor nunca seria imaginado num primeiro momento ao ler os requisitos a seguir. O aplicativo Android deve ter uma tela de splash pra mostrar a marca do O aplicativo Android deve mostrar os mesmos destaques que a versão projeto Portacurtas e do Patrocinador web, quando fizer menção à filmes – exclui canais e outras páginas terceiras O aplicativo Android deve permitir a busca por filmes, usando título do filme O aplicativo Android deve permitir a visualização das informações básicas do filme, incluindo um diretor, um artista do elenco (quando houver), gênero, duração e ano de lançamento. O aplicativo Android deve permitir a visualização do arquivo de vídeo (quando houver) O aplicativo Android deve registrar a visualição do arquivo de vídeo por usuário não-logado ou logado O aplicativo Android deve ser capaz de fazer o login do usuário O aplicativo Android deve usar mesmo esquema de cores que o tema utilizado na versão web O aplicativo Android deve permitir que o usuário leia e faça comentários sobre os filmes O aplicativo Android deve permitir que o usuário vote num filme, atribuindo nota de 0 a 5. 21 3.2 O aplicativo Android deve fazer a verificação geográfica do endereço IP e impedir a visualização do arquivo de vídeo quando o país for diferente de “Brasil” O aplicativo Android deve ser menor que 1MB em tamanho de arquivo O aplicativo deve utilizar a estrutura e outros recursos já contratados pela a empresa Synapse, incluindo servidores, bancos de dados, imagens, vídeos e outros serviços contratados. O aplicativo deve ser construído mantendo a arquitetura já utilizada nos projetos ASP existentes, quando for possível. Arquitetura A Synapse sempre manteve projetos web desde 2001, trabalhando com ASP e outras linguagens procedurais. Isso levou a adoção de uma arquitetura modular, onde cada componente contém tudo que é necessário para executar e cobrir uma funcionalidade. A separação de conceitos foi uma preocupação que levou à modelagem de componentes distintos: Filme, Comentario, Voto, Destaque, entre outros. Preocupada com a manutenabilidade do código com uma equipe in-house de T.I. reduzida, a arquitetura do app do Portacurtas se assemelha ao do projeto web pré-existente. Além disso, com a limitação da conexão nativa ao banco de dados por parte do sistema operacional Android, foi necessário modelar um sistema Cliente-Servidor, em que uma aplicação ASP pudesse desempenhar a aquisição de dados junto ao banco de dados, fornecendo à aplicação Android um webservice em JSON. O fato de não existir um suporte para Android e existir para ASP, e pelo requisito de deixar o aplicativo Android leve, também foi implementado no servidor a resolução do endereço IP para código de país. 22 Figura 12 - Cliente/Servidor 3.3 Software Server-Side A aplicação implementada no servidor serve principalmente a dois propósitos: 1. Fazer a comunicação entre a aplicação Android e o banco de dados SQL Server, provendo um Webservice com output em JSON para que seja consumido pela aplicativo móvel. 2. Resolução e Processamento do endereço IP em países válidos com o GeoLite. Cada arquivo .ASP atinge uma das duas propostas acima e o deploy dessa aplicação é feita no servidor Windows na qual reside outras aplicações ASP e ASP.NET da empresa Synapse. Isso inclui a configuração do Internet Information Services (IIS) e o uso do Global.asa para determinar o local onde se executa tal aplicativo no servidor, cujas configurações são mantidas fechadas pela empresa de hospedagem Locaweb e não fazem parte do escopo deste trabalho. Segue abaixo a descrição de cada componente da aplicação ASP. 3.3.1 Busca.asp Este arquivo serve para buscar filmes que contenham no título do filme os termos especificados pelo o usuário. 23 Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado a string “strBuscar” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, remove preposições, remove espaços no início no fim da string. Caso a string não seja vazia, ela itera o contador de estatísticas de busca, e para cada palavra dentro da string, é verificado no banco se há uma incidência de um filme ativo que contenha aquela palavra no título do filme. Existindo um ou mais registros de filmes com as palavras da string, é retornado em formato JSON as 20 primeiras ocorrências com os dados: Id do Filme Arquivo da Foto do Filme Titulo do Filme Duração do Filme em minutos Ano de Lançamento do Filme Gênero do Filme Diretor do Filme (apenas o primeiro) Artista do Filme (apenas o primeiro) Sinopse do Filme, em português 24 Figura 13 - Diagrama da consulta SQL para Busca.asp 25 3.3.2 Cadastro.asp Este arquivo serve para cadastrar novos usuários de perfil “Usuário” no sistema do Portacurtas. Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado as strings “username”, “email” e “password” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, remove aspas das strings e transforma tudo em lowercase. Caso as três strings não sejam vazias, verifica-se se o email a ser cadastrado já está cadastrado no banco de dados na tabela Usuario. Se for este o caso, ele retorna em JSON a mensagem “EmailExistente”, indicando que o cadastro não foi realizado por já existir um outro cadastro com o mesmo email. Caso contrário, ele insere o novo usuário com o nome de usuário, email e senha que o usuário digitou, registrando a data do processamento deste cadastro e ativando o usuário com o perfil comum (“Usuario”). Conseguindo cadastrar o usuário no banco de dados, o arquivo retorna em JSON o status “OK”, indicando o sucesso da operação. Caso contrário, ele retorna em JSON o status “FALHA”, indicando a falha da operação de cadastro do usuário. Figura 14 - Diagrama da consulta SQL para Cadastro.asp 3.3.3 Comentar.asp Este arquivo serve para um usuário registrado e logado conseguir cadastrar um comentário sobre um determinado filme. 26 Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado a string “comentario”, e os inteiros “idUsuario” e “idFilme” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, remove aspas do comentário para evitar que a consulta SQL se quebre. Caso as três variáveis não sejam nulas ou vazias, verifica-se se os Ids do Filme e do Usuario são válidos, ou seja, se existe no banco de dados um filme com o ID Informado e se existe um Usuario com o ID informado. Se ambos forem válidos, ele retorna em JSON a mensagem “OK”, indicando que o comentário foi registrado. Caso contrário, ele retorna em JSON o status “FALHA”, indicando a falha da operação de cadastro do comentário de um usuário a um filme. 3.3.4 Comentarios.asp Este arquivo serve para obter os últimos vinte comentários de todos os usuários acerca de um determinado filme. Como apenas uma variável integer “ID” é passada via querysting, só é necessário verificar se a variável é de fato um número inteiro. Sendo este o caso, faz-se a conexão ao banco de dados e carrega os últimos 20 comentários liberados do filme de mesma ID. Tendo carregado com sucesso, o arquivo retorna em JSON: Nome do Usuário que fez o comentário Data que o Comentário foi feito Texto do Comentário do Usuário 27 Figura 15 - Diagrama da consulta SQL para Comentarios.asp 3.3.5 ConsultaIP.asp Este arquivo serve para resolver um endereço IP para um código de país, usando a biblioteca do GeoIP. Inicialmente, inclui a biblioteca gratuita do GeoIP e indica o local de rede, no servidor, onde se encontra o arquivo de dados caixa-preta “GeoIP.dat”. Caso o serviço do GeoIP não consiga abrir o arquivo informado, ele informa um erro. Caso contrário, o arquivo passa o endereço IP advindo da variável “IP” passada via querystring. No fim, exporta em JSON o código do país para o IP fornecido. 3.3.6 Destaque.asp Curtas. Este arquivo serve para obter os quatro últimos destaques da Home Page do Porta Não há nenhum input para este arquivo. Faz-se a conexão ao banco de dados e carrega os últimos 4 destaques que façam referência a algum filme do Portacurtas, ordenados por posição. Tendo carregado com sucesso, o arquivo retorna em JSON: 28 Título do Destaque URL da Foto do Destaque Texto do Destaque URL do Destino do Destaque Número da Posição do Destaque ID do Filme do Destaque Figura 16 - Diagrama da consulta SQL para Destaques.asp 29 3.3.7 Filme.asp Este arquivo serve para obter os dados básicos de um determinado filme. Como apenas uma variável integer “ID” é passada via querysting, só é necessário verificar se a variável é de fato um número inteiro. Sendo este o caso, faz-se a conexão ao banco de dados e carrega os dados do filme ativo de mesma ID. Tendo carregado com sucesso, o arquivo retorna em JSON: Título do Filme, em Português Gênero do Filme Sinopse do Filme, em Português Diretor do Filme (apenas o primeiro) Bitola do Filme País de Produção do Filme Duração do Filme, em Minutos Ano de Lançamento do Filme Número de Comentários do Filme Número de Prêmios do Filme URL do Arquivo de Vídeo Número de Votos Valores da Votação 30 Figura 17 - Diagrama da consulta SQL para Filme.asp 31 3.3.8 FilmeDaSemana.asp Este arquivo serve para obter o destaque, uma escolha editorial, da Home Page do Porta Curtas conhecido como “Filme da Semana”. Não há nenhum input para este arquivo. Faz-se a conexão ao banco de dados e carrega o último filme definido como “filme da semana”. Tendo carregado com sucesso, o arquivo retorna em JSON: Título do Filme, em Português URL do Arquivo de Vídeo do Filme URL da Foto do Filme Figura 18 - Diagrama da consulta SQL para FilmeDaSemana.asp 3.3.9 GeoIP.asp Este arquivo serve como biblioteca para resolver IP em país. Feito pela MaxMind. 3.3.10 GeoIP.dat Este arquivo binário serve como repositório de dados local que relaciona endereços IP a um país. Caixa-preta. Feito pela MaxMind. 32 3.3.11 GravaSessao.asp Este arquivo serve para registrar uma visualização de filme de um usuário registrado ou não. A estatística de visualização de filme por plataforma é essencial para o relatório apresentado ao patrocinador do projeto Porta Curtas. Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado a variáveis “idUsuario”, “idFilme”, “IP” e “tempo” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, ele verifica se o tempo de visualização foi corretamente detectado pelo player usado no Android. Caso contrário, ele define o tempo como 1 segundo. Caso o IP não tenha sido detectado corretamente também, ele deixa em branco. Como o ID do filme é um ID válido que já foi passado do ASP para o Android, não há necessidade de verificar a validade do ID. Se o ID do Filme estiver definido e o Id do Usuário também, ele insere a visualização de filme na plataforma Android com o IP e tempo definidos. Caso o Id do Usuário não esteja definido, ele registrar uma visualização de usuário não-logado. Em caso de sucesso ao executar a inserção no banco de dados, o arquivo retorna em JSON um status “OK” para indicar o sucesso da operação. Caso contrário, o arquivo retorna em JSON um status “FALHA” para indicar a falha da operação de registrar uma visualização de Filme na plataforma Android. 3.3.12 JSON.asp Este arquivo serve para adicionar a manipulação de objetos JSON, uma vez que o VBScript não possui nativamente esse suporte. Esta biblioteca foi feita e tornada disponível publicamente por Tuðrul Topuz. 3.3.13 JSON_UTIL.asp Este arquivo serve para adicionar a função “QueryToJSON()”, que exporta o resultado de uma consulta SQL para um objeto JSON. 33 3.3.14 Login.asp Este arquivo serve para autenticar um usuário ao sistema do Porta Curtas, fornecidos o email e a senha. Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado as strings “email” e “password” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, substitui caracteres especiais em caracteres “amigáveis” para a consulta SQL, remove as aspas das strings, remove espaços no início no fim da string e transforma tudo em lowercase. Caso as strings não sejam vazias, ele consulta o banco de dados para ver se o usuário existe. Em caso positivo, ele retorna em JSON o status “OK” indicando o sucesso da autenticação, juntamente com o Id do Usuario em questão. Em caso negativo, retorna o status “FALHA” indicando a falha na operação de autenticação (login) do usuário. Figura 19 - Diagrama da consulta SQL para Login.asp 3.3.15 Premios.asp Este arquivo serve para obter os prêmios de um determinado filme. Como apenas uma variável integer “ID” é passada via querysting, só é necessário verificar se a variável é de fato um número inteiro. Sendo este o caso, faz-se a conexão ao banco de dados e carrega os prêmios do filme de mesma ID. 34 Tendo carregado com sucesso, o arquivo retorna em JSON: Nome do Prêmio Ano do Prêmio Nome do Festival em que foi concedido o Prêmio Figura 20 - Diagrama da consulta SQL para Premios.asp 3.3.16 Votar.asp Este arquivo serve para um usuário registrado e logado conseguir cadastrar um voto sobre um determinado filme. Inicialmente, verifica se não há uma tentativa de SQL Injection antes de prosseguir. Tendo validado as variáveis “idUsuario”, “idFilme” e “voto” via querystring, ele inclui a biblioteca para exportação em JSON no ASP, e faz a conexão ao banco de dados SQL Server. Ao prosseguir, verifica-se se todas as variáveis são números inteiros, e se “voto” é um valor entre 0 e 5. Como o ID de Filme e ID de Usuário já foram enviados do ASP para o Android, não é necessário checar a validade destes. Se todas as variáveis estiverem definidas e validadas, ele insere o voto do usuário ao filme no banco de dados e retorna 35 em JSON a mensagem “OK”, indicando que o comentário foi registrado. Caso contrário, ele retorna em JSON o status “FALHA”, indicando a falha da operação de cadastro do voto de um usuário a um filme. 3.4 App Android A aplicação implementada no dispositivo móvel atende aos seguintes propósitos: 1. Exibir o conteúdo multimídia dos filmes contratados do Portacurtas na plataforma móvel. 2. Permitir que o usuário consiga achar os filmes, comentar e votar. 3. Fazer a transmissão de vídeo dos filmes para a plataforma móvel, verificando a restrição da execução somente em território brasileiro, através da verificação do endereço IP. Os arquivos do projeto atendem às necessidades levantadas e a versão-alvo mínima escolhida foi a API #7 (Android 2.2) ou superior, englobando mais de 90% dos dispositivos disponíveis neste momento. Segue abaixo a descrição de cada componente da aplicação ASP. 3.4.1 AndroidManifest.xml Conforme já falamos na seção 2.2, o arquivo AndroidManifest.xml é essencial para o aplicativo Android, uma vez que ele apresenta os metadados relativos ao projeto. Essencialmente, é um arquivo XML que ajuda a definir os seguintes itens: Schema Versão do Aplicativo Pacote Versão-Alvo do sistema operacional Android Permissões necessárias para o uso ou execução do aplicativo no sistema operacional Android Nome e Ícone do Aplicativo 36 Activities (telas de interface com o Usuário) e Intents Figura 21 - AndroidManifest.xml do Portacurtas No aplicativo Portacurtas, definimos a versão como “1” e puxamos o nome da versão do Value string “credito_versao”. Usamos como alvo-mínimo a versão “7” do SDK, o que significa que o aplicativo será compatível com a versão Android 2.1 Eclair (API 7) ou superior, atingindo mais de 90% do mercado Android. As permissões utilizadas são: “INTERNET”: para que seja possível fazer uma conexão à Internet e “ACCESS_NETWORK_STATE”: para que seja possível verificar o acessar o conteúdo remotamente. status de conexão, incluindo a informação do endereço IP. O ícone e o nome do aplicativo são definidos também por Values, e em todas as atividades aplicamos o tema “NoTitleBar.Fullscreen” para que o aplicativo rode em tela cheia e sem a barra do título. 3.4.2 Layouts Dentro do diretório “res/layout/” se encontram os layouts que definem o padrão da distribuição dos elementos gráficos de interface para cada Activity. De uma forma geral, o LinearLayout foi o Layout básico utilizado em todos os layouts, pois disponibiliza 37 ao usuário uma navegação em uma única coluna ou linha. Os nós-filhos consistem em Views ou botões: TextView: área para texto EditText: área para texto editável ImageView: área para imagem Button: botão Na necessidade de organizar os nós-filhos em linha, utilizou-se de outros LinearLayout com orientação horizontal ou TableRow. Para áreas com necessidade de rolagem do conteúdo, foi utilizado o ScrollView, que permite trabalhar com uma área maior que a dimensão física do display utilizado. 3.4.3 Menu Menus são opções comuns de interface ao usuário, para prover navegabilidade ou customização de experiência. No Android, a forma de implementar o menu é 38 padronizada. Ao escrever um arquivo XML “menu.xml” no padrão requerido em “res/menu/”, o usuário poderá usá-lo no aplicativo ao apertar o botão “menu” correspondente em seu dispositivo móvel. Figura 22 - Menu no Android As opções disponíveis no menu do aplicativo Portacurtas são: Opções: configurar informações de login (endereço de email e senha) e uso de player de vídeo. 39 Comentar: quando na Activity de um filme, é possível registrar um Sobre: abre a Activity com informações do aplicativo comentário 3.4.4 Values O Android permite que o desenvolvedor possa guardar valores comumente utilizados pelo aplicativo num diretório “res/values/”. É possível definir e guardar recursos como strings, arrays, plurals, estilos, booleanos, inteiros, dimensões, cores e outros recursos. Figura 23 – Values No aplicativo Portacurtas, definimos alguns valores que usamos como constantes, como é o caso do título do Aplicativo ou as cores utilizadas. 3.4.5 BancoDados.java Este arquivo serve para definir a classe BancoDados que consome o serviço em JSON do servidor e pré-processa os dados de acordo com o objeto JSON lido para que o próximo componente possa receber os dados de forma limpa e correta. 40 A classe mantém um array JSON de colunas (keys) e valores (values). Dependendo da classe que a invoque, BancoDados busca o JSON de acordo com os dados pedidos. Se é necessário pegar os dados relativos à ficha de um filme, então BancoDados analisa o JSON vindo da URL relativa ao “FILME”, lê como uma cadeia de strings e processa num arquivo JSON válido, para que a classe requerente possa receber os dados corretamente. 3.4.6 Busca.java Este arquivo serve para definir a classe Busca que recebe os termos buscados e mantém uma tela (Activity) com os resultados de busca. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “busca”. Ao pedir à classe BancoDados a consumação do webservice correspondente à busca, a classe Busca recebe o objeto JSON e faz o parsing do objeto a fim de separar os dados que serão utilizados. Tendo recebido e separado os dados sem problemas, ele atualiza o layout para adicionar os resultados de busca na tela, utilizando a classe Busca_Montador e a classe Busca_Item. 3.4.7 Busca_Item.java Este arquivo serve para definir a classe Busca_Item, que define as variáveis e métodos get e set para cada dado que deve ser apresentado no resultado de busca. 3.4.8 Busca_Montador.java Este arquivo serve para definir a classe Busca_Montador, que monta dinamicamente os itens de resultado de busca num determinado layout, de acordo com os resultados de busca que são passados. 41 3.4.9 Cadastro.java Este arquivo serve para definir a classe Cadastro, que serve para o usuário, ainda não cadastrado, efetuar o seu registro no sistema. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “cadastro”. Tendo preenchido os campos do formulário e apertado o botão de cadastro, esta classe pede à classe BancoDados que consuma o webservice referente ao cadastro. A classe Cadastro recebe um objeto JSON da classe BancoDados com o resultado do cadastro. Tendo recebido e separado os dados sem problemas, Cadastro verifica se a operação de cadastro foi efetuada com sucesso, e em caso positivo, exibe uma caixa de diálogo (Dialog) com a mensagem de êxito. Caso contrário, ele exibe outra caixa de diálogo com a mensagem de falha de operação. 3.4.10 Comentar.java Este arquivo serve para definir a classe Comentar, que serve para o usuário registrar seu comentário para um filme. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “comentar”. Tendo preenchido os campos do formulário e apertado o botão de comentar, esta classe pede à classe BancoDados que consuma o webservice referente ao ato de comentar. A classe Comentar recebe um objeto JSON da classe BancoDados com o resultado da operação de comentar. Tendo recebido e separado os dados sem problemas, Comentar verifica se a operação de comentar foi efetuada com sucesso, e em caso positivo, exibe uma caixa de diálogo (Dialog) com a mensagem de êxito. Caso contrário, ele exibe outra caixa de diálogo com a mensagem de falha de operação. 42 3.4.11 Comentarios.java Este arquivo serve para definir a classe Comentarios, que serve exibir os últimos comentários de um determinado filme. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “comentarios”. Ao ser retomada (onResume()), a classe atualiza os comentários, pedindo que a classe BancoDados consuma o webservice referente aos comentários. Então, a classe Comentarios recebe o objeto JSON e faz o parsing do objeto a fim de separar os dados que serão utilizados. Tendo recebido e separado os dados sem problemas, ele atualiza o layout para adicionar os comentários na tela. A classe ainda dá a opção do usuário inserir um comentário. Caso o usuário esteja logado, há um Intent para Comentar. Caso contrário, exibe-se um alerta de login e pede à classe Principal que se chame o login. 3.4.12 Config.java Este arquivo serve para definir a classe Config, que serve para configurar e gravar as configurações disponíveis para o aplicativo. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “config”. A classe utiliza o SharedPreferences para salvar as configurações feitas, que ficam gravadas persistentemente no sistema operacional. Ou seja, mesmo reiniciando o aplicativo, as preferências continuarão salvas naquele dispositivo até que outro commit de [chave;valor] tome o lugar do antigo. O usuário pode salvar suas informações de login (email e senha) e pode escolher o player de preferência ao tentar abrir o vídeo: usando o player nativo dentro do aplicativo Portacurtas ou usando um player de sua preferência, que esteja instalado no sistema. Ao clicar no botão de salvar, a classe faz um commit das chaves referentes ao login do usuário e da preferencia do player. Se caso houver alguma irregularidade com o que foi digitado 43 nos campos de formulário, um aviso Toast aparece para que o usuário tome ciência do problema. Esta classe também abriga algumas outras configurações invisíveis ao usuário, incluindo a URL do diretório de imagens, o modo DEBUG, a restrição por IP, o tempo de splash e o tempo de timeout para a execução do vídeo. 3.4.13 Destaques.java Este arquivo serve para definir a classe Destaques, que serve para exibir as escolhas editoriais do Portacurtas que são apresentadas como sugestões e destaques ao usuário. Como esta classe é precedida pela Activity do Splash Screen (tela com a marca Portacurtas), ela faz override do acionamento do botão “Back” (voltar). Isso faz com que em vez de voltar para a Activity anterior na pilha, ela acione um diálogo de confirmação de fechamento do aplicativo. Caso o usuário confirme a saída, o aplicativo é finalizado e as activities são destruídas. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “destaques”. Ela também publica um diálogo com a mensagem da análise do IP: caso o IP seja do código do Brasil, exibe a mensagem de sucesso. Caso contrário, exibe uma mensagem informando que o usuário não poderá assistir os vídeos. Esta classe pede à classe BancoDados a consumação dos webservices correspondentes ao filme da semana e aos destaques. Prosseguindo, a classe Destaques recebe os objetos JSON e faz o parsing dos objetos a fim de separar os dados que serão utilizados. Tendo recebido e separado os dados sem problemas, ele atualiza o layout para definir os títulos, imagens e textos dos destaques carregados. Caso o usuário clique num destaque, a classe define um Intent para a Activity do Filme selecionado. 44 3.4.14 Filme.java Este arquivo serve para definir a classe Filme, que serve exibir a ficha técnica do filme, com os dados básicos: sinopse, gênero, diretor, elenco, duração e ano de lançamento. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “filme”. Ao ser retomada (onResume()), a classe carrega os dados do filme, pedindo que a classe BancoDados consuma o webservice referente ao filme. Caso o filme tenha sido premiado, a classe Filme pede à classe BancoDados que consuma o webservice referente ao prêmio. Então, a classe Filme recebe o objeto JSON e faz o parsing do objeto a fim de separar os dados que serão utilizados. Tendo recebido e separado os dados sem problemas, ele atualiza o layout para exibir os dados do filme na tela. A classe ainda dá a opção do usuário votar. Caso o usuário esteja logado, a classe pede à BancoDados que consuma o webservice relacionado à operação de votar. E ao processar o objeto JSON do retorno, em caso de sucesso, uma mensagem Toast aparece com a indicação de sucesso na operação. Caso contrário, exibe-se um alerta de login e pede à classe Principal que se chame o login. Além disso, o usuário pode visualizar os comentários do filme. Nesse caso, a classe Filme define um Intent para Comentarios. E o usuário também pode efetuar um novo comentário para o filme em questão. Se este for o caso, a classe Filme define um Intent para Comentar. Se o usuário estiver com um IP não restringido, ou seja, um IP brasileiro, ele poderá visualizar o vídeo do filme, caso esteja disponível. Sendo este o caso, a classe Filme passa a URL para a classe Player e define um Intent para a classe Player. 3.4.15 Login.java Este arquivo serve para definir a classe Login, que serve para o usuário fazer o login (autenticação) com suas informações de conta. 45 Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “login”. Tendo preenchido os campos do formulário e apertado o botão de login, esta classe pede à classe BancoDados que consuma o webservice referente ao ato de logar. A classe Login recebe um objeto JSON da classe BancoDados com o resultado da operação de login. Tendo recebido e separado os dados sem problemas, Login verifica se a operação de login foi efetuada com sucesso, e em caso positivo, exibe uma caixa de diálogo (Dialog) com a mensagem de êxito. Caso contrário, ele exibe outra caixa de diálogo com a mensagem de falha de operação. Há ainda a opção do usuário não-cadastrado fazer um novo registro. Neste caso, a classe Login define um Intent para Cadastro. 3.4.16 Player.java Este arquivo serve para definir a classe Player, que serve exibir o arquivo de vídeo na tela do dispositivo. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “player”. Ainda no momento de criação, a classe verifica se deve tocar o vídeo no player interno ou externo, dependendo da configuração feita e salva na classe Config. Caso seja para tocar no player interno (player nativo padrão do sistema operacional Android), o vídeo é renderizado no VideoView do layout. Após a definição de onde vai tocar o vídeo, a classe Player invoca a execução do vídeo. Caso esteja tocando internamente, ela abre a URL do arquivo de vídeo passada anteriormente, e atribui um controle de mídia MediaController sobre o vídeo. Tendo o controle e video setados, o vídeo começa a execução. Caso esteja tocando externamente, a classe Player define um Intent do tipo de dados “vídeo/*”, para que o sistema Android forneça as opções disponíveis de player para o arquivo de vídeo informado. Ao ser retomada (onResume()), caso esteja tocando em player externo, a classe define o tempo como “1”, pois é impossível adquirir o tempo que o vídeo foi tocado num 46 aplicativo externo, e grava a sessão ao pedir que a classe BancoDados consuma o webservice referente à gravação da sessão de filme. Ao ser finalizar (onFinish()), caso o tempo que o vídeo foi tocado não tenha sido detectado apropriadamente, a classe define o tempo como “1” e grava sessão conforme comentado acima. Durante a execução do vídeo no player interno, alguns controles são overrided para que seja detectado, assincronamente, a duração do período da execução do vídeo. Além disso, os controles também são overrided para que possa detectar quando o vídeo foi terminado de executar, para que possa invocar a gravação de sessão – pedindo à classe BancoDados que consuma o webservice referente à gravação de sessão. 3.4.17 Principal.java Este arquivo serve para definir a classe Principal, que serve exibir a tela de Splash com a marca do Portacurtas e possui métodos globais que são utilizados por outras classes. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “main”. Ainda na criação, a classe invoca a definição e o carregamento das constantes definidas na classe Config. Ela checa se existe uma conexão à Internet, disponível no momento em que inicia. Caso não exista uma conexão, a classe exibe um diálogo alertando o usuário que não é possível conectar e obter os dados necessários para o aplicativo. Logo no início, a classe Principal pega o IP local do dispositivo e pede à classe BancoDados que consuma o webservice referente à verificação de IP com o serviço GeoIP no servidor, e recebe como retorno em objeto JSON o código de país. Após o tempo do splash ter passado, a classe limpa quaisquer valores residuais da última execução e define uma Intent para Destaques. Além disso, a classe também define um Intent para chamar o Login sempre que for necessário – ao comentar ou votar, estando o usuário deslogado, por exemplo. A classe define uma maneira de fazer o logging das atividades e adiciona o botão play às imagens dos filmes, para que o usuário entenda que há um vídeo disponível para a execução. 47 3.4.18 Sobre.java Este arquivo serve para definir a classe Sobre, que serve exibir as informações deste aplicativo Android – tais como autor e número da versão atual. Pela classe ser uma extensão de uma Activity, ela segue o ciclo de vida mencionado num capítulo anterior desde documento. Além disso, ao ser criada, ela define e reinicia variáveis e publica o conteúdo no layout “sobre”. A classe apenas exibe textos fixos sobre o desenvolvedor deste aplicativo e a versão atual do mesmo. 48 3.5 Demonstração Ao abrir o aplicativo no Android, exibe-se a splash screen com a informação do endereço IP da conexão atual. Tendo verificado que há conexão à Internet e os recursos são carregados e abre-se a activity “Destaques da Semana” com a verificação da resolução do endereço IP em código do país. Figura 24 - Splash Screen Figura 25 - Destaques com análise do IP 49 A partir dos Destaques,é possível abrir o filme da semana anunciado no topo da activity, visualizar os quatro destaques editoriais abaixo ou fazer uma busca de um filme por um título. Figura 26 - Destaques da Semana Figura 27 - Busca 50 Efetuando a busca pelo termo “amor”, uma activity de busca é iniciada e exibe os resultados de filmes que possuam “amor” como parte do título. Ao selecionar qualquer um dos resultados, a ficha do filme é carregada e é possível ver as informações básicas do filme em questão. Figura 28 - Resultados de Busca Figura 29 - Ficha do Filme 51 Ao selecionar o botão “Comentar”, a activity de Comentarios é lançada e exibe- se os comentários de outros usuários para o filme selecionado. Selecionando novamente o botão “Comentar”, é lançada a activity para efetuar o comentário se o usuário já estiver logado no aplicativo. Caso contrário, abre-se a activity de login. Figura 30 - Comentarios do Filme Figura 31 - Login 52 Com o usuário autenticado, é possível registrar o comentário ou o voto em relação ao filme selecionado. Figura 32 - Usuário registrando comentário Figura 33 - Usuário registrando voto 53 Se o filme selecionado possuir um vídeo cadastrado, e estando com um IP considerado brasileiro pelo GeoLite, é possível visualizar o vídeo no tocador de vídeo nativo do dispositivo Android ou num outro tocador instalado pelo usuário. Essas preferências são controladas a partir da activity de configuração, onde também é possível deixar os dados de autenticação do usuário salvos para próximas autenticações. Figura 34 - Configurações Figura 35 - Exibição do vídeo 54 Capítulo 4 Considerações Finais O projeto foi concebido como uma prova de conceito para uma aplicação móvel que permitisse a distribuição de conteúdo audiovisual em dispositivos móveis com um controle de restrição de geolocalização e atingiu os objetivos definidos inicialmente. Por não existir uma maneira nativa, no Android, de fazer conexão ao banco de dados, a dificuldade foi criar um aplicativo externo que rodasse num servidor e fornecesse os dados a serem consumidos via Webservices. Além disso, houve a necessidade de utilizar um componente à parte para implementar a restrição de Geolocalização. Isso também acarretou na decisão da hospedagem e processamento dos dados de tal restrição no lado do servidor para que não sobrecarregasse o aplicativo Android. Com a influência da disciplina cursada ainda em período letivo, a implementação foi feita em Android e foi ainda mais incentivada com o estágio na distribuidora de vídeos Synapse. Tendo em vista as tecnologias adotadas pela a empresa, o servidor Windows rodando aplicativos ASP e banco de dados SQL Server, e com o consumo do serviço MaxMind GeoIP, a solução foi facilmente desenvolvida. Ainda que a solução como um todo alcance seu propósito, ainda se encontra distante de uma experiência agradável ao usuário em termos de navegabilidade ou de padrões de desenho (design patterns) mais contemporâneos. É possível ainda sofisticar o lado do servidor com aplicativos mais robustos e com serviços terceirizados de geolocalização mais atualizados, para que a distribuição de vídeo também seja mais escalável e segura. 55 Capítulo 5 Revisão Bibliográfica [1] TAPSCOTT, D. WILLIAMS, A. D., Wikinomics: How Mass Collaboration Changes Everything. Portfolio, New York, 2006. [2] Amazon. Disponível em: http://www.amazon.com/ Acessado em: 23/08/2011. [3] Google. Disponível em: http://www.google.com/ Acessado em: 23/08/2011. [4] Facebook. Disponível em: http://www.facebook.com/ Acessado em: 23/08/2011. [5] Netflix. Disponível em: http://www.netflix.com/ Acessado em: 23/08/2011. [6] SCHAFTER, J.B., KONSTAN, J., RIEDL, J., “Recommender systems in ecommerce”. In Proceedings of the 1st ACM conference on Electronic commerce. Denver, Colorado, United States: ACM, 1999, pp. 158-166. [7] PATEREK, A., “Improving Regularized Singular Value Decomposition for Collaborative Filtering”. In Proc. KDD Cup and Workshop, 2007. [8] Folha do Estado de São Paulo. Disponível em: http://economia.estadao.com.br/noticias/economia+geral,vendas-nainternet-crescem-40-em-2010-mostra-e-bit,59544,0.htm Acessado em: 23/08/2011. [9] GOLDBERG, D., NICHOLS, D., OKI, B. M., TERRY, D., “Using collaborative filtering to weave an information tapestry”. Communications of ACM, vol. 35, no. 12, pp. 61–70, 1992. [10] SU, X. Y., KHOSHGOFTAAR, T.M., “A survey of collaborative filtering techniques”. Advances in Artificial Intelligence, 2009. 56