<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-8847417749346587759</id><updated>2013-05-06T10:22:30.604+02:00</updated><category term="WIfi" /><category term="verificacion" /><category term="flash" /><category term="Libros" /><category term="control" /><category term="Ubunchu" /><category term="Fedora" /><category term="Prueba" /><category term="configuración" /><category term="Path" /><category term="Dadga" /><category term="dd" /><category term="Sopcast" /><category term="bug" /><category term="remoto" /><category term="gdisk" /><category term="Haversine" /><category term="Canal" /><category term="sistema operativo libre" /><category term="Pegatinas" /><category term="Android Support" /><category term="personalizado" /><category term="ranking" /><category term="Epidermis" /><category term="Mi Escritorio" /><category term="Curso" /><category term="Escritorio" /><category term="make" /><category term="convertir" /><category term="sqlliteopenhelper" /><category term="CrunchBang" /><category term="Planetalinux" /><category term="Kubuntu" /><category term="Clínica" /><category term="Webcam 10.04" /><category term="Compiz" /><category term="Launchpad" /><category term="Comfusion" /><category term="email" /><category term="karaoke" /><category term="configurar" /><category term="Apache" /><category term="Usuario" /><category term="Manual Ubuntu" /><category term="guardar datos" /><category term="1%" /><category term="Gmail Manager" /><category term="Dalle" /><category term="aMule" /><category term="Radiotray" /><category term="Ghost" /><category term="SherlockDialogFragment" /><category term="GRUB 2" /><category term="100%" /><category term="solución" /><category term="LocationManager" /><category term="ogg" /><category term="Lynx" /><category term="Kaffeine" /><category term="ntfs" /><category term="Naranja" /><category term="Bluethooth" /><category term="LXDE" /><category term="descargar" /><category term="ActionBar" /><category term="Diaspora" /><category term="metasploit" /><category term="Peppermint Two" /><category term="ed2k" /><category term="Tuxinfo" /><category term="Gnome" /><category term="Mediaplayer" /><category term="MyLocationOverlay" /><category term="Lucid Linx" /><category term="Firefox" /><category term="Dominio propio" /><category term="Veterinaria" /><category term="mdf" /><category term="3pies" /><category term="Pacman" /><category term="Ricoh" /><category term="DifundeUbuntu" /><category term="Ubuntu Maverick Meerkat" /><category term="Bipanel" /><category term="Firefox 3.6.2 Ubuntu" /><category term="Grabar" /><category term="mp3" /><category term="BroadCastReceiver" /><category term="Ubuntu One" /><category term="copyleft" /><category term="Download Manager Tweak" /><category term="touchpad" /><category term="reproductor" /><category term="notification" /><category term="Blogroll" /><category term="Mageia" /><category term="Instalar Openoffice 3.2" /><category term="Blog" /><category term="json" /><category term="Openoffice 3.2" /><category term="MBR" /><category term="320 kbps" /><category term="VLC y TDT en Ubuntu" /><category term="mail" /><category term="Firefox 3.6" /><category term="conky" /><category term="Hazlo-Tu-Mismo" /><category term="Instalación Slackware" /><category term="listview" /><category term="VirtualBox" /><category term="stickerbook" /><category term="GRUB2" /><category term="pidgin" /><category term="OpenSuse" /><category term="BSD" /><category term="logo" /><category term="Openoffice" /><category term="estadísticas" /><category term="ubuntu tablet" /><category term="CursorAdapter" /><category term="video downloadhelper" /><category term="Fuentes" /><category term="Ubuntu Oneiric Ocelot" /><category term="abiertos" /><category term="South Park" /><category term="Fairtrade Foundation" /><category term="SherlockActionBar" /><category term="Chrome" /><category term="plugin" /><category term="Live" /><category term="archivo" /><category term="vídeo" /><category term="IRC" /><category term="umount" /><category term="Tucuman" /><category term="orientation" /><category term="Problemas" /><category term="Push" /><category term="draw9patch" /><category term="control de versiones" /><category term="Nouevau" /><category term="Terminal" /><category term="Trisquel" /><category term="r5u870" /><category term="miniatura" /><category term="Guía" /><category term="Libreoffice" /><category term="seleccionar foto" /><category term="GNOME Shell" /><category term="Debian" /><category term="wallpaper" /><category term="ntfs-config" /><category term="Madwifi" /><category term="phpmyadmin" /><category term="Ubuntu 9.1" /><category term="Arch Linux" /><category term="Ext4" /><category term="Thumbnail" /><category term="Firefox 5" /><category term="Open Source" /><category term="PHP" /><category term="repositorio" /><category term="sudo" /><category term="localizar" /><category term="convertir paquetes .rpm a .deb" /><category term="Crear" /><category term="emesene" /><category term="Lucid" /><category term="teclado" /><category term=".com" /><category term="HTM" /><category term="ATI" /><category term="samba" /><category term="Hardware" /><category term="Ext3" /><category term="ID3" /><category term="Encuesta" /><category term="make install" /><category term="DV7" /><category term="Aplicaciones" /><category term="PPA" /><category term="P2P" /><category term="Firefox 3.5" /><category term="toast" /><category term="TDT" /><category term="gmail" /><category term="keystore" /><category term="Applet" /><category term="Login" /><category term="openstickers" /><category term="MYSQL" /><category term="Gnome Format" /><category term="Red Hat" /><category term="Plymouth" /><category term="Qalculate" /><category term="synaptics" /><category term="web" /><category term="L40-12k" /><category term="audio-convert" /><category term="Zenwalk" /><category term="Plantilla" /><category term="Log" /><category term="phone" /><category term="Floola" /><category term="AF9013" /><category term="Ubuntu Quantal Quetzal" /><category term="Jaunty" /><category term="PSPComic" /><category term="Julián" /><category term="density" /><category term="Sopcast player" /><category term="hckorootx" /><category term="screen layout" /><category term="pdfimages" /><category term="iPod" /><category term="aspecto" /><category term="Ubuntu Server" /><category term="USB VirtualBox" /><category term="GPG" /><category term="Refugio" /><category term="Ubuntu Maverick" /><category term="IP" /><category term="app" /><category term="FZ21S" /><category term="Admob" /><category term="Pendrive" /><category term="Error" /><category term="strings" /><category term="QuakeLive" /><category term="Preview" /><category term="redondear y encuadrar imagenes" /><category term="Tuquito" /><category term="control personalizable" /><category term="xml" /><category term="Instalar Openoffice 3.2 desde respositorios" /><category term="Ubuntu Precise Pangolin" /><category term="HTC" /><category term="Lubuntu" /><category term="odp" /><category term="mono-common" /><category term="Subtítulos" /><category term="jpeg" /><category term="Avidemux" /><category term="soundconverter" /><category term="Couturier" /><category term="Thunderbird" /><category term="AR9285" /><category term="Movimiento" /><category term="AF9015" /><category term="Driver" /><category term="Abuso" /><category term="style" /><category term="Seamonkey" /><category term="Liferea" /><category term="Toshiba" /><category term="Google Analytics" /><category term="Traductor" /><category term="Cryptkeeper" /><category term="Niño" /><category term="VLC y TDT" /><category term="togglebutton" /><category term="reconocimiento de voz" /><category term="Juntar" /><category term="Openoffice 3" /><category term="Release Candidate" /><category term="Ministerio" /><category term="notificationmanager" /><category term="Wav" /><category term="Gpodder" /><category term="Free" /><category term="exploit" /><category term="Gugler" /><category term="Ubuntuzilla" /><category term="Channel" /><category term="icono" /><category term="juegos" /><category term="Wireless" /><category term="TDT y VLC" /><category term="Google Maps" /><category term="Killer Tux" /><category term="Twitter" /><category term="11.04" /><category term="Unir archivos en Ubuntu" /><category term="CNET" /><category term="Actualizar" /><category term="traducir" /><category term="dual" /><category term="9.10" /><category term="Blogday" /><category term="PSP" /><category term="CNAME" /><category term="ntfs-3g" /><category term="música" /><category term="youtube" /><category term="Pixma" /><category term="Hotmail" /><category term="Commander" /><category term="cbz" /><category term="Hacha Pro" /><category term="Addons" /><category term="rpm" /><category term="partición" /><category term="Themes" /><category term="11.10" /><category term="Photorec" /><category term="Refresco" /><category term="CPU" /><category term="Avermedia" /><category term="emulador" /><category term="Vaio" /><category term="maltrato" /><category term="parche" /><category term="OnScrollListener" /><category term="alertdialog" /><category term="Berkeley" /><category term="processdialog" /><category term="rj-45" /><category term="mundogeek" /><category term="gcm" /><category term="Ubuntu Open Week" /><category term="file" /><category term="Salida" /><category term="odt" /><category term="firmar aplicaciones" /><category term="Empathy" /><category term="AverTV" /><category term="Disco" /><category term="código fuente" /><category term="LAMP" /><category term="cvs" /><category term="Linux Mint" /><category term="servidor web" /><category term="Android Market" /><category term="OpenClipArt" /><category term="Epiphany" /><category term="nmap" /><category term="escaner" /><category term="configure" /><category term="estadística" /><category term="VolarX" /><category term="force" /><category term="servidor" /><category term="Audacious" /><category term="Java" /><category term="X" /><category term="Rapidshare" /><category term="VLC" /><category term="Distribución" /><category term="Mandriva" /><category term="WinFF" /><category term="Quake" /><category term="conexión internet" /><category term="carpeta" /><category term="Natty Narwhal" /><category term="Overlay" /><category term="Atheros" /><category term="Informático" /><category term="Libertades" /><category term="Ubuntu Week" /><category term="calculadora" /><category term="portátil" /><category term="anime" /><category term="Update" /><category term="iptables" /><category term="Mundial" /><category term="SigmaTel STAC9872AK" /><category term="PlanetUbuntu.es" /><category term="9.04" /><category term="Redes" /><category term="Midori" /><category term="notificación" /><category term="qBittorrent" /><category term="Repositorios" /><category term="Emprender" /><category term="Fragment" /><category term="Follow Friday Linuxero" /><category term="visor" /><category term="v0.5.859" /><category term="Desktop" /><category term="cover thumbnailer" /><category term="Gnome 3" /><category term="Dontzap" /><category term="Registro" /><category term="Afatech" /><category term="Avant Window Navigator" /><category term="Salckware" /><category term="Windows" /><category term="nuevas características" /><category term="service" /><category term="13" /><category term="Formatear" /><category term="Skype" /><category term="Unir archivos hacha" /><category term="Pygtranslator" /><category term="Auriculares" /><category term="audio" /><category term="IP1600" /><category term="servicio web" /><category term="git" /><category term="nueva" /><category term="Shutter" /><category term="HolaMundo" /><category term="FTP" /><category term="torrent" /><category term="Tipografía" /><category term="Impresora" /><category term="Unity" /><category term="video" /><category term="Ubuntutips" /><category term="Humor" /><category term="Primeros pasos con Ubuntu" /><category term="webupd8" /><category term="Máquina Virtual" /><category term="formateado" /><category term="Marcadores" /><category term="Deb" /><category term="Arista" /><category term="srt" /><category term="CookiePie" /><category term="IBM" /><category term="Darwin" /><category term="mempodipper" /><category term="GeoPoint" /><category term="aircrack" /><category term="cifrar" /><category term="EFI" /><category term="Ubuntu-es" /><category term="buscador" /><category term="Cpulimit" /><category term="Sliding Menu" /><category term="Opera" /><category term="ffmpeg" /><category term="Spotify" /><category term="Imagen para Virtualbox" /><category term="Live CD" /><category term="pdf" /><category term="Wicd" /><category term="USB" /><category term="Asturix" /><category term="OpenSuse 12.1" /><category term="Navidad" /><category term="GPL" /><category term="Slackware 13.0" /><category term="about:config" /><category term="Ruta" /><category term="1.0.0" /><category term="styles" /><category term="SlidingMenu" /><category term="Tip" /><category term="12.04" /><category term="Evolution" /><category term="Aniversario" /><category term="conexión" /><category term="Personalizar" /><category term="Pardus" /><category term="Eclipse" /><category term="ContentValues" /><category term="presentación" /><category term="BIND9" /><category term="Animales" /><category term="5.0" /><category term="Slackware" /><category term="batería" /><category term="Vagos" /><category term="SpreadUbuntu" /><category term="Play Google" /><category term="Cursor" /><category term="Gsopcast" /><category term="depuración" /><category term="Xubuntu" /><category term="Xfce" /><category term="JDownloader" /><category term="Extensiones" /><category term="Unix" /><category term="Python" /><category term="activity" /><category term="Añadir" /><category term="Pringao" /><category term="cliente" /><category term="Protocolo" /><category term="bin" /><category term="Gnome-Commander" /><category term="Cinnamon" /><category term="Root" /><category term="particionado" /><category term="ISO" /><category term="Alien" /><category term="cbr" /><category term="Micro" /><category term="Hacha" /><category term="GNU" /><category term="3.6" /><category term="contacts read" /><category term="Vacaciones" /><category term="splash" /><category term="Chromium" /><category term="publicidad" /><category term="http client asíncrono" /><category term="Fedora 17 Beefy Miracle" /><category term="usb-imagewriter" /><category term="Incrustar" /><category term="Manga" /><category term="Proyecto blog" /><category term="Papirux" /><category term="Impresión" /><category term="Conferencia" /><category term="gimp" /><category term="compartir" /><category term="camara" /><category term="firewall" /><category term="Webmin" /><category term="Facebook" /><category term="monitorizar" /><category term="LTS" /><category term="vs" /><category term="apk" /><category term="HP" /><category term="KDE" /><category term="Temas" /><category term="puertos" /><category term="12.10" /><category term="Comercio justo" /><category term="sitios referencia" /><category term="idiomas" /><category term="Multimedia" /><category term="Ultraportátil" /><category term="Veetle" /><category term="eLink" /><category term="sqlite" /><category term="intent" /><category term="limitar el consumo de CPU de un proceso" /><category term="banners" /><category term="Cola" /><category term="zenmap" /><category term="Archbang" /><category term="Oficina" /><category term="pdfmod" /><category term="version" /><category term="Fragmentación" /><category term="estilo" /><category term="Google" /><category term="vrms" /><category term="egit" /><category term="Sesión" /><category term="RIP" /><category term="revistas" /><category term="Meme" /><category term="startActivity" /><category term="Frecuencia" /><category term="pocos" /><category term="Linux" /><category term="flac" /><category term="kernel" /><category term="Easytag" /><category term="tonterías" /><category term="Ubuntu" /><category term="Gestor" /><category term="Karmic" /><category term="12" /><category term="Ctrl+alt+backspace" /><category term="registros" /><category term="hotkeys" /><category term="XGN" /><category term="Satellite" /><category term="install" /><category term="Día Ubuntu" /><category term="bluefish" /><category term="dialog" /><category term="Atix" /><category term="iR Shell" /><category term="Informe" /><category term="DNS" /><category term="VrtualBox" /><category term="MapView" /><category term="Guillermo Latorre" /><category term="img" /><category term="daniel" /><category term="rendimiento" /><category term="nrg" /><category term="desarrollo" /><category term="Collapsible menu" /><category term="ItemizedOverlay" /><category term="10.10" /><category term="banda ancha móvil" /><category term="Sheltermanager" /><category term="A815" /><category term="MapActivity" /><category term="Totem" /><category term="HttpClient" /><category term="insert" /><category term="localhost" /><category term="Reenvío" /><category term="Merger" /><category term="conversores" /><category term="values" /><category term="baseadapter" /><category term="Arranque" /><category term="RSS" /><category term="AutoComplete" /><category term="GPT" /><category term="Beta" /><category term="Mac" /><category term="onUpdate" /><category term="wikio" /><category term="Navegadores web en Ubuntu" /><category term="PC" /><category term="Ubuntu Week Español" /><category term="comprobar" /><category term="sharedpreferences" /><category term="ScenBeta" /><category term="Hoz" /><category term="Precise Pangolin" /><category term="IntentFilter" /><category term="Sony" /><category term="wussuo" /><category term="Cuenta simultánea" /><category term="Webcam" /><category term="Metadatos" /><category term="Instalar Openoffice 3.2 en Ubuntu" /><category term="FreeBSD" /><category term="ultrastar" /><category term="TiraEcol" /><category term="módem usb" /><category term="Ubuntu 11.04" /><category term="Ubuntu 10.04" /><category term="formato" /><category term="Error 1" /><category term="sql inyection" /><category term="Ubuntu-jp" /><category term="Pavilion" /><category term="m4a" /><category term="programación" /><category term="mkfs.ntfs" /><category term="Bug 1" /><category term="Canonical" /><category term="Hachemuda" /><category term="HTML" /><category term="Non-Free" /><category term="SimpleCursorAdapter" /><category term="Imágenes" /><category term="Hardy" /><category term="Proyecto Software Libre" /><category term="#FFL" /><category term="plugins" /><category term="Megaupload" /><category term="Tux" /><category term="DHCP" /><category term="base de datos" /><category term="Etiquetas" /><category term="BackTrack" /><category term="Ubuntu 11.10" /><category term="MapController" /><category term="Ubuntu 10.10" /><category term="Software Libre" /><category term="Abuela" /><category term="url" /><category term="descargar imagenes" /><category term="Blogrool" /><category term="ttf" /><category term="ejecter" /><category term="Servicio Técnico" /><category term="Problema" /><category term="joomla" /><category term="Master Boot Record" /><category term="actualización" /><category term="tablet" /><category term="Instalación" /><category term="entorno de desarrollo" /><category term="PulseAudio" /><category term="Sonido" /><category term="Ubuntu 9.10" /><category term="16" /><category term="Toña" /><category term="Pystream" /><category term="The Document Foundation" /><category term="atajo" /><category term="Richard M. Stallman" /><category term="Glabels" /><category term="UbuntuDay" /><category term="GRUB" /><category term="Nvidia" /><category term="msn" /><category term="portrait" /><category term="recursos" /><category term="Ubuntu 12.04" /><category term="Jugar" /><category term="Canon" /><category term="Complementos" /><category term="Mozilla" /><category term="Unetbootin" /><category term="Total Commander" /><category term="internet" /><category term="interfaz" /><category term="cue" /><category term="Software" /><category term="AWN" /><category term="GTK 3" /><category term="Android" /><category term="ElPais" /><category term="Offtopic" /><category term="HTML5" /><category term="MeTv" /><category term="Network Manager" /><category term="Correo" /><category term="fondos" /><category term="The Linux Foundation" /><category term="lanzador" /><category term="AutoCompleteTextView" /><category term="Script" /><category term="GNU/Linux" /><category term="HttpPost" /><category term="mount" /><category term="Karmic Koala" /><category term="arranque dual" /><category term="Google Cloud Messaging" /><category term="Compilar" /><category term="explicación" /><category term="herramientas" /><category term="Stallman" /><category term="Cd" /><category term="Medibuntu" /><category term="Camino" /><category term="Nautilus" /><category term="Sun" /><category term="EncFS" /><category term="ubuntu phone" /><category term="2.6.28" /><category term="Gestionar" /><category term="Curioso" /><category term="13.5" /><category term="Gparted" /><category term="Doctormo" /><category term="mensajería" /><category term="landscape" /><category term="fdisk" /><category term="R" /><title type="text">Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general</title><subtitle type="html">Ubuntu en concreto, GNU/Linux en general</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.nosinmiubuntu.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default?start-index=26&amp;max-results=25" /><author><name>Ángel Fernández Ochoa</name><uri>https://plus.google.com/108563870874955409518</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-xNDvrcTm9VI/AAAAAAAAAAI/AAAAAAAAC2I/VzmXSo-hVKY/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>564</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Nosinmiubuntu" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="nosinmiubuntu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Nosinmiubuntu</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-3163361100964650668</id><published>2013-04-17T10:02:00.002+02:00</published><updated>2013-04-18T00:58:45.482+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Login" /><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="Registro" /><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Cómo sincronizar Facebook Login entre Android y nuestro servidor</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxY/2cqVFjmb-dI/s1600/android-facebook.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxY/2cqVFjmb-dI/s1600/android-facebook.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Hace unas semanas hicimos una introducción a la &lt;a href="http://www.nosinmiubuntu.com/2013/03/integrar-sdk-facebook-en-android.html"&gt;&lt;b&gt;nueva API de Facebook para Android&lt;/b&gt;&lt;/a&gt;. Vimos los pasos necesarios para empezar a trabajar con ella y esta semana aprovecharemos lo ya visto para realizar algún ejemplo un poco más complicado.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small; text-align: justify;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small; text-align: justify;"&gt;Lo que vamos a implementar es un login con Facebook y vamos a sincronizarlo con nuestro propio servidor, comprobando si nuestro usuario está en nuestro sistema y si no lo está lo damos de alta con los datos que nos dé Facebook. Antes de continuar, si no visteis el anterior artículo de Facebook, es necesario que lo&amp;nbsp;completéis&amp;nbsp;para poder añadir esta librería a vuestro proyecto. La única parte que no es necesaria es la del código de la Activity.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En una pantalla de login como la que ya hemos hecho en el artículo &lt;b&gt;&lt;a href="http://www.nosinmiubuntu.com/2012/08/creando-nuestro-sistema-de-registro-y.html"&gt;Creando nuestro sistema de registro y login&lt;/a&gt;&lt;/b&gt;, vamos a añadir un botón que nos permita hacer login con nuestra cuenta de Facebook. Si nuestro email no está registrado en nuestra plataforma, entonces le pediremos a Facebook que nos dé los datos necesarios para poder hacer el registro.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En el artículo &lt;b&gt;&lt;a href="http://www.nosinmiubuntu.com/2012/08/creando-nuestro-sistema-de-login-y.html"&gt;Creando nuestro sistema de registro y login(III)&lt;/a&gt;&lt;/b&gt; aún no habíamos utilizado librerías para crear conexiones HTTP como la que utilizamos en &lt;a href="http://www.nosinmiubuntu.com/2012/10/peticiones-http-ahora-mucho-mas-faciles.html"&gt;&lt;b&gt;Peticiones HTTP ahora más fáciles&lt;/b&gt;&lt;/a&gt;, así que os aconsejo que si vais a utilizar el código del login que enlacé antes,&amp;nbsp;hagáis&amp;nbsp;un ejercicio de sustitución por esta librería.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;En nuestra App Android&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezamos incluyendo en la pantalla de login el siguiente código. Simplemente es un fragment que enlaza a la clase &lt;b&gt;ButtonLoginFragment&lt;/b&gt;. Debéis&amp;nbsp;sustituir en &lt;b&gt;android:name&lt;/b&gt; por el package donde&amp;nbsp;ubiquéis&amp;nbsp;esta clase.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;fragment android:name="&lt;span style="color: red;"&gt;aqui.va.el.nombre.de.vuestro.package&lt;/span&gt;.ButtonLoginFragment"&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;android:id="@+id/LoginFragment"&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;android:layout_width="match_parent"&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;android:layout_height="match_parent" /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso es crear la clase ButtonLoginFragment que aparece en el fragment anterior.&amp;nbsp;La clase ButtonLoginFragment es muy simple. Hereda de Fragment y nos devuelve la vista de el siguiente layout que explicaremos, &lt;b&gt;facebook_button.xml&lt;/b&gt;. Además instanciamos el botón de login específico de Facebook y le indicamos que pida permiso al usuario para acceder a su email.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Si&amp;nbsp;necesitáis&amp;nbsp;añadir más permisos a vuestra app&amp;nbsp;podéis&amp;nbsp;encontrar aquí más información,&amp;nbsp;&lt;a href="https://developers.facebook.com/docs/reference/login/#permissions"&gt;https://developers.facebook.com/docs/reference/login/#permissions&lt;/a&gt;. Pero tened en cuenta que cuantos más permisos&amp;nbsp;pidáis&amp;nbsp;más reacio será el usuario a dar permisos, así que estad seguros de que&amp;nbsp;necesitáis&amp;nbsp;cada uno de los permisos que&amp;nbsp;incluyáis.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class ButtonLoginFragment extends Fragment {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle       savedInstanceState) {&lt;br /&gt;  &amp;nbsp; &amp;nbsp;View view = inflater.inflate(R.layout.facebook_button, container, false);&lt;br /&gt;   &amp;nbsp; LoginButton authButton = (LoginButton) view.findViewById(R.id.login_button);&lt;br /&gt; &amp;nbsp;   authButton.setReadPermissions(Arrays.asList("email"));&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt; &amp;nbsp;   return view;&lt;br /&gt;   }&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Después de esto vamos a crear el layout con el botón de login de Facebook, &lt;b&gt;facebook_button.xml&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_width="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_height="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:orientation="vertical"&lt;br /&gt;              android:gravity="center" android:layout_gravity="center"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;com.facebook.widget.LoginButton&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:id="@+id/login_button"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_width="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_height="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_gravity="center_horizontal|center_vertical"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_marginTop="0dp"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:layout_marginBottom="0dp" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis no tiene mayor complicación. Un LinearLayout para meter dentro el widget del &lt;b&gt;LoginButton&lt;/b&gt; que nos proporciona el SDK de Facebook. Ahora veamos como queda la activity que gestiona la pantalla de login. Veremos&amp;nbsp;únicamente&amp;nbsp;la parte que gestiona el login de Facebook para no complicarlo demasiado.&amp;nbsp;Debéis&amp;nbsp;cambiar además la herencia de vuestra Activity a FragmentActivity quedando &lt;b&gt;extends FragmentActivity&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private boolean try_login_facebook = true;&lt;br /&gt;private UiLifecycleHelper uiHelper;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp; &amp;nbsp; setContentView(R.layout.login);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; uiHelper = new UiLifecycleHelper(this, callback);&lt;br /&gt;    uiHelper.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezamos definiendo un booleano y una interface que nos ayudará en el ciclo de vida del login de Facebook. Y en el &lt;b&gt;onCreate&lt;/b&gt; a parte de llamar al layout login, inicializamos la interface.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private Session.StatusCallback callback = &amp;nbsp;new Session.StatusCallback() {&lt;br /&gt; &amp;nbsp; &amp;nbsp;@Override&lt;br /&gt; &amp;nbsp; &amp;nbsp;public void call(Session session, SessionState state, Exception exception) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (state.isOpened()) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if (state.isClosed()) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;@Override&lt;br /&gt;public void onActivityResult(int requestCode, int resultCode, Intent data) {&lt;br /&gt;     super.onActivityResult(requestCode, resultCode, data);&lt;br /&gt;     uiHelper.onActivityResult(requestCode, resultCode, data);&lt;br /&gt; }&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso es definir &lt;b&gt;callback&lt;/b&gt; que si os&amp;nbsp;fijáis&amp;nbsp;se le pasó a &lt;b&gt;uiHelper&lt;/b&gt; en el &lt;b&gt;onCreate&lt;/b&gt;. Esto nos permitirá actuar cuando el estado de la sesión de Facebook cambie. Y además en el &lt;b&gt;onActivityResult&lt;/b&gt;&amp;nbsp;lanzamos el método del mismo nombre de uiHelper para que realice las operaciones necesarias.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La parte importante viene ahora, en el &lt;b&gt;onResumeFragments&lt;/b&gt;. Aquí se obtiene el objeto &lt;b&gt;Session&lt;/b&gt; de Facebook y se comprueba si no es nula y está activa. Además utilizo una bandera, &lt;b&gt;try_login_facebook,&lt;/b&gt; porque se puede estar ejecutando&amp;nbsp;múltiples&amp;nbsp;veces este método y así evitamos que haga peticiones innecesarias.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El método &lt;b&gt;facebookLogin&lt;/b&gt; simplemente va a obtener el token que nos da Facebook y lo vamos a enviar a nuestro servidor web para hacer su parte del proceso de autenticación. Fijaros que si da un fallo la conexión con el servidor ejecuto el método &lt;b&gt;closeAndClearTokenInformation&lt;/b&gt;. Además se está utilizando la librería que ya se explicó en&amp;nbsp;&lt;b style="text-align: justify;"&gt;&lt;a href="http://www.nosinmiubuntu.com/2012/10/peticiones-http-ahora-mucho-mas-faciles.html" style="text-align: justify;"&gt;Peticiones HTTP ahora más fáciles&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;span style="text-align: justify;"&gt;para hacer la conexión.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;protected void onResumeFragments() {&lt;br /&gt; &amp;nbsp; super.onResumeFragments(); &amp;nbsp;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; final Session session = Session.getActiveSession();&lt;br /&gt; &amp;nbsp; if (session != null &amp;amp;&amp;amp; session.isOpened()) {&lt;br /&gt; &amp;nbsp;     if(try_login_facebook){ &amp;nbsp; &amp;nbsp;&lt;br /&gt;           try_login_facebook = false;&lt;br /&gt;           facebookLogin(session);&lt;br /&gt;    &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp;&lt;br /&gt; &amp;nbsp; } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void facebookLogin(final Session session){&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  AsyncHttpClient client = new AsyncHttpClient();&lt;br /&gt;  RequestParams rp = new RequestParams();&lt;br /&gt;  &lt;br /&gt;  rp.put("token", session.getAccessToken());&lt;br /&gt;  rp.put("tag", "login.facebook");                &lt;br /&gt;  &lt;br /&gt;  client.post("&lt;span style="color: red;"&gt;url de nuestro servicio web&lt;/span&gt;", rp, new AsyncHttpResponseHandler(){&lt;br /&gt;   @Override&lt;br /&gt;   public void onSuccess(String response){             &lt;br /&gt;    &lt;span style="color: red;"&gt;//Aquí ha vuelto del proceso de login, hay que verificar en la respuesta si tuvo éxito o no&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;         &lt;br /&gt;   }&lt;br /&gt;   @Override&lt;br /&gt;   public void onFailure(Throwable throwable){ &lt;br /&gt;    session.closeAndClearTokenInformation();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si quisierais obtener información del usuario&amp;nbsp;debéis&amp;nbsp;hacer una petición de este estilo en el lugar donde estamos llamando al método facebookLogin. Simplemente se hace una petición a Facebook para que nos dé los datos requeridos. Acordaros que este es un proceso asíncrono y debemos tratar estos datos en el onCompleted. Algo muy parecido lo vimos cuando &lt;b&gt;&lt;a href="http://www.nosinmiubuntu.com/2013/03/integrar-sdk-facebook-en-android.html"&gt;integramos el SDK de Facebook en Android&lt;/a&gt;&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onCompleted(GraphUser user, Response response) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt; &amp;nbsp; &amp;nbsp;    if (session == Session.getActiveSession()) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;    if (user != null) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;//Aquí con el objeto user podemos obtener datos del usuario logado&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;  }&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (response.getError() != null) { session.closeAndClearTokenInformation(    ); }}});&lt;br /&gt;request.executeAsync();&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;EN NUESTRO SERVIDOR WEB&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La última parte la debemos hacer en un servidor web y como siempre la hago en PHP. Ya hemos visto otras veces como realizar estos procesos y no es muy complejo. Simplemente le hemos enviado desde la aplicación Android un tag para decirle que vamos a hacer un login con Facebook y le pasamos también el token.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public function facebookLogin($token){&lt;br /&gt;    $url = "https://graph.facebook.com/me?access_token=". $token;&lt;br /&gt;    $json = @file_get_contents($url);&lt;br /&gt;&lt;br /&gt;    if($json != false){&lt;br /&gt;        $e = json_decode($json, true);&lt;br /&gt;&lt;br /&gt;        $email = $e["email"];&lt;br /&gt;        $name = $e["name"];&lt;br /&gt;        $username = $e["username"];&lt;br /&gt;        if($this-&amp;gt;isUserExisted($email) == false){&lt;br /&gt;            $this-&amp;gt;registerUser($username, $name, $email );&lt;br /&gt;        }&lt;br /&gt;        $response = array("success" =&amp;gt; "1");&lt;br /&gt;    } else {&lt;br /&gt;        $response = array("success" =&amp;gt; "0");&lt;br /&gt;    }&lt;br /&gt;    return json_encode($response);&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El método que finalmente se debe llamar en nuestro servicio web será facebookLogin y simplemente va a hacer una petición a Facebook con el token para que le devuelva la info del usuario. Esto nos tiene que devolver un json si se ha encontrado al usuario.&amp;nbsp;Podéis probar a&amp;nbsp;llamarlo desde un navegador para que&amp;nbsp;veáis&amp;nbsp;que aspecto tiene y que datos trae. Después&amp;nbsp;obtenemos los datos que nos ha dado Facebook, en nuestro caso necesitamos el email, nombre y nombre de usuario.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Buscamos en nuestro servidor el usuario por email con isUserExisted y si no existe lo registramos con registerUser.&amp;nbsp;Podéis&amp;nbsp;revisar el artículo &lt;b&gt;&lt;a href="http://www.nosinmiubuntu.com/2012/08/creando-nuestro-sistema-de-registro-y_15.html"&gt;Creando nuestro sistema de registro y login en Android (II)&lt;/a&gt;&lt;/b&gt;, encontrareis el método isUserExisted y la parte que registra un usuario la&amp;nbsp;podéis&amp;nbsp;meter en el método registerUser para que os sea más fácil utilizar en ambos sitios.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, se envía una respuesta indicando si el proceso ha tenido éxito o no. Esta la debemos evaluar en nuestra app Android. En este punto según&amp;nbsp;queráis&amp;nbsp;enfocar vuestra aplicación&amp;nbsp;podéis&amp;nbsp;navegar a otra pantalla, guardar en el terminal una determinada información o lo que vosotros&amp;nbsp;necesitéis. Lo importante es que hemos conseguido hacer login en nuestro terminal con las credenciales de Facebook y además hemos sincronizado estos datos con nuestro servidor.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=EZgt6UJsWHQ:-ML7aKwbF0s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3163361100964650668" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3163361100964650668" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/04/como-sincronizar-facebook-login-entre.html" title="Cómo sincronizar Facebook Login entre Android y nuestro servidor" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxY/2cqVFjmb-dI/s72-c/android-facebook.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-6994508152555301581</id><published>2013-04-04T11:38:00.000+02:00</published><updated>2013-04-04T22:33:23.981+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Maps" /><title type="text">Google Maps V2 en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://4.bp.blogspot.com/-u9QARaPrirI/T3wXcA4owZI/AAAAAAAAAQk/5xeIJa91IwE/s1600/button_map_off.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-u9QARaPrirI/T3wXcA4owZI/AAAAAAAAAQk/5xeIJa91IwE/s1600/button_map_off.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Hace ya un tiempo que ha aparecido la nueva API para Google Maps así que ya iba siendo hora de que le&amp;nbsp;echáramos&amp;nbsp;un vistazo para ver que es capaz de hacer esta nueva versión.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small; text-align: justify;"&gt;Hay unas cuantas cosas nuevas en esta versión, lo que más llama la atención es que ahora no necesitamos utilizar un MapActivity sino que se utilizan Fragments lo que&amp;nbsp;facilita&amp;nbsp;la tarea de integrar un mapa (o varios) en cualquier tipo de pantalla. Además los mapas se representan mediante vectores lo que según Google va a consumir menos ancho de banda y además los mapas se cachean con lo que no tendremos tantas zonas sin cargar. Por último, esta versión incluye mapas en 3D y se podrá cambiar la perspectiva del mapa lo que les dará mucho más juego a estos.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Los mapas de Google ahora vienen integrados en la librería de &lt;b&gt;Google Play Services&lt;/b&gt; por lo que si no la tenemos instalada debemos hacerlo ahora. Para ello en Eclipse vamos a &lt;b&gt;Window -&amp;gt; Android SD Manager&lt;/b&gt;, en la sección Extras buscamos Google Play Services y si no está instalado lo marcamos para su instalación.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-X_Nb8gVkvFU/UV0xMQ5e6JI/AAAAAAAAAyA/W-PU82POOPI/s1600/android_sdk_google_play_services.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://2.bp.blogspot.com/-X_Nb8gVkvFU/UV0xMQ5e6JI/AAAAAAAAAyA/W-PU82POOPI/s1600/android_sdk_google_play_services.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez hecho esto vamos a crear un nuevo proyecto en Eclipse a partir de esto que hemos instalado, para ello en &lt;b&gt;File -&amp;gt; New... -&amp;gt; Project -&amp;gt; Android Project From Existing Code&lt;/b&gt; pinchamos sobre &lt;b&gt;Browse&lt;/b&gt; y desde el directorio donde&amp;nbsp;tengáis&amp;nbsp;el SDK de Android seguís la siguiente ruta &amp;lt;PATH_SDK_ANDROID&amp;gt;/extras/google/google_play_services/libproject/google-play-services_lib/ ,&amp;nbsp;aceptáis&amp;nbsp;y listo. En la ruta &amp;lt;PATH_SDK_ANDROID&amp;gt;/extras/google/google_play_services/samples/&amp;nbsp;tenéis&amp;nbsp;una serie de ejemplos que&amp;nbsp;podéis&amp;nbsp;hacerle este proceso para tener a mano y ver que se puede hacer con esta librería.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, en el proyecto que vais a incluir los mapas&amp;nbsp;debéis&amp;nbsp;hacer referencia a este proyecto,&amp;nbsp;hacéis&amp;nbsp;botón derecho sobre vuestro proyecto y&amp;nbsp;seleccionáis&lt;b&gt;&amp;nbsp;Properties -&amp;gt;Android&lt;/b&gt; y en la parte derecha abajo de todo&amp;nbsp;añadís&amp;nbsp;una nueva librería.&amp;nbsp;Seleccionáis&amp;nbsp;la de Google Play Services y listo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora toca crear una key para que se puedan ver los mapas en nuestra aplicación, para ello tenemos que ir a la consola de las Google Apis en&amp;nbsp;&lt;a href="https://code.google.com/apis/console/"&gt;https://code.google.com/apis/console/&lt;/a&gt;. Ya vimos algo sobre ella cuando hablamos de &lt;a href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-i.html"&gt;como enviar notificaciones push&lt;/a&gt;. Simplemente os&amp;nbsp;creáis&amp;nbsp;un proyecto y vamos a activar el servicio de Google Maps en la sección Services buscando Google Maps API V2 y poniendo el switch en ON.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez activado debemos ir a la sección API Access a crear nuestra key. Vamos a hacer un paréntesis aquí para abrir un terminal y ejecutar lo siguiente:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esto nos va a genera una salida con un montón de texto, nos centramos en buscar la linea que empieza por &lt;b&gt;SHA1:&lt;/b&gt;, y copiamos el código que hay a continuación. La anterior instrucción es para cuando utilizamos el certificado de debug, para cuando estamos realizando pruebas en el emulador o en nuestro dispositivo de desarrollo. Para obtener el código para el certificado con el que&amp;nbsp;firmáis&amp;nbsp;las aplicaciones para producción&amp;nbsp;debéis&amp;nbsp;ejecutar lo siguiente (he marcado en rojo donde&amp;nbsp;debéis&amp;nbsp;incluir vuestros datos):&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;keytool -list -v -keystore &lt;span style="color: red;"&gt;/path/a/vuestra/keystore/my_keystore.keystore&lt;/span&gt; -alias &lt;span style="color: red;"&gt;nombre_de_vuestro_alias_name&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez que ya tenemos el código SHA1 de nuestro&amp;nbsp;almacén&amp;nbsp;de claves volvemos a la consola de Google Apis donde lo dejamos. Pulsamos el botón &lt;b&gt;Create new Android key...&lt;/b&gt; y pegamos el código SHA1. Además debemos escribir un punto y coma seguido del package de nuestra aplicación, si&amp;nbsp;tenéis&amp;nbsp;por ejemplo com.trespies.mapdemo quedaría algo así:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.trespies.mapdemo&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esto nos va a dar nuestra api key que debemos utilizar en nuestra aplicación. Y una vez listo esto podemos ir por&amp;nbsp;fin&amp;nbsp;a Eclipse para crear el primer ejemplo. Empezaremos por el archivo &lt;b&gt;AndroidManifest.xml&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezamos por meter la siguiente meta-data dentro de la etiqueta &lt;b&gt;&amp;lt;application&amp;gt;&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;meta-data&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp;android:name="com.google.android.maps.v2.API_KEY"&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp;android:value="&lt;span style="color: red;"&gt;AQUI_VUESTA_API_KEY_DE_GOOGLE&lt;/span&gt;"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo siguiente es incluir los siguientes permisos, dentro de la etiqueta &lt;b&gt;&amp;lt;manifest&amp;gt;&lt;/b&gt;, sustituyendo el package que está en rojo por el vuestro:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;permission&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:name="&lt;span style="color: red;"&gt;com.trespies.mapdemo&lt;/span&gt;.permission.MAPS_RECEIVE"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:protectionLevel="signature"/&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="&lt;span style="color: red;"&gt;com.trespies.mapdemo&lt;/span&gt;.permission.MAPS_RECEIVE"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La versión 2 de la API de Google Maps requiere Open GL ES versión 2 por lo que debemos añadir la siguiente etiqueta:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;uses-feature&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:glEsVersion="0x00020000"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:required="true"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y por último añadimos los siguientes permisos:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Los dos últimos no son estrictamente necesarios pero son recomendables instalarlos. Nos queda por último el layout y la activity. Vamos primero con el layout, yo le llamo &lt;b&gt;map_view_v2.xml&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;fragment xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;&amp;nbsp; android:id="@+id/map"&lt;br /&gt;&amp;nbsp; android:layout_width="match_parent"&lt;br /&gt;&amp;nbsp; android:layout_height="match_parent"&lt;br /&gt;&amp;nbsp; class="com.google.android.gms.maps.SupportMapFragment"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Este layout es muy sencillo, como único objeto tenemos un fragment que llama a una clase de nuestra librería Google Play Services y que se encargará de presentarnos el mapa. Veamos la activity:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class MapInfo extends FragmentActivity {&lt;br /&gt;&lt;br /&gt;    private GoogleMap mMap;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; &amp;nbsp; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setContentView(R.layout.map_view_v2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setUpMapIfNeeded();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected void onResume() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.onResume();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setUpMapIfNeeded();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; private void setUpMapIfNeeded() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (mMap == null) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (mMap != null) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setUpMap();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;private void setUpMap() {&lt;br /&gt;&amp;nbsp; mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Nuestra Activity no es una Activity sino un &lt;b&gt;FragmentActivity&lt;/b&gt;,&amp;nbsp;debéis&amp;nbsp;importar la librería para el FragmentActivity de la android.support.v4. En el onCreate se llama a nuestro layout y al método que inicializa el mapa,&amp;nbsp;&lt;b&gt;setUpMapIfNeeded&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En este método se intenta obtener el mapa del &lt;b&gt;fragment&lt;/b&gt; donde lo tenemos en la variable &lt;b&gt;mMap&lt;/b&gt; de tipo &lt;b&gt;GoogleMap&lt;/b&gt;, si no es nulo se va añadir un marcador con el método &lt;b&gt;setUpMap&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis es muy sencillo. Una vez que tenemos los pasos previos, añadir mapas es un juego de niños. Como os comenté antes hay bastantes ejemplos en la carpeta samples, así que si&amp;nbsp;queréis, &amp;nbsp;podéis&amp;nbsp;ir viendo más ejemplos por vuestra cuenta.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=1E3gmnFuheM:M0WWdnNLHCY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6994508152555301581" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6994508152555301581" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/04/google-maps-v2-en-android.html" title="Google Maps V2 en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-u9QARaPrirI/T3wXcA4owZI/AAAAAAAAAQk/5xeIJa91IwE/s72-c/button_map_off.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-8748251081249078898</id><published>2013-03-28T11:34:00.003+01:00</published><updated>2013-03-29T19:41:47.466+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Integrar SDK Facebook en Android</title><content type="html">&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxU/kCiz2vFPGWc/s1600/android-facebook.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxU/kCiz2vFPGWc/s1600/android-facebook.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Muchas de las aplicaciones que manejamos en nuestro día a día utilizan una o varias redes sociales como complemento para que nos podamos identificar en ellas, compartir información u otros fines. Estas redes sociales hacen las tareas del programador más fáciles con sus SDK. En el caso que hoy tratamos, Facebook, su SDK ya está por la tercera versión y en esta al igual que su app ya realiza su operaciones de forma nativa.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lo primero que debemos hacer es descargar el SDK para Android de Facebook, lo podemos encontrar en la web de desarrolladores&amp;nbsp;&lt;a href="https://developers.facebook.com/android/"&gt;https://developers.facebook.com/android/&lt;/a&gt;&amp;nbsp;Descargamos el zip y lo descomprimimos. Como siempre, yo suelo recomendar hacerlo en una carpeta donde tengamos el resto de librerías para llevar siempre el control de las librerías que tenemos.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso es crear un proyecto con Eclipse, para ello vamos a &lt;b&gt;File -&amp;gt; New -&amp;gt; Project... -&amp;gt; Android Project From Existing Code&lt;/b&gt;. Ahora seleccionamos la carpeta donde está el proyecto, en nuestro caso donde descomprimimos el anterior zip, seleccionamos la carpeta "facebook" y aceptamos. Como veis detectará el proyecto del SDK de Facebook. Finalizamos y ahora tenemos listo un proyecto que habrá que implementar en la aplicación que queremos que tenga&amp;nbsp;características&amp;nbsp;de Facebook.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por un momento nos olvidamos de Eclipse y nos vamos a la web de Facebook, &lt;a href="https://developers.facebook.com/apps"&gt;https://developers.facebook.com/apps&lt;/a&gt;, aquí necesitamos crear una app para poder realizar todas las operaciones de logueo y demás. Para ello pulsamos sobre el botón de Crear una nueva aplicación, le damos un nombre y un namespace.&amp;nbsp;Podéis&amp;nbsp;asignarle un icono y más características, pero ahora no viene &amp;nbsp;al caso y lo dejo para que lo&amp;nbsp;investiguéis&amp;nbsp;vosotros una vez acabemos el tutorial.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo importante ahora es en la página de nuestra app Facebook está en la sección Native Android App, activamos esta sección y otra vez tenemos campos para cubrir. Aquí el campo más importante es el de &lt;b&gt;Key Hashes&lt;/b&gt;. Este sirve para identificar vuestra app con Facebook mediante la keystore con la que se firma la app. En el campo clase fijaros como lo he cubierto en la imagen de abajo, el namespace de mi aplicación más el nombre de la activity donde ejecutaremos al final nuestro ejemplo.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-a_w99r-JZ6M/UVM4a4Gl9mI/AAAAAAAAAxw/Eitw1cMCTiA/s1600/create-facebook-app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://4.bp.blogspot.com/-a_w99r-JZ6M/UVM4a4Gl9mI/AAAAAAAAAxw/Eitw1cMCTiA/s1600/create-facebook-app.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a ver como generar este código. Para ello abrimos un terminal y escribimos:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Nos pide una contraseña, es &lt;b&gt;android&lt;/b&gt;, y nos devuelve una clave que introducimos en el formulario de Facebook. En este caso estamos utilizando el keystore de pruebas con las que se firman las apps mientras se va ejecutando en el emulador o en nuestro móvil de desarrollo. Para crear también la key hash de la keystore que utilizamos en producción, simplemente sustituimos "~/.android/debug.keystore" por la ruta de la keystore de producción. Y la clave será la que tengais vosotros para esa keystore. Por último, añadimos esa nueva key en el formulario de Facebook. Yo siempre tengo el de desarrollo y el de producción.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y por&amp;nbsp;fin&amp;nbsp;pasamos a nuestra app en Eclipse. Lo primero es crear un nuevo proyecto para Android. Yo le he llamado com.trespies.demo y el sdk mínimo de Android indico que es el 2.2(Froyo) y su sdk target 4.2(Jelly Bean). El resto lo dejo todo por defecto.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Sobre nuestro proyecto hacemos botón derecho, vamos a &lt;b&gt;Properties -&amp;gt; Android&lt;/b&gt;, y en la parte derecha vamos a la parte de abajo de todo y añadimos una librería, en este caso debe aparecer el FacebookSDK. Aceptamos y aplicamos.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En este punto, me ha dado un error porque ahora en mi proyecto hay dos versiones diferentes de la librería android-support-v4. Para solucionarlo simplemente quitamos la librería o bien de este proyecto o bien del proyecto del FacebookSDK y copiamos el del proyecto que no eliminamos. Yo prefiero eliminar la del proyecto de Facebook, así cada vez que&amp;nbsp;creéis&amp;nbsp;un nuevo proyecto no&amp;nbsp;tenéis&amp;nbsp;que repetir esta operación.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora&amp;nbsp;debéis&amp;nbsp;volver a la app de Facebook y copiar el app ID de la misma. De vuelta al proyecto, abrimos en la carpeta &lt;b&gt;values -&amp;gt; res -&amp;gt; strings.xml&lt;/b&gt;. Aquí creamos una nueva entrada, le llamamos &lt;b&gt;facebook_app_id&lt;/b&gt; y su value es el app ID que hemos copiado.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para poder conectarse a Facebook debemos dar permisos de internet a nuestra app en el archivo &lt;b&gt;AndroidManifest.xml&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Dentro del mismo archivo, dentro de la etiqueta application, añadimos el siguiente meta-data:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;meta-data android:value="@string/facebook_app_id" android:name="com.facebook.sdk.ApplicationId"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Con esto le decimos al sdk de Facebook cual es el app ID asociado con nuestra aplicación.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, añadimos una activity así:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;activity android:name="com.facebook.LoginActivity" /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos ahora con la parte final. Nos vamos al layout de la activity principal de nuestra aplicación y añadimos un TextView, yo le llamaré lblWellcome. Y por fin abrimos la activity e incluimos el siguiente código:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;super.onCreate(savedInstanceState);&lt;br /&gt;setContentView(R.layout.activity_main);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// start Facebook Login&lt;br /&gt; &amp;nbsp; &amp;nbsp;Session.openActiveSession(this, true, new Session.StatusCallback() {&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// callback when session changes state&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void call(Session session, SessionState state, Exception exception) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (session.isOpened()) {&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// make request to the /me API&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// callback after Graph API response with user object&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void onCompleted(GraphUser user, Response response) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (user != null) {&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TextView welcome = (TextView) findViewById(R.id.lblWellcome);&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;welcome.setText("Hello " + user.getName() + "!");&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;nbsp&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt; &amp;nbsp; &amp;nbsp;});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onActivityResult(int requestCode, int resultCode, Intent data) {&lt;br /&gt; &amp;nbsp;super.onActivityResult(requestCode, resultCode, data);&lt;br /&gt; &amp;nbsp;Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Que es lo que hace esto exactamente? En el método onActivityResult se utiliza el objeto Session de Facebook para realizar parte de los procesos de autenticación y autorización necesarios para el correcto funcionamiento de nuestra app.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;De momento nos centraremos en el &lt;b&gt;onCreate&lt;/b&gt; que es lo que nosotros debemos saber controlar. En el ejemplo aparecen algunos comentarios ya que este ejemplo está recogido directamente de la web de desarrolladores de Facebook.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Primero con el objeto &lt;b&gt;Session&lt;/b&gt; se abre una sesión activa y si no lo estuviera se pedirían las credenciales. Todo esto lo hace el SDK de Facebook sin que nosotros tengamos que hacer nada a mayores. Una vez que el usuario se ha autenticado y nos ha dado permiso para acceder desde nuestra app, se hace una petición a Facebook para que nos dé información sobre el usuario actual.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-PQgNDYizuWE/UVM3IApFkgI/AAAAAAAAAxo/mNLbU3zQ78M/s1600/device-2013-03-27-191233.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-PQgNDYizuWE/UVM3IApFkgI/AAAAAAAAAxo/mNLbU3zQ78M/s1600/device-2013-03-27-191233.png" width="192" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Para ello en el método &lt;b&gt;call&lt;/b&gt; de &lt;b&gt;StatusCallBack&lt;/b&gt; verificamos si la sesión está abierta y disponible. Para después realizar una petición asíncrona que nos devolverá los datos del usuario los cuales vamos a tener almacenados en el objeto &lt;b&gt;GraphUser&lt;/b&gt; y por último volcamos en nuestro TextView. No os&amp;nbsp;preocupéis&amp;nbsp;si tarda un rato en poner el nombre de vuestro usuario, a mi me tardo algo más de un minuto pero acabo&amp;nbsp;poniéndolo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El ejemplo en cuestión es la forma más simple de hacer un login con Facebook, pero existen muchas otras cosas que se pueden hacer. Por el momento tenemos la base para poder empezar a crear aplicaciones que utilicen una de las redes sociales más conocidas en internet.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=iEPij0uVbU8:_FP6seY0KLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/8748251081249078898" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/8748251081249078898" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/03/integrar-sdk-facebook-en-android.html" title="Integrar SDK Facebook en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-aCWbZKpLdXU/UVLJSSL7OpI/AAAAAAAAAxU/kCiz2vFPGWc/s72-c/android-facebook.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-1499743640912436778</id><published>2013-03-13T09:05:00.000+01:00</published><updated>2013-03-17T18:45:33.340+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="banners" /><category scheme="http://www.blogger.com/atom/ns#" term="Admob" /><category scheme="http://www.blogger.com/atom/ns#" term="publicidad" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Cómo añadir publicidad en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-BZM2WUqqE7s/UUAsBRZlDlI/AAAAAAAAAwQ/lWeC2QmAmgo/s1600/android_money_80.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-BZM2WUqqE7s/UUAsBRZlDlI/AAAAAAAAAwQ/lWeC2QmAmgo/s1600/android_money_80.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;Una vez que hemos lanzado al mercado nuestra aplicación nos quedan un par de pasos muy importantes, promocionar la aplicación para conseguir el mayor número de descargas posibles y monetizarla. Para este punto se pueden utilizar varias técnicas, pero si no estamos seguros de que se vayan a comercializar por si sola podemos hacer que sea gratuita e incluir publicidad.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small; text-align: justify;"&gt;Para incluir publicidad en nuestra aplicación Google nos ayuda con la librería de Admob con la cual empezar a ganar un dinero extra será coser y cantar.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-iTegf38j9A8/UUAtmJr2cJI/AAAAAAAAAwc/CDEpx4XCiDA/s1600/android-admob-all-done.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-iTegf38j9A8/UUAtmJr2cJI/AAAAAAAAAwc/CDEpx4XCiDA/s1600/android-admob-all-done.png" width="213" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo primero que debemos hacer es registrarnos en Admob a través de la siguiente url:&amp;nbsp;&lt;a href="http://www.google.com/ads/admob/"&gt;http://www.google.com/ads/admob/&lt;/a&gt;&amp;nbsp;Una vez registrados, accedemos a la web de Admob, primero en la pestaña &lt;b&gt;Cuenta&lt;/b&gt; seleccionamos &lt;b&gt;Detalles de pago&lt;/b&gt; y cubrimos el formulario con nuestros datos para poder recibir el dinero.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora vamos a &lt;b&gt;Sitios y aplicaciones&lt;/b&gt; y pulsamos sobre el botón &lt;b&gt;agregar sitio/aplicación&lt;/b&gt; y en nuestro caso seleccionamos Android. Ahora en Sitios y aplicaciones aparecerán las aplicaciones que tenemos configuradas. Pinchando con el ratón sobre la que acabamos de crear en gestionar configuración nos dirá el ID de editor que necesitamos para incluir en nuestra aplicación Android.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso será descargar la librería para Android desde aquí&amp;nbsp;&lt;a href="https://developers.google.com/mobile-ads-sdk/download"&gt;https://developers.google.com/mobile-ads-sdk/download&lt;/a&gt;&amp;nbsp;En nuestro caso seleccionamos la descarga para Android, pero&amp;nbsp;podéis&amp;nbsp;incluir esta publicidad en vuestras aplicaciones para iOS o Windows Phone.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Después de descargar el zip de la versión Android lo descomprimimos y dentro de él encontraremos un archivo .jar, en mi caso&amp;nbsp;GoogleAdMobAdsSdk-6.3.1.jar. Lo copiamos en la carpeta libs de nuestro proyecto. Actualizamos nuestro proyecto, y dentro de la carpeta libs aparecerá nuestra librería. Ahora hacemos click derecho sobre ella y seleccionamos &lt;b&gt;Build Path -&amp;gt; add to Build Path&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos ahora a nuestro archivo &lt;b&gt;AndroidManifest.xml&lt;/b&gt; y declaramos una Activity de este modo:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;activity android:name="com.google.ads.AdActivity" &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;También añadimos permisos de internet y de acceso al estado de la red así:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Lo siguiente que tenemos que hacer es abrir una de nuestras Activities donde queremos incluir la publicidad, y añadimos el siguiente código:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private AdView adView;&lt;br /&gt;private LinearLayout lytMain;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;      super.onCreate(savedInstanceState);&lt;br /&gt;      setContentView(R.layout.mylayout);&lt;br /&gt;&lt;br /&gt;      lytMain = (LinearLayout) findViewById(R.id.lytMain);&lt;br /&gt;      adView = new AdView(this, AdSize.BANNER, &lt;span style="color: red;"&gt;MI_ID_ADMOB&lt;/span&gt;);&lt;br /&gt;      lytMain.addView(adView);&lt;br /&gt;      adView.bringToFront();&lt;br /&gt;      adView.loadAd(new AdRequest());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onDestroy(){&lt;br /&gt;      if(adView != null)&lt;br /&gt;         adView.destroy();&lt;br /&gt;      super.onDestroy();&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Nuestro layout va a ser muy simple, veamos como queda.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lytMain"&lt;br /&gt; &amp;nbsp; &amp;nbsp;xmlns:tools="http://schemas.android.com/tools" &amp;nbsp;android:layout_width="fill_parent" android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Como veis no tiene absolutamente nada. Simplemente se instancia nuestro contenedor principal, en este caso un LinearLayout. Luego el objeto AdView al que se le pasa nuestro ID en el constructor, importante si queremos ser los beneficiarios de los ingresos por la publicidad y se añade al LinearLayout. En el onDestroy de la Activity liberamos recursos destruyendo la vista con la publicidad.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En mi caso la publicidad no apareció hasta pasados unos minutos, así que debeis tener paciencia.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Otra forma de hacerlo es incluir en nuestro layout el control AdView de esta forma:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lytMain"&lt;br /&gt; &amp;nbsp; &amp;nbsp;xmlns:tools="http://schemas.android.com/tools"&lt;br /&gt; &amp;nbsp; &amp;nbsp;xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"&amp;nbsp;android:layout_width="fill_parent" android:layout_height="fill_parent"&amp;gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;lt;com.google.ads.AdView android:id="@+id/adView"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;android:layout_width="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;android:layout_height="wrap_content"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ads:adUnitId="&lt;span style="color: red;"&gt;MI_ID_ADMOB&lt;/span&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ads:adSize="BANNER"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ads:loadAdOnCreate="true"/&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Fijaros como en el LinearLayout se ha declarado la librería de admob para que reconozca el widget AdView. En el onCreate el código se simplifica de esta forma:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;     super.onCreate(savedInstanceState);&lt;br /&gt;     setContentView(R.layout.list);&lt;br /&gt;&lt;br /&gt;     adView = ( AdView) findViewById(R.id.adView);&lt;br /&gt;     adView.loadAd(new AdRequest());&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis es muy simple incluir publicidad en una aplicación. Lo&amp;nbsp;difícil&amp;nbsp;comienza ahora conseguir que la aplicación sea conocida y obtener ingresos a&amp;nbsp;través&amp;nbsp;de la publicidad con ella. Una buena estrategia adoptada por muchos desarrolladores es crear dos versiones de la misma aplicación, una gratuita con publicidad y otra de pago en la que se elimina la publicidad.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=0dfEh40UfJ8:6MD6ZWHQFcU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1499743640912436778" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1499743640912436778" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/03/como-anadir-publicidad-en-android.html" title="Cómo añadir publicidad en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-BZM2WUqqE7s/UUAsBRZlDlI/AAAAAAAAAwQ/lWeC2QmAmgo/s72-c/android_money_80.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-1834019794109077355</id><published>2013-02-28T08:47:00.000+01:00</published><updated>2013-02-28T23:16:34.131+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="ContentValues" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlite" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Update" /><category scheme="http://www.blogger.com/atom/ns#" term="insert" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Android SQLite: insertar y actualizar sin consultas</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s1600/New+Database.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s1600/New+Database.png" style="height: 80px; width: 80px;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Muchas veces cuando estamos insertando datos en nuestra base de datos lo hacemos de forma masiva y no nos preocupa obtener el identificador de cada fila. Pero otras veces es necesario acceder, por ejemplo porque estamos registrando un determinado item y necesitamos su id para asociarlo a otro. Hacer esto se puede hacer de una forma muy sencilla, veámoslo.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Antes de nada vamos a hacer memoria y recordaremos la clase que creamos para manejar la base de datos en este artículo&amp;nbsp;&lt;a href="http://www.nosinmiubuntu.com/2011/11/como-guardar-datos-en-android-bases-de.html"&gt;http://www.nosinmiubuntu.com/2011/11/como-guardar-datos-en-android-bases-de.html&lt;/a&gt;. Aquí teníamos un método llamado insertarUsuario que hoy haremos de una forma un poco diferente.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezamos cambiando un poco la consulta para crear la tabla de los usuarios. la diferencia con la anterior es que ahora id_usuario es de tipo INTEGER no INT, es PRIMARY KEY, es decir es clave primaria y por lo tanto debe ser un dato único, y por último es AUTOINCREMENT, con esto no hará falta que al insertar indiquemos el id_usuario, se irá generando uno automáticamente, primero insertará 1, luego 2, y así sucesivamente.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;b&gt;private String SQLCreateUsuarios = "CREATE TABLE " + TableUsuarios +  " (id_usuario INTEGER PRIMARY KEY AUTOINCREMENT, nombre VARCHAR(1000), email VARCHAR(1000) ) ";&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora que ya tenemos modificada nuestra tabla vamos a ver el nuevo método &lt;b&gt;insertarUsuario&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public int insertarUsuario(String nombre, String email){&lt;br /&gt; int idUsuario = 0;&lt;br /&gt; SQLiteDatabase db = getWritableDatabase();&lt;br /&gt; if(db!=null){&lt;br /&gt;  ContentValues values = new ContentValues();&lt;br /&gt;  values.put("nombre", nombre);&lt;br /&gt;  values.put("email", email);&lt;br /&gt;  idUsuario = (int) db.insert(TableUsuarios, null, values);  &lt;br /&gt; }&lt;br /&gt;db.close();   &lt;br /&gt;return idUsuario;&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis dejamos de crear nosotros la consulta con el insert y simplemente en un objeto &lt;b&gt;ContentValues&lt;/b&gt; añadimos los parámetros que queremos insertar para luego llamar al método insert de db&amp;nbsp;diciéndole&amp;nbsp;en que tabla insertamos y los values que insertamos, el método se encarga de obtener y devolver el identificador de usuario obtenido. Este está devolviendo &amp;nbsp;un long, pero nosotros le hacemos un cast a int.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para completar el artículo vamos a ver como actualizar este usuario. Vamos a seguir con nuestro objeto ContentValues, pero ahora utilizamos el método update. A este debemos pasarle el nombre de la tabla y los values como en el anterior método. Además le pasamos la clausula where en nuestro caso los que tengan un determinado id_usuario, y con el siguiente parámetro que es un array de String le decimos que id_usuario debe poner donde esta el interrogante (?).&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public int actualizarUsuario(int idUsuario, String nombre, String email){&lt;br /&gt; int filasAfectadas = 0;&lt;br /&gt; SQLiteDatabase db = getWritableDatabase();&lt;br /&gt; if(db!=null){&lt;br /&gt;  ContentValues values = new ContentValues();&lt;br /&gt;  values.put("nombre", nombre);&lt;br /&gt;  values.put("email", email);&lt;br /&gt;  filasAfectadas = (int) db.update(TableUsuarios, values, "id_usuario = ?", new String[]{String.valueOf(idUsuario)});  &lt;br /&gt; }&lt;br /&gt;db.close();   &lt;br /&gt;return filasAfectadas;&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Al final obtendremos el número de filas afectadas por la actualización.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=YRdYgcTQl80:1SVn1SNNToM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1834019794109077355" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1834019794109077355" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/02/android-sqlite-insertar-y-actualizar.html" title="Android SQLite: insertar y actualizar sin consultas" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s72-c/New+Database.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-5541456835857872194</id><published>2013-02-25T12:24:00.000+01:00</published><updated>2013-02-25T12:25:31.827+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Libros" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title type="text">Corre Linux Corre: tu guía para empezar con Ubuntu</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wIx2n86uBbo/USQrYx3yk3I/AAAAAAAAC3o/IEnQDIOfwMw/s1600/accessories-dictionary.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-wIx2n86uBbo/USQrYx3yk3I/AAAAAAAAC3o/IEnQDIOfwMw/s1600/accessories-dictionary.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como todos sabéis, existe una gran Comunidad detrás del mundo GNU/Linux, en el que los usuarios comparten sus conocimientos y trabajo, para que cualquiera pueda beneficiarse de ello. Como nos gusta dar a conocer toda la información que puede ayudar a los usuarios, en la entrada de hoy vamos a hablar del libro &lt;b&gt;"Corre Linux Corre"&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Este libro ha sido creado por&amp;nbsp; &lt;b&gt;&lt;a href="http://aceptarocancelar.blogspot.com.es/2013/01/corre-linux-corre.html"&gt;Fernando Monroy&lt;/a&gt;, &lt;/b&gt;quien &lt;a href="http://www.nosinmiubuntu.com/p/contacto.html"&gt;contactó&lt;/a&gt; con nosotros&amp;nbsp; para avisarnos de su liberación oficial, algo que agradecemos de antemano.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/-y5woroN8frE/USQqcDpz6MI/AAAAAAAAC3c/ugmMlbomNWM/s1600/portada.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-y5woroN8frE/USQqcDpz6MI/AAAAAAAAC3c/ugmMlbomNWM/s320/portada.jpg" width="266" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esta obra &lt;b&gt;acerca&lt;/b&gt;&lt;b&gt; Ubuntu&lt;/b&gt; a todos aquellos  que se inician en el mundo de Gnu/Linux, y que eligen la distribución de Canonical como punto de partida. En él encontraremos instrucciones para realizar tareas &lt;span style="font-size: small;"&gt;típi&lt;span style="font-size: small;"&gt;cas del día a día,&lt;/span&gt;&lt;/span&gt; como son &lt;i&gt;configurar el&amp;nbsp; sistema, administrar archivos o instalar programas&lt;span style="font-size: small;"&gt; entre otras.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En &lt;span style="font-size: small;"&gt;est&lt;span style="font-size: small;"&gt;a publicación&lt;/span&gt;&lt;/span&gt; no se explica el proceso de instalación, sino que comienza directamente a explicar el funcionamiento del Sistema Operativo, por lo que se entiende que el usuario ya ha conseguido instalar Ubuntu en su equipo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El contenido que los lec&lt;span style="font-size: small;"&gt;tores enco&lt;span style="font-size: small;"&gt;ntrarán &lt;/span&gt;tras descargar el documento&lt;/span&gt; es:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 1: Bienvenido a GNU&lt;span style="font-size: small;"&gt;/&lt;/span&gt;Linux&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 2: Gestión de archivos&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 3: Configuración del sistema&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 4: Internet, Redes Sociales y más&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 5: Instalación de dispositivos comunes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capítulo 6: ¿Cómo lo hago en GNU/Linux?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;En realidad, aunque el autor no explica cosas como &lt;i&gt;qué es GNU/Linux, su estructura del sistema de archivos o&amp;nbsp; los comandos básicos&lt;/i&gt;,  que entendemos que todo usuario que se inicie en este mundo debería  saber (aunque se pueden adquirir por otras vías), es una buena opción  para q&lt;span style="font-size: small;"&gt;ue los que &lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;empiezan&lt;span style="font-size: small;"&gt;, puedan &lt;/span&gt;a dar sus primeros pasos, por lo que recomendamos su lectura&lt;span style="font-size: small;"&gt; como guía. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/1084633/Libro%20Corre%20Linux%20Corre.pdf" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8bDbhKttft0/T5nhLFQprJI/AAAAAAAACRM/3KnHwrFBJXg/s1600/download-picto-desktop-large.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/1084633/Libro%20Corre%20Linux%20Corre.pdf" target="_blank"&gt;Descarga "Linux Corre Linux"&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Saludos.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=S9BgZUaePZ4:BtkssSkC414:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5541456835857872194" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5541456835857872194" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/02/corre-linux-corre-tu-guia-para-empezar.html" title="Corre Linux Corre: tu guía para empezar con Ubuntu" /><author><name>Ángel Fernández Ochoa</name><uri>https://plus.google.com/108563870874955409518</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-xNDvrcTm9VI/AAAAAAAAAAI/AAAAAAAAC2I/VzmXSo-hVKY/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-wIx2n86uBbo/USQrYx3yk3I/AAAAAAAAC3o/IEnQDIOfwMw/s72-c/accessories-dictionary.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-6162216261715449</id><published>2013-02-21T20:46:00.000+01:00</published><updated>2013-02-22T00:20:12.954+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu phone" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu tablet" /><title type="text">Ubuntu Phone y Tablet ya disponibles</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por&amp;nbsp;fin&amp;nbsp;está entre el nosotros la versión de Ubuntu para dispositivos móviles. Ya&amp;nbsp;llevábamos&amp;nbsp;tiempo esperando desde que Ubuntu había dado los primeros signos de vida por el campo de los dispositivos móviles para disfrutar del sistema en cualquier lugar.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-gu7zd9kkcMI/USZ3wNwPguI/AAAAAAAAAvw/ld-MVLsxvs0/s1600/App-dev-tablet-GoMobile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://2.bp.blogspot.com/-gu7zd9kkcMI/USZ3wNwPguI/AAAAAAAAAvw/ld-MVLsxvs0/s1600/App-dev-tablet-GoMobile.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por ahora solo los que tengan un&amp;nbsp;modelo&amp;nbsp;de la gama Nexus podrán disfrutar del sistema operativo, pero estamos seguros que no se tardará mucho en adaptar y tenerlo listo para otros muchos dispositivos. Los que os&amp;nbsp;atreváis&amp;nbsp;a instalarlo lo&amp;nbsp;podéis&amp;nbsp;hacer desde este dirección&amp;nbsp;&lt;a href="https://wiki.ubuntu.com/Touch/Install"&gt;https://wiki.ubuntu.com/Touch/Install&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Canonical nos detalla aquí unas sencillas instrucciones con las que podremos poner en marcha Ubuntu en nuestro móvil/tablet y por supuesto las instrucciones para poder revertir la instalación en caso de no querer continuar utilizando este sistema operativo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Los afortunados que&amp;nbsp;lo&amp;nbsp;instaléis&amp;nbsp;podéis&amp;nbsp;enviarnos vuestras primeras impresiones a&amp;nbsp;través&amp;nbsp;de los comentarios de la web.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=7i-VdgirBdI:S5dzDUuA9V4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6162216261715449" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6162216261715449" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/02/ubuntu-phone-y-tablet-ya-disponibles.html" title="Ubuntu Phone y Tablet ya disponibles" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s72-c/ubntu-phone.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-4834646045377186881</id><published>2013-02-19T19:58:00.000+01:00</published><updated>2013-02-20T01:50:35.226+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="tablet" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu tablet" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title type="text">Ubuntu se lanza a la conquista de las tablets</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Seguramente el stand de Canonical en el MWC de Barcelona será bastante visitado, sobre todo después de ponernos los dientes largos con el reciente anuncio del lanzamiento de Ubuntu Phone en los dispositivos Nexus, y ahora con el recién presentado Ubuntu for Tablet.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Parece que el ordenador de sobremesa está empezando a ser un elemento prescindible gracias a la llegada a nuestras vidas de los smartphones y las tablets. Estas últimas con un amplio&amp;nbsp;abanico&amp;nbsp;de configuraciones en cuanto a tamaño de pantalla, rendimiento, etc...&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Canonical ha visto el mercado que se le estaba escapando de las manos, y ha decidido ponerse manos a la obra para presentar hoy su sistema operativo adaptado para tablet. La idea que pretenden dar viendo el video presentación, es que sea lo más sencillo posible realizar cualquier tarea y sobre todo envolvente, desde cualquier aplicación poder realizar multitud de tareas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-omQJUGmCsH0/USQdrrubTrI/AAAAAAAAC24/S9GIuvo8dus/s1600/tablet-hero.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://1.bp.blogspot.com/-omQJUGmCsH0/USQdrrubTrI/AAAAAAAAC24/S9GIuvo8dus/s320/tablet-hero.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Me llama la atención, c&lt;span style="font-size: small;"&gt;ó&lt;/span&gt;mo han integrado las videoconferencias para que sea muy sencillo mantener una conversación mientras se está editando uno de nuestros documentos o realizamos cualquier otra acción.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Otro de los puntos a tener en cuent&lt;span style="font-size: small;"&gt;a&lt;/span&gt; es la gestión de cuentas, quizá es lo que más echo en falta en las tablets en general hasta día de hoy.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El uso de cada una de las esquinas de nuestro dispositivo va a seguir la misma forma de comportarse que en la versión para teléfonos. Cada una de estas servirá para una función determinada, por ejemplo, tirando de la esquina izquierda podremos ver nuestras aplicaciones preferidas, o tirando de la superior podremos acceder a las notificaciones.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Veremos como evoluciona la adaptación de Ubuntu a los dispositivos móviles y que nuevas sorpresas nos esperan a la vuelta de la esquina en el MWC de Barcelona.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube.com/embed/h384z7Ph0gU" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=pPJy_TECAAc:kaitVlgSwwg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/4834646045377186881" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/4834646045377186881" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/02/ubuntu-se-lanza-la-conquista-de-las.html" title="Ubuntu se lanza a la conquista de las tablets" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s72-c/ubntu-phone.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-1283226729797721805</id><published>2013-02-18T07:47:00.003+01:00</published><updated>2013-02-18T13:26:04.368+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu phone" /><title type="text">Ubuntu Phone muy pronto para descarga en Nexus 4</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s1600/ubntu-phone.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Hace poco Canonical mostraba al mundo por fin su tan esperado sistema operativo para dispositivos&amp;nbsp;móviles Ubuntu Phone. Para los que vamos a trastear con este sistema operativo deciros que estará disponible dentro de muy poco, exactamente el día 21 de febrero.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-ood4R5KHbk0/USCuZOkVBpI/AAAAAAAAAuw/tFHaZmOR9WM/s1600/banner-ubuntu-phone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://2.bp.blogspot.com/-ood4R5KHbk0/USCuZOkVBpI/AAAAAAAAAuw/tFHaZmOR9WM/s1600/banner-ubuntu-phone.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La mala noticia de momento es que solamente los afortunados poseedores de un Nexus 4 y los de un Galaxy Nexus tendrán disponibles las roms para su instalación en sus dispositivos. Esta será una preview del sistema final quedando&amp;nbsp;también&amp;nbsp;a la espera de tener confirmados los dispositivos móviles de Canonical.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Junto con las roms se podrán descargar también las herramientas necesarias para hacer lo más sencilla posible la instalación en nuestros dispositivos Nexus.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Unos días después, del 25 al 28 de febrero, Canonical estará presente en el MWC que se celebrará en Barcelona. Allí atenderá dudas y atenderá a aquellos que lo deseen ayudandoles a instalar Ubuntu for Phone en sus dispositivos. Los que&amp;nbsp;tengáis&amp;nbsp;la suerte de acercaros por allí los&amp;nbsp;podréis&amp;nbsp;encontrar en la&amp;nbsp;&lt;b style="background-color: white; color: #333333; font-family: 'Ubuntu Beta',UbuntuBeta,Ubuntu,'Bitstream Vera Sans','DejaVu Sans',Tahoma,sans-serif; line-height: 19px;"&gt;cabina número 81D30, App Planet Hall 8.1&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Ubuntu Beta',UbuntuBeta,Ubuntu,'Bitstream Vera Sans','DejaVu Sans',Tahoma,sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para los que somos desarrolladores Ubuntu la idea es que las aplicaciones que se desarrollen para la plataforma móvil sean compatibles con el sistema operativo de escritorio ahorrando así al desarrollador muchísimo tiempo. Los que&amp;nbsp;queráis&amp;nbsp;desarrollar&amp;nbsp;podéis&amp;nbsp;hacerlo utilizando HTML5 lo cual es una ventaja ya que&amp;nbsp;podéis&amp;nbsp;aprovechar estos desarrollos para otras plataformas.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;También&amp;nbsp;podéis&amp;nbsp;hacerlo mediante el SDK que pone a nuestra disposición Canonical en&amp;nbsp;&lt;a href="http://developer.ubuntu.com/get-started/gomobile/"&gt;http://developer.ubuntu.com/get-started/gomobile/&lt;/a&gt;. Utiliza Qt + QML y en esta misma página encontrareis más información sobre como instalar las herramientas necesarias y dar los primeros pasos.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para los que ya vais a poneros manos a la obra no&amp;nbsp;dejéis&amp;nbsp;de echar un vistazo a las líneas de diseño que nos proponen en&amp;nbsp;&lt;a href="http://design.ubuntu.com/apps"&gt;http://design.ubuntu.com/apps&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=s1ZCJt6ueLk:bRwRWAQ58nM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1283226729797721805" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1283226729797721805" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/02/ubuntu-phone-muy-pronto-para-descarga.html" title="Ubuntu Phone muy pronto para descarga en Nexus 4" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-hOGtS_cMxwM/USC0wgBqWJI/AAAAAAAAAvU/qjNOEZbk32A/s72-c/ubntu-phone.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-7390520318840028386</id><published>2013-01-31T07:29:00.000+01:00</published><updated>2013-01-31T20:59:20.670+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OnScrollListener" /><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="listview" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title type="text">Scroll tipo Twitter en un ListView</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s1600/centrejust.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s1600/centrejust.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Hace poco me he visto en el caso de un ListView con una gran cantidad de datos, muchos de ellos antiguos y que puede que el usuario no vea por no hacer scroll pero si que va a tener que sufrir el tiempo de espera para descargar todos esos datos. Para solucionarlo vamos a ver como hacer un listview que cargue items a medida que hacemos scroll.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: small; text-align: justify;"&gt;La idea la he cogido de este blog&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://benjii.me/2010/08/endless-scrolling-listview-in-android/" style="text-align: justify;"&gt;http://benjii.me/2010/08/endless-scrolling-listview-in-android/&lt;/a&gt;&lt;span style="text-align: justify;"&gt;&amp;nbsp;y la he modificado un poco para que sea más fácil de utilizar en todas partes. Al final debe hacer como la app de Twitter si hacemos scroll en nuestra lista debe cargar más elementos al llegar al final de ella.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Simplemente debemos crear una clase que implemente OnScrollListener. Este sobreescribirá el método onScroll, donde se va &amp;nbsp;a comprobar con los items que se están mostrando actualmente si estamos llegando al final de la lista. En caso afirmativo se lanzará un listener que hemos creado.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El listener que se lanza lo creamos en la propia clase y nos servirá para avisar a quien corresponda cada vez que se tenga que leer una página más. Además nos devolverá la página que debemos cargar.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class EndlessScrollListener implements OnScrollListener{&lt;br /&gt;    private int visibleThreshold = 5;&lt;br /&gt;    private int currentPage = 0;&lt;br /&gt;    private int previousTotal = 0;&lt;br /&gt;    private boolean loading = true;&lt;br /&gt;    private onScrollEndListener onScrollEnd;&lt;br /&gt;    &lt;br /&gt;    public interface onScrollEndListener {void onEnd(int page);}&lt;br /&gt;    &lt;br /&gt;    public EndlessScrollListener(onScrollEndListener onScrollEnd) {&lt;br /&gt;     super();&lt;br /&gt;     this.onScrollEnd = onScrollEnd;&lt;br /&gt;    }&lt;br /&gt;    public EndlessScrollListener(int visibleThreshold, onScrollEndListener onScrollEnd) {&lt;br /&gt;     super();&lt;br /&gt;        this.visibleThreshold = visibleThreshold;&lt;br /&gt;        this.onScrollEnd = onScrollEnd;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt; @Override&lt;br /&gt;    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {&lt;br /&gt;        if (loading) {&lt;br /&gt;            if (totalItemCount &amp;gt; previousTotal) {&lt;br /&gt;                loading = false;&lt;br /&gt;                previousTotal = totalItemCount;&lt;br /&gt;                currentPage++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (!loading &amp;amp;&amp;amp; (totalItemCount - visibleItemCount) &amp;lt;= (firstVisibleItem + visibleThreshold)) {&lt;br /&gt;            loading = true;    &lt;br /&gt;            if(totalItemCount &amp;gt; visibleThreshold)&lt;br /&gt;             onScrollEnd.onEnd(currentPage);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onScrollStateChanged(AbsListView view, int scrollState) {     &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;  &lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora utilizarlo en cualquiera de nuestros ListView o cualquier otro elemento que se pueda implementar el onScrollListener es un juego de niños. Simplemente debemos hacer algo así:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;ListView List = (ListView) findViewById(R.id.list);&lt;br /&gt;List.setOnScrollListener(new EndlessScrollListener(new onScrollEndListener() {  @Override&lt;br /&gt; public void onEnd(int page) {    &lt;br /&gt;  //Hacemos una llamada a nuestro servicio web para traer más datos &lt;br /&gt; }&lt;br /&gt;}));&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ya hemos visto otras veces &lt;a href="http://www.nosinmiubuntu.com/2012/10/peticiones-http-ahora-mucho-mas-faciles.html"&gt;como traer datos de un servidor&lt;/a&gt;, y también &lt;a href="http://www.nosinmiubuntu.com/2012/11/items-personalizados-para-un-listview.html"&gt;como enlazar datos a un Listview&lt;/a&gt;, así que solo es cuestión de que&amp;nbsp;juntéis&amp;nbsp;todas las piezas para tener esta funcionalidad en vuestras listas.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=Ooy1SEcCivs:BtTbSElNW6c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/7390520318840028386" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/7390520318840028386" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/01/scroll-tipo-twitter-en-un-listview.html" title="Scroll tipo Twitter en un ListView" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s72-c/centrejust.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-3165636453338205067</id><published>2013-01-23T19:43:00.000+01:00</published><updated>2013-01-25T00:13:23.145+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CursorAdapter" /><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="SimpleCursorAdapter" /><category scheme="http://www.blogger.com/atom/ns#" term="listview" /><category scheme="http://www.blogger.com/atom/ns#" term="Cursor" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlite" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Rellenar un ListView con SQLite</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s1600/centrejust.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s1600/centrejust.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Ya son varias la veces que me pedis que os explique como rellenar un ListView, un Spinner o otra estructura desde una base de datos así que hoy voy a explicar como hacerlo.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a aprovechar el artículo que ya escribí hace tiempo de como acceder a base de datos para hacer el artículo lo más liviano posible, para ello leeros antes el artículo sobre &lt;a href="http://www.nosinmiubuntu.com/2011/11/como-guardar-datos-en-android-bases-de.html"&gt;como tratar datos en bases de datos&lt;/a&gt;. Una vez creada vuestra clase para tratar datos echarle un vistazo a este artículo para ver &lt;a href="http://www.nosinmiubuntu.com/2011/12/como-guardar-datos-en-android-bases-de.html"&gt;como leer los datos de la base de datos&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Nuestros datos los debemos traer en un objeto Cursor. Hacemos una consulta como la siguiente. Esto lo&amp;nbsp;podéis&amp;nbsp;ver en los artículos que os indique antes. Fijaros que para el identificador le creamos un alias con un guión delante, esto es importante porque si no le damos este nombre el SimpleCursorAdapter no sabrá cual es el id.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public Cursor leerLibros(){&lt;br /&gt; SQLiteDatabase db = getReadableDatabase();&lt;br /&gt;  &lt;br /&gt; return db.rawQuery("SELECT id AS _id, libro AS name FROM libros;", null);  &lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora vamos a crear un layout llamado &lt;b&gt;row.xml&lt;/b&gt; que será donde mostraremos el texto. En Android existen layouts ya preparadas para esto, pero esta vez utilizaré esta plantilla por si quereis cambiar su aspecto que os sea sencillo.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;TextView xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;android:id="@+id/text"&lt;br /&gt;android:layout_width="fill_parent"&lt;br /&gt;android:layout_height="fill_parent"&lt;br /&gt;android:padding="10dip"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora en nuestra Activity vamos a rellenar un ListView. En nuestra Activity simplemente tendremos un ListView llamado listview. Y en el onCreate ejecutamos lo siguiente:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;ListView listView = (ListView) findViewById(R.id.listView);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;bbdd bbdd = new bbdd(this);&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cursor cursor = bbdd.leerLibros();&lt;/b&gt;&lt;br /&gt;&lt;b&gt;startManagingCursor(cursor);&lt;br /&gt;&lt;br /&gt;String[] from = new String[]{"name"};&lt;br /&gt;int[] to = new int[]{R.id.text};&lt;br /&gt;&lt;br /&gt;SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);&lt;br /&gt;&lt;br /&gt;listView.setAdapter(cursorAdapter);&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Con esto último ya está listo nuestro código. Instanciamos nuestro ListView, también nuestra clase de base de datos y llamamos al método leerLibros.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por otro lado preparamos un array, &lt;b&gt;from&lt;/b&gt;, con los nombres de las columnas en este caso solo será name. También otro, &lt;b&gt;to&lt;/b&gt;, con los ids de los elementos donde se ubicarán los datos de nuestra base de datos. De este modo le decimos que los datos de la columna name se ubican en el TextView con el id text.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último enlazamos el SimpleCursorAdapter al ListView con el método setAdapter.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=5XWnfwf5kcY:HSnD2lLuMYM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3165636453338205067" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3165636453338205067" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/01/rellenar-un-listview-con-sqlite.html" title="Rellenar un ListView con SQLite" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-1HSdCR3nKgA/UKPdTozpafI/AAAAAAAAAew/keTOKqkANTA/s72-c/centrejust.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-6664835550691814919</id><published>2013-01-16T07:58:00.000+01:00</published><updated>2013-01-16T13:17:02.824+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="BroadCastReceiver" /><category scheme="http://www.blogger.com/atom/ns#" term="IntentFilter" /><category scheme="http://www.blogger.com/atom/ns#" term="Push" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="intent" /><title type="text">Enviar y recibir acciones con BroadcastReceiver en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-0g8g47e3Z9E/UPZO_AUH4EI/AAAAAAAAAuU/Eklq2wCDOAM/s1600/mail-send-receive.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-0g8g47e3Z9E/UPZO_AUH4EI/AAAAAAAAAuU/Eklq2wCDOAM/s1600/mail-send-receive.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Hace unas semanas&amp;nbsp;hablábamos&amp;nbsp;sobre las notificaciones tipo push con la nueva versión del servicio de Google. Vimos como activar el servicio en Google, la parte servidor para enviar los mensajes a los usuarios y como recibirlos y notificarlos en el dispositivo. ¿Pero que pasa una vez recibidos? ¿Como transmitimos ese evento al resto de nuestra app?&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La respuesta es muy sencilla con los &lt;b&gt;broadcastreceiver&lt;/b&gt;. Estos no son más que capturadores de acciones. Existen ya algunos definidos en el sistema como pueden ser una llamada entrante o un mensaje de texto. En nuestra aplicación podríamos capturar esas acciones y tratarlas de la forma que a nosotros mejor nos conviniera.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Voy a explicarlo basándome en el &lt;a href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-i.html"&gt;artículo de las notificaciones push&lt;/a&gt;. Después de recibir y notificar un mensaje push, no hicimos nada más. Simplemente le mostramos al usuario el aviso pero en la aplicación no hacemos nada más. ¿Que pasaría si el usuario está mirando una lista con todas las notificaciones que ya teníamos y en ese momento llega un nuevo aviso?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para estos casos tenemos los bradcastreceiver, este estará escuchando hasta que llegue una determinada acción y cuando eso ocurra le dirá a la lista o a quien sea, que ha llegado un nuevo aviso y debe actualizarse.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Enviar la acción que luego recogeremos es muy sencillo. Simplemente debemos ejecutar lo siguiente:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private void sendBroadCast(Context context) {   &lt;br /&gt;        Intent broadcastIntent = new Intent();&lt;br /&gt;        broadcastIntent.setAction("&lt;span style="color: red;"&gt;NOMBRE_DE_NUESTRA_ACTION&lt;/span&gt;");         &lt;br /&gt;        broadcastIntent.putExtra("parameter", "value");         &lt;br /&gt;        context.sendBroadcast(broadcastIntent);         &lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Este método tan sencillo lo&amp;nbsp;podéis&amp;nbsp;llamar desde el método &lt;b&gt;notificarMensaje&lt;/b&gt; del &lt;a href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-en-android-ii.html"&gt;artículo dedicado al envío de notificaciones push&lt;/a&gt;. Simplemente creamos un Intent, seteamos el nombre de su action, si&amp;nbsp;queréis&amp;nbsp;podéis&amp;nbsp;incluir algún parámetro con putExtra y por último lo enviamos con el método sendBroadcast de Context.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y ahora vamos a definir el &lt;b&gt;broadcastreceiver&lt;/b&gt; que será el encargado de estar escuchando cuando esta acción se envíe y ejecutar lo que le digamos. Para ello vais a una de las Activitys de vuestra aplicación, donde&amp;nbsp;tengáis&amp;nbsp;una lista con las notificaciones o el número de ellas y definimos el broadcastreceiver así:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private IntentFilter myFilter;&lt;br /&gt; &lt;br /&gt;private BroadcastReceiver myReceiver = new BroadcastReceiver() {   &lt;br /&gt;        @Override&lt;br /&gt;        public void onReceive(Context context, Intent intent) {         &lt;br /&gt;           String myParam = intent.getExtras().getString("parameter"); &lt;br /&gt;            if (myParam != null) {                &lt;br /&gt;               &lt;span style="color: red;"&gt; //Aquí ejecutais el método que necesiteis, por ejemplo actualizar //el número de notificaciones recibidas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    };&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El BroadcasReceiver estará a la espera de nuestra action y de ejecutar lo que le digamos. Si&amp;nbsp;queréis,&amp;nbsp;también&amp;nbsp;podéis&amp;nbsp;capturar los parámetros enviados y utilizarlos como vosotros&amp;nbsp;necesitéis.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;protected void onPause() {         &lt;br /&gt;        unregisterReceiver(myReceiver);&lt;br /&gt;        super.onPause();&lt;br /&gt;}&lt;br /&gt;     &lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void onResume() {&lt;br /&gt;        super.onResume();&lt;br /&gt;        registerReceiver(myReceiver, myFilter);&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En el onResume debemos registrar nuestro receiver para que realmente esté a la espera del action y en el onPause debemos eliminar este registro.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);  &lt;br /&gt; &lt;br /&gt;        myFilter = new IntentFilter();&lt;br /&gt;        myFilter.addAction("&lt;span style="color: red;"&gt;NOMBRE_DE_NUESTRA_ACTION&lt;/span&gt;");&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, al crearse nuestra Activity también instanciamos un &lt;b&gt;IntentFilter&lt;/b&gt; que le dirá a nuestro broadcastreceiver cual es el nombre de la acción que debemos recoger, fijaros como se pasó como parámetro en el onResume al método registerReceiver.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y con este poquito código ya hemos creado nuestro broadcastreceiver. Si&amp;nbsp;habéis&amp;nbsp;implementado un método para contar las notificaciones y enviáis&amp;nbsp;notificaciones push a vuestra app, empezará a actualizarse el número de ellas. Como veis es una forma muy rápida y sencilla de tener actualizada todas las partes de vuestra aplicación.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=yjJ3OBPFWoU:YnxPQgf4Q08:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6664835550691814919" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6664835550691814919" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/01/enviar-y-recibir-acciones-con.html" title="Enviar y recibir acciones con BroadcastReceiver en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-0g8g47e3Z9E/UPZO_AUH4EI/AAAAAAAAAuU/Eklq2wCDOAM/s72-c/mail-send-receive.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-6731234911970223301</id><published>2013-01-09T19:11:00.000+01:00</published><updated>2013-02-25T03:43:27.886+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="app" /><category scheme="http://www.blogger.com/atom/ns#" term="apk" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Play Google" /><category scheme="http://www.blogger.com/atom/ns#" term="keystore" /><category scheme="http://www.blogger.com/atom/ns#" term="firmar aplicaciones" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Cómo firmar y generar aplicaciones Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://4.bp.blogspot.com/-Y_khbBl_yBo/UOvEbPtt6hI/AAAAAAAAAt4/a_mbKGDqtx4/s1600/gnome-mime-text-x-copying.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Y_khbBl_yBo/UOvEbPtt6hI/AAAAAAAAAt4/a_mbKGDqtx4/s1600/gnome-mime-text-x-copying.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Uno de los procesos que debemos llevar a cabo cuando ya tenemos nuestra aplicación finalizada y la queremos subir a la tienda Play de Google es firmarla con un certificado y genera&lt;span style="font-size: small;"&gt;r &lt;span style="font-size: small;"&gt;un archivo ejecutable que tiene una extensión apk&lt;/span&gt;&lt;/span&gt;. Vamos a ver como hacer este proceso.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para crear un certificado debemos utilizar keytool que se encuentra en /usr/bin&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Abrimos un terminal y ejecutamos:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;$ keytool -genkey -v -keystore &lt;span style="color: red;"&gt;nombredenuestrakeystore&lt;/span&gt;.keystore&lt;br /&gt;-alias &lt;span style="color: red;"&gt;aliasdenuestrakeystore&lt;/span&gt; -keyalg RSA -keysize 2048 -validity 10000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si quereis que la keystore se guarde en una carpeta en concreto podéis indicar la ruta junto con el nombre. Al ejecutar esto nos pedirá una contraseña tanto para nuestra key como para el alias de la misma. Y ya tenemos creada nuestra keystore.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si vais a firmar aplicaciones para luego distribuirlas no perdáis esta keystore, haced algún duplicado y subidla a algún servicio tipo dropbox. Si ya habéis subido apps firmadas con esta key y la perdéis no podréis subir actualizaciones ya que Google entenderá que no es la misma app.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora ya podemos utilizar nuestra keystore en cualquier app. Vamos a ver como se hace. En Eclipse nos ponemos en el explorador de proyectos sobre cualquier proyecto y hacemos botón derecho sobre uno. Seleccionamos &lt;b&gt;Android tools &amp;gt; Export Signed Application Package&lt;/b&gt;, aparecerá una pantalla como la siguiente:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_bqsL3bPrnw/UOvAgtkEJ3I/AAAAAAAAAtE/0ZSom1jgTwc/s1600/sign_app_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-_bqsL3bPrnw/UOvAgtkEJ3I/AAAAAAAAAtE/0ZSom1jgTwc/s320/sign_app_01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si hemos seleccionado bien el proyecto no debemos hacer nada. Simplemente clickamos en siguiente.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iekSyT0TIhg/UOvA6QC3jTI/AAAAAAAAAtM/Ohddu_L51EQ/s1600/apk_sign_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-iekSyT0TIhg/UOvA6QC3jTI/AAAAAAAAAtM/Ohddu_L51EQ/s320/apk_sign_02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora debemos seleccionar la keystore que hicimos antes e indicar su password. Como os dije antes es muy importante que no &lt;span style="font-size: small;"&gt;perdáis&lt;/span&gt; ni la keystore ni sus passwords. Asi que haced una copia o las que &lt;span style="font-size: small;"&gt;queráis&lt;/span&gt; para que no &lt;span style="font-size: small;"&gt;tengáis&lt;/span&gt; problemas en el futuro cuando &lt;span style="font-size: small;"&gt;queráis&lt;/span&gt; firmar actualizaciones de vuestras apps.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AeyM-f1xwMs/UOvBhzmDykI/AAAAAAAAAtU/7uq8Mm-yNsQ/s1600/apk_sign_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-AeyM-f1xwMs/UOvBhzmDykI/AAAAAAAAAtU/7uq8Mm-yNsQ/s320/apk_sign_03.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Después de la password de la keystore el wizard pide la clave del alias, &lt;span style="font-size: small;"&gt;rellenais el dato&lt;/span&gt; y seguimos adelante.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4AdIX5HQa2s/UOvBxn35EyI/AAAAAAAAAtc/cDsA9FO17Nk/s1600/apk_sign_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-4AdIX5HQa2s/UOvBxn35EyI/AAAAAAAAAtc/cDsA9FO17Nk/s320/apk_sign_04.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, nos piden una ubicación para guardar nuestra app firmada, &lt;span style="font-size: small;"&gt;seleccionáis&lt;/span&gt; una y listo. Aquí os recomiendo que &lt;span style="font-size: small;"&gt;vayáis&lt;/span&gt; organizando las diferentes versiones con un criterio con el cual os sea fácil encontrar cada una de ell&lt;span style="font-size: small;"&gt;a&lt;/span&gt;s posteriormente.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El proceso ha generado un archivo .apk que es lo que debéis subir a Play de Google.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Además cada vez que &lt;span style="font-size: small;"&gt;subáis&lt;/span&gt; una nueva actualización de una aplicación además de realizar el proceso anterior también &lt;span style="font-size: small;"&gt;debéis&lt;/span&gt; modificar en el archivo androidManifest.xml el número de versión en versionCode, aquí &lt;span style="font-size: small;"&gt;debéis&lt;/span&gt; poner un valor numérico, si no lo &lt;span style="font-size: small;"&gt;cambiáis&lt;/span&gt; al subir un nuevo archivo apk os avisará Google que el número de versión no es correcto. Además &lt;span style="font-size: small;"&gt;podéis&lt;/span&gt; ponerle un nombre a cada versión con versionName, aquí el texto no tiene porque ser numérico y &lt;span style="font-size: small;"&gt;podéis&lt;/span&gt; poner lo que &lt;span style="font-size: small;"&gt;queráis&lt;/span&gt;, es meramente informativo.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;manifest &lt;br /&gt;    android:versionCode="1"&lt;br /&gt;    android:versionName="1.0" &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=150FLOY5llI:_eHdgncl5jU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6731234911970223301" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/6731234911970223301" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2013/01/como-firmar-y-generar-aplicaciones.html" title="Cómo firmar y generar aplicaciones Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Y_khbBl_yBo/UOvEbPtt6hI/AAAAAAAAAt4/a_mbKGDqtx4/s72-c/gnome-mime-text-x-copying.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-2365135187863688285</id><published>2012-12-26T20:16:00.000+01:00</published><updated>2013-01-07T03:50:56.437+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sliding Menu" /><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="SlidingMenu" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Sliding Menu en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-fVzwzkhS4sM/UNtJhEGre2I/AAAAAAAAAsg/muoE-9i6BXQ/s1600/slidingmenu.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-fVzwzkhS4sM/UNtJhEGre2I/AAAAAAAAAsg/muoE-9i6BXQ/s1600/slidingmenu.png" style="width: 70px;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Hace tiempo que tenía ganas de ver como funcionaban los menús laterales estilo Facebook o Google+. Por suerte hace poco he podido utilizarlos en un proyecto y está dando un buen resultado. Gracias a las librerías existentes implementarlo en un proyecto se vuelve un juego de niños.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo primero de todo será buscar una librería, yo encontré varias y me decanté por esta la de jfeistein10 en GitHub.com &lt;a href="https://github.com/jfeinstein10/SlidingMenu"&gt;https://github.com/jfeinstein10/SlidingMenu&lt;/a&gt;&amp;nbsp;podéis&amp;nbsp;seguirlo a través de Twitter&lt;span style="color: #444444;"&gt;&lt;span style="line-height: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://twitter.com/slidingmenu" style="background-color: white; border: 0px none; color: #4183c4; font-family: Helvetica,arial,freesans,clean,sans-serif; line-height: 22px; margin: 0px; padding: 0px;"&gt;@SlidingMenu&lt;/a&gt;&amp;nbsp;además de otras redes sociales y dispone de una aplicación en el market de Google por si quereis ver todos los ejemplos de su librería. Aquí&amp;nbsp;tenéis&amp;nbsp;una captura de pantalla.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-qK78C47Au-c/UNtJSCcQYHI/AAAAAAAAAsY/dyIMl8dnjzw/s1600/slidingmenu1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-qK78C47Au-c/UNtJSCcQYHI/AAAAAAAAAsY/dyIMl8dnjzw/s1600/slidingmenu1.jpg" width="180" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezamos descargando su librería en el anterior enlace y la descomprimimos. Yo suelo hacerlo en una carpeta donde guardo todas las librerías de Android que voy utilizando. Ahora vamos a Eclipse y crearemos un proyecto nuevo. Indicamos que es un proyecto sobre código existente. Buscamos la carpeta que descomprimimos, y dentro de esta seleccionamos library &amp;nbsp;y aceptamos.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En el nuevo proyecto hacemos botón derecho sobre él y seleccionamos Properties &amp;gt; Android. En mi caso se construye sobre la versión 2.1 de Android. Debemos cambiarlo a la versión 4.0.3 con las librerías de Google Maps. Después de esto veremos que hay unos layouts que dan error, concretamente en el layout_width y layout_height por la propiedad match_parent, la cambiamos por fill_parent, guardamos y volvemos a poner match_parent y volvemos a guardar. No se porque pasa esto, puede ser que no le de tiempo a evaluar correctamente el proyecto con la nueva versión, pero es algo que ya me ha pasado en 3 ordenadores diferentes.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si&amp;nbsp;estáis&amp;nbsp;en el caso que&amp;nbsp;utilizáis&amp;nbsp;la librería ActionBarSherlock como es mi caso,&amp;nbsp;debéis&amp;nbsp;hacer un cambio más. Otra vez haceis botón derecho sobre el proyecto del SlidingMenu, Properties &amp;gt; Android. En la sección Library añadis una librería y&amp;nbsp;seleccionáis&amp;nbsp;donde tengais la ActionBarSherlock.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora debeis abrir todas las clases que hacen referencia a una Activity en este proyecto, terminan todas por Activity, y el cambio es muy fácil, simplemente hay que cambiar la herencia por la correspondiente clase de la ActionBarSherlock. Por ejemplo, &lt;b&gt;extends Activity&lt;/b&gt; quedaría &lt;b&gt;extends SherlockActivity&lt;/b&gt;. Por supuesto, si no utilizais la ActionBarSherlock, estos dos pasos no son necesarios.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Además si teneis la librería ActionBarSherlock debeis quitar de la SlidingMenu la librería android-support-v4 porque de lo contrario os dará un error diciendo que está repetida.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ya tenemos lista la librería para utilizar en nuestro proyecto. Seguimos los mismos pasos que seguimos para añadir la librería ActionBarSherlock antes pero ahora en nuestro proyecto y añadiendo la librería del SlidingMenu.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Antes de llamar al SlidingMenu en nuestra activity vamos a crear una serie de archivos necesarios. El primero se llama&amp;nbsp;shadow.xml y se ubica en drawable. Es una sombra que se utilizará en el menú.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;shape xmlns:android="http://schemas.android.com/apk/res/android" &amp;gt;&lt;br /&gt;    &amp;lt;gradient&lt;br /&gt;        android:endColor="#33000000"&lt;br /&gt;        android:centerColor="#11000000"&lt;br /&gt;        android:startColor="#00000000" /&amp;gt;&lt;br /&gt;&amp;lt;/shape&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente es dimens.xml y se ubica en values. Sirve para guardar tamaños o dimensiones de objetos y se pueden utilizar de una forma muy similar a como lo hacemos en styles o strings.xml.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;    &amp;lt;dimen name="slidingmenu_offset"&amp;gt;60dp&amp;lt;/dimen&amp;gt;&lt;br /&gt;    &amp;lt;dimen name="list_padding"&amp;gt;10dp&amp;lt;/dimen&amp;gt;&lt;br /&gt;    &amp;lt;dimen name="shadow_width"&amp;gt;15dp&amp;lt;/dimen&amp;gt;&lt;br /&gt;    &amp;lt;integer name="num_cols"&amp;gt;1&amp;lt;/integer&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora vamos a la carpeta layout y creamos menu_list.xml, este archivo mostrará la lista de opciones de nuestro menú en un ListView. Es un layout normal que se utiliza de la misma forma que en cualquier activity.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;ListView xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:id="@android:id/list"&lt;br /&gt;    android:layout_width="match_parent"&lt;br /&gt;    android:layout_height="match_parent"&lt;br /&gt;    android:paddingLeft="5dip"&lt;br /&gt;    android:paddingRight="5dip" /&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Seguimos en la carpeta layout y creamos menu_row.xml, será la plantilla utilizada para cada uno de los items de nuestro ListView anterior.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:layout_width="match_parent"&lt;br /&gt;    android:layout_height="50dp"&lt;br /&gt;    android:orientation="horizontal" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;ImageView&lt;br /&gt;        android:id="@+id/row_icon"&lt;br /&gt;        android:layout_width="50dp"&lt;br /&gt;        android:layout_height="50dp"&lt;br /&gt;        android:padding="10dp"&lt;br /&gt;        android:src="@drawable/ic_launcher" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView&lt;br /&gt;        android:id="@+id/row_title"&lt;br /&gt;        android:layout_width="0dp"&lt;br /&gt;        android:layout_height="match_parent"&lt;br /&gt;        android:layout_weight="1"&lt;br /&gt;        android:gravity="center_vertical"&lt;br /&gt;        android:padding="10dp"&lt;br /&gt;        android:text="Medium Text"&lt;br /&gt;        android:textAppearance="@android:style/TextAppearance.Medium" /&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El último de los archivos de la carpeta layout será menu.xml, este es el layout que deberá llamar nuestro SlidingMenu. En el atributo android:name estamos poniendo el espacio de nombres de nuestra aplicación seguido de la clase MenuFragment que explicaremos ahora. A este fragment le estamos diciendo que cuando se empiece a utiliza esta vista debe llamar a la clase MenuFragment.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;fragment xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:name="&lt;span style="color: red;"&gt;aqui.vuestro.espacio.de.nombres.&lt;/span&gt;MenuFragment"&lt;br /&gt;    android:layout_width="match_parent"&lt;br /&gt;    android:layout_height="match_parent"&amp;gt;&lt;br /&gt;&amp;lt;/fragment&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La siguiente clase se llama MenuFragment y hereda de ListFragment. Lo que hará esta clase es al crear la vista en el onCreateView decirle que debe utilizar el layout menu_list.xml. Cuando la Activity se crea inicializamos la clase SampleAdapter que no es más que una clase auxiliar que hereda de ArrayAdapter y que nos ayudará a añadir cada uno de los items al ListView.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Podríamos en vez de tener un ListView utilizar cualquier otro elemento como &amp;nbsp;un ScrollView con diferentes elementos anidados o lo que se os ocurra o necesiteis. Se accede de la misma forma a los elementos como si lo hicieramos en una Activity normal.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class MenuFragment extends ListFragment {&lt;br /&gt;&lt;br /&gt; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {&lt;br /&gt;  return inflater.inflate(R.layout.menu_list, null);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void onActivityCreated(Bundle savedInstanceState) {&lt;br /&gt;  super.onActivityCreated(savedInstanceState);&lt;br /&gt;  SampleAdapter adapter = new SampleAdapter(getActivity());&lt;br /&gt;  for (int i = 0; i &amp;lt; 20; i++) {&lt;br /&gt;   adapter.add(new SampleItem("Sample List", android.R.drawable.ic_menu_search));&lt;br /&gt;  }&lt;br /&gt;  setListAdapter(adapter);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private class SampleItem {&lt;br /&gt;  public String tag;&lt;br /&gt;  public int iconRes;&lt;br /&gt;  public SampleItem(String tag, int iconRes) {&lt;br /&gt;   this.tag = tag; &lt;br /&gt;   this.iconRes = iconRes;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public class SampleAdapter extends ArrayAdapter&amp;lt;SampleItem&amp;gt; {&lt;br /&gt;&lt;br /&gt;  public SampleAdapter(Context context) {&lt;br /&gt;   super(context, 0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;   if (convertView == null) {&lt;br /&gt;    convertView = LayoutInflater.from(getContext()).inflate(R.layout.menu_row, null);&lt;br /&gt;   }&lt;br /&gt;   ImageView icon = (ImageView) convertView.findViewById(R.id.row_icon);&lt;br /&gt;   icon.setImageResource(getItem(position).iconRes);&lt;br /&gt;   TextView title = (TextView) convertView.findViewById(R.id.row_title);&lt;br /&gt;   title.setText(getItem(position).tag);&lt;br /&gt;&lt;br /&gt;   return convertView;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último vamos a ver como añadir el SlidingMenu a nuestra Activity. Para ello abrimos la Activity donde lo utilizaremos. Lo primero de todo es cambiar la herencia por una de las Activitys que modificamos antes en la librería SlidingMenu. En este caso por SlidingFragmentActivity, esto nos proporcionará los métodos necesarios para añadir el menú lateral.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo siguiente es indicar cual es el layout de nuestro menú de una forma a como lo haríamos con setContentView pero con setBehindContentView. Y ahora inicializamos y seteamos nuestro SlidingMenu. Le indicamos el modo en como debemos tocar la pantalla para deslizar, el ancho de la sombra del menú, el drawable... Hay bastantes opciones de configuración y os recomiendo que le echeis un vistazo a la aplicación que hay disponible con los ejemplos y al código disponible en github.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Después de configurar todo habilitamos la action bar y el botón de home para poder tocar en este y abrir y cerrar el menú. Por último, capturamos el evento correspondiente a cuando pulsamos un item del menú (en este caso el menú de siempre de Android) y evaluamos si es el botón de home de la action bar, en caso de serlo hacemos un toggle que será el método encargado de abrir o cerrar el SlidingMenu según corresponda.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class MiActivity extends SlidingFragmentActivity{ &lt;br /&gt; &lt;br /&gt; private SlidingMenu menu;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main_layout);&lt;br /&gt;&lt;br /&gt;        setBehindContentView(R.layout.menu);&lt;br /&gt;        &lt;br /&gt;        setSlidingActionBarEnabled(false);        &lt;br /&gt;&lt;br /&gt;        menu = new SlidingMenu(this);&lt;br /&gt;        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);&lt;br /&gt;        menu.setShadowWidthRes(R.dimen.shadow_width);&lt;br /&gt;        menu.setShadowDrawable(R.drawable.shadow);&lt;br /&gt;        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);&lt;br /&gt;        menu.setFadeDegree(0.35f);&lt;br /&gt;        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);&lt;br /&gt;        &lt;br /&gt;        getSupportActionBar().setDisplayShowCustomEnabled(true);&lt;br /&gt;        getSupportActionBar().setDisplayHomeAsUpEnabled(true);        &lt;br /&gt;        &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;    public boolean onOptionsItemSelected(MenuItem item) {&lt;br /&gt;   switch (item.getItemId()) {&lt;br /&gt;        case android.R.id.home:     &lt;br /&gt;         toggle();           &lt;br /&gt;            return true;               &lt;br /&gt;        default:&lt;br /&gt;            return super.onOptionsItemSelected(item);&lt;br /&gt;        }  &lt;br /&gt;    }&lt;br /&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=sLgzbW0_pa4:OI4KESG16mE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/2365135187863688285" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/2365135187863688285" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/sliding-menu-en-android.html" title="Sliding Menu en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-fVzwzkhS4sM/UNtJhEGre2I/AAAAAAAAAsg/muoE-9i6BXQ/s72-c/slidingmenu.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-446340818188821453</id><published>2012-12-19T18:42:00.000+01:00</published><updated>2013-03-18T09:32:11.481+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gcm" /><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="Push" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Cloud Messaging" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Notificaciones Push en Android II</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s1600/gcm-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s1600/gcm-logo.png" style="width: 150px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La semana pasada le echamos un vistazo a las &lt;a href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-i.html"&gt;notificaciones push en Android&lt;/a&gt; de la mano del servicio Google Cloud Messaging y preparamos la parte servidor. Esta semana vamos a completar lo anterior preparando la parte cliente. Daremos de alta y baja a un usuario y prepararemos nuestra aplicación para recibir mensajes.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como la semana pasada, antes de meternos en harina, debemos comprobar si tenemos instalado en nuestro SDK de Android la&amp;nbsp;librería&amp;nbsp;&lt;b&gt;gcm.jar&lt;/b&gt; que nos facilitará casi todo el trabajo. Para ello, en Eclipse vamos a &lt;b&gt;Window &amp;gt; Android SDK Manager&lt;/b&gt;. Aquí nos aparecerán todas las APIs y librerías que tenemos instaladas. Vamos a la sección &lt;b&gt;Extras&lt;/b&gt; y si no está instalada la opción &lt;b&gt;Google Cloud Messaging for Android Library&lt;/b&gt; la chequeamos e instalamos.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-jjvkNU_8M34/UMl7BpMADmI/AAAAAAAAArQ/IeCwgCanBMY/s1600/android-sdk-manager-gcm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-jjvkNU_8M34/UMl7BpMADmI/AAAAAAAAArQ/IeCwgCanBMY/s1600/android-sdk-manager-gcm.png" height="203" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez terminada la instalación, vamos a la carpeta donde tengamos instalado el SDK de Android y desde ahí hasta la carpeta \extras\google\gcm\gcm-client\dist y copiamos el archivo gcm.jar.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora vamos a nuestro proyecto y en la carpeta &lt;b&gt;libs&lt;/b&gt; pegamos este archivo. Hacemos click con el botón derecho del ratón sobre él y seleccionamos &lt;b&gt;Build Path &amp;gt; Add to Build Path&lt;/b&gt;. Ahora ya podemos empezar a crear nuestro servicio para recibir notificaciones push.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Empezaremos primero por el archivo &lt;b&gt;AndroidManifext.xml&lt;/b&gt; que hoy tiene más código del habitual.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;permission android:name="&lt;span style="color: red;"&gt;nombre.del.package.de.vuestra.app&lt;/span&gt;.permission.C2D_MESSAGE" android:protectionLevel="signature" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="&lt;span style="color: red;"&gt;nombre.del.package.de.vuestra.app&lt;/span&gt;.permission.C2D_MESSAGE" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.GET_ACCOUNTS" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.WAKE_LOCK" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.VIBRATE"/&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;application&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;receiver android:name="com.google.android.gcm.GCMBroadcastReceiver"&lt;br /&gt;         android:permission="com.google.android.c2dm.permission.SEND" &amp;gt;&lt;br /&gt;         &amp;lt;intent-filter&amp;gt;&lt;br /&gt;             &amp;lt;action android:name="com.google.android.c2dm.intent.RECEIVE" /&amp;gt;&lt;br /&gt;             &amp;lt;action android:name="com.google.android.c2dm.intent.REGISTRATION" /&amp;gt;&lt;br /&gt;             &amp;lt;category android:name="&lt;span style="color: red;"&gt;nombre.del.package.de.vuestra.app&lt;/span&gt;" /&amp;gt;&lt;br /&gt;         &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;     &amp;lt;/receiver&amp;gt;&lt;br /&gt;  &lt;br /&gt;     &amp;lt;service android:name=".GCMIntentService" /&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;/application&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis es un poco más completo de lo habitual. Las primeras líneas son para indicarle al dispositivo que podrá recibir notificaciones del servicio de Google Cloud Messaging, además indica que solo nuestra aplicación (la que tiene vuestro package) podrá hacerlo. El siguiente permiso, GET_ACCOUNTS lo necesita Google para su servicio de mensajería. Después vienen permisos para internet y verificar el estado de la red, imprescindibles para un servicio de estas&amp;nbsp;características. WAKE_LOCK permitirá "despertar" nuestro dispositivo si está "durmiendo". Y el último VIBRATE, es opcional, simplemente lo usareis si&amp;nbsp;queréis&amp;nbsp;que al notificar algo vuestro dispositivo vibre.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Después, dentro de la etiqueta application (fijaros que a esta etiqueta no le he puesto ningún atributo, vosotros dejad los que&amp;nbsp;tengáis, simplemente es para que&amp;nbsp;sepáis&amp;nbsp;donde poner lo siguiente) definimos un BroadcastReceiver el cual ya viene definido en la librería gcm.jar y hará todo el trabajo sucio, registrar nuestro usuario, recibir notificaciones. Únicamente&amp;nbsp;debéis&amp;nbsp;respetar el nombre del broadcast.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, se define un Service que crearemos luego y que nos ayudará cuando registremos un usuario, cuando recibamos un mensaje o tengamos algún error.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora que ya tenemos el AndroidManifest.xml aclarado vamos a ver como se registran y desregistran los usuarios en nuestra app. El método registerUser antes de nada verifica si existe en el dispositivo el registrarion id que nos da el servicio de Google Cloud Messaging para cada usuario. Si no existe ese código lo registramos con la ayuda de la librería gcm.jar, y si existe no hacemos nada, evitando el proceso de llamar al servicio de Google.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El proceso de desregistro es muy similar, verificamos si existe el código de registro de usuario y llamamos al método unregister de la librería gmc.jar.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private void registerUser(Context context){&lt;br /&gt;  &lt;br /&gt;        final String regId = GCMRegistrar.getRegistrationId(context);&lt;br /&gt;        if (regId.equals("")) {&lt;br /&gt;         GCMRegistrar.register(context, "&lt;span style="color: red;"&gt;SENDER_ID QUE VIMOS EN LA ENTRADA ANTERIOR&lt;/span&gt;"); &lt;br /&gt;         Log.v("GCM", "Registrado");&lt;br /&gt;        } else {&lt;br /&gt;            Log.v("GCM", "Ya registrado");&lt;br /&gt;        } &lt;br /&gt; }&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private void unregisterUser(Context context){&lt;br /&gt; final String regId = GCMRegistrar.getRegistrationId(context);&lt;br /&gt;        if (!regId.equals("")) {&lt;br /&gt;            GCMRegistrar.unregister(context);&lt;br /&gt;        } else {&lt;br /&gt;            Log.v("GCM", "Ya des-registrado");&lt;br /&gt;        }&lt;br /&gt; }&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Los dos métodos los pongo solos y no los ubico en ninguna activity porque&amp;nbsp;debéis&amp;nbsp;ser vosotros los que&amp;nbsp;decidáis&amp;nbsp;donde van. Por ejemplo, si vuestra app no tiene login&amp;nbsp;podríais&amp;nbsp;poner el método de registro en el onCreate de la primera activity y así todos los usuarios recibirían notificaciones. Si tiene login se puede poner una vez el usuario se haya logado. O a lo mejor solo&amp;nbsp;queréis&amp;nbsp;activarlo y desactivarlo en un formulario donde el usuario lo indique expresamente.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;El último paso que nos queda por realizar es crear el Service que comentamos antes en el archivo AndroidManifest.xml, para ello creamos una nueva clase llamada &lt;b&gt;GCMIntentService&lt;/b&gt; y que heredará de &lt;b&gt;GCMBaseIntentService&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class GCMIntentService extends GCMBaseIntentService {&lt;br /&gt;&lt;br /&gt; public GCMIntentService(){&lt;br /&gt;  super("SENDER ID QUE NOS DIO LA API DE GOOGLE");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onError(Context context, String errorId) {&lt;br /&gt;  Log.d("GCM", "Error: " + errorId);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onMessage(Context context, Intent intent) {&lt;br /&gt;     String msg = intent.getExtras().getString("msg");&lt;br /&gt;     Log.d("GCM", "Mensaje: " + msg);&lt;br /&gt;     notificarMensaje(context, msg);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onRegistered(Context context, String regId) {&lt;br /&gt;  Log.d("GCM", "onRegistered: Registrado OK.");&lt;br /&gt;   //En este punto debeis obtener el usuario donde lo tengais guardado.&lt;br /&gt;   //Si no teneis un sistema de login y los usuarios son anónimos podeis simplemente almacenar el regId&lt;br /&gt;  String usuario = "";&lt;br /&gt;  &lt;br /&gt;    registrarUsuario(usuario, regId);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onUnregistered(Context context, String regId) {&lt;br /&gt;  Log.d("GCM", "onUnregistered: Desregistrado OK.");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void registrarUsuario(String username, String regId){&lt;br /&gt;  Log.w("GCM", "registrarUsuario");&lt;br /&gt;  Log.w("GCM", "username: " + username);&lt;br /&gt;  Log.w("GCM", "regID: " + regId);&lt;br /&gt;  try{&lt;br /&gt;   &lt;br /&gt;   ArrayList&amp;lt;namevaluepair&amp;gt; nameValuePairs = new ArrayList&amp;lt;namevaluepair&amp;gt;();&lt;br /&gt;   nameValuePairs.add(new BasicNameValuePair("tag","usersave"));&lt;br /&gt;   nameValuePairs.add(new BasicNameValuePair("username",username));&lt;br /&gt;   nameValuePairs.add(new BasicNameValuePair("gcmcode",regId));&lt;br /&gt;   &lt;br /&gt;   HttpClient httpclient = new DefaultHttpClient();&lt;br /&gt;   HttpPost httppost = new HttpPost("http://&lt;span style="color: red;"&gt;ip donde está alojado el servicio web&lt;/span&gt;/index.php");&lt;br /&gt;   if(nameValuePairs != null)&lt;br /&gt;    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));&lt;br /&gt;   &lt;br /&gt;   ResponseHandler&amp;lt;string&amp;gt; responseHandler = new BasicResponseHandler();&lt;br /&gt;   String res = httpclient.execute(httppost, responseHandler);&lt;br /&gt;   &lt;br /&gt;   Log.w("GCM", "RES: " + res);&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;  } catch(Exception e){&lt;br /&gt;   Log.w("GCM", "ex: " + e.getMessage().toString());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void notificarMensaje(Context context, String msg)&lt;br /&gt; {&lt;br /&gt;     String notificationService = Context.NOTIFICATION_SERVICE;&lt;br /&gt;     NotificationManager notificationManager =(NotificationManager) context.getSystemService(notificationService);&lt;br /&gt;  &lt;br /&gt;     //Configuramos la notificación&lt;br /&gt;     int icono = android.R.drawable.ic_launcher;&lt;br /&gt;     CharSequence estado = "Has recibido un nuevo mensaje";&lt;br /&gt;     long hora = System.currentTimeMillis();&lt;br /&gt;  &lt;br /&gt;     Notification notification = new Notification(icono, estado, hora);&lt;br /&gt;     long[] vibrate = {100,100,200,300};&lt;br /&gt;     notification.vibrate = vibrate;&lt;br /&gt;  &lt;br /&gt;     //Configuramos el Intent&lt;br /&gt;     Context contexto = context.getApplicationContext();&lt;br /&gt;     CharSequence titulo = "Nombre app - nuevo Mensaje";&lt;br /&gt;     CharSequence descripcion = msg;&lt;br /&gt;  &lt;br /&gt;     Intent intent = new Intent(contexto, &lt;span style="color: red;"&gt;activitydestino&lt;/span&gt;.class);&lt;br /&gt;     Bundle b = new Bundle();&lt;br /&gt;     b.putInt("update", 1);&lt;br /&gt;     intent.putExtra("android.intent.extra.INTENT", b);&lt;br /&gt;&lt;br /&gt;     PendingIntent contIntent = PendingIntent.getActivity(contexto, 0, intent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK);&lt;br /&gt;  &lt;br /&gt;    notifification.setLatestEventInfo(contexto, titulo, descripcion, contIntent);&lt;br /&gt;  &lt;br /&gt;    notification.flags |= Notification.FLAG_AUTO_CANCEL;&lt;br /&gt;  &lt;br /&gt;    notificationManager.notify(1, notification); }&lt;br /&gt;&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esta última parte es un poco más compleja, pero no mucho. Lo primero fijaros en el constructor, debe llamar al contructor padre pasándole el sender id que nos da Google, lo que en la web es el ID Project.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Despues tendremos cuatro eventos básicos que sobreescribimos para hacer lo que más se adapte a nuestra aplicación. Tenemos &lt;b&gt;onError&lt;/b&gt;, que nos informa de algún error en el proceso. &lt;b&gt;onRegistered&lt;/b&gt; y &lt;b&gt;onUnregistered&lt;/b&gt; que se producen cuando un usuario se da de alta o baja del servicio de Google Cloud Messaging, en estos dos casos debemos dar de alta o baja al usuario en nuestro servidor. Y por último, &lt;b&gt;onMessage&lt;/b&gt;, que se produce cada vez que llega un mensaje push.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo que hace el método &lt;b&gt;registrarUsuario&lt;/b&gt; ya lo hemos visto más veces, simplemente es una llamada al servicio web que hicimos la semana pasada y que envía el nombre de usuario, el código de Google Cloud Messaging y un tag para indicar la acción a realizar. A la hora de recoger el resultado de la acción no hacemos nada con el resultado, pero se podría o bien guardar en caso de error el usuario para volver a intentar registrar más tarde o bien des-registrar del servicio de Google al usuario y que al volver a entrar se repitiera el proceso de registro. El como, cuando y donde hacer esta parte ya os corresponde a vosotros y como&amp;nbsp;hayáis&amp;nbsp;planteado el alta del usuario en vuestro sistema.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El último método &lt;b&gt;notificarMensaje&lt;/b&gt; simplemente recibe un mensaje y lo notifica al usuario. Si&amp;nbsp;recordáis, en el servicio web se mandaban parámetros con data.msg, data.fecha, data.autor... para recogerlos, en onMessage se utiliza:&amp;nbsp;&lt;b&gt;intent.getExtras().getString("msg");&lt;/b&gt; Esto será para el caso de data.msg, y haceis lo mismo para el resto sustituyendo &lt;b&gt;msg&lt;/b&gt; por lo que corresponda.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;A la hora de notificar hacemos uso de&amp;nbsp;&lt;b&gt;notificationManager&lt;/b&gt;, podemos configurar el icono, el texto de cabecera, le pasamos la descripción que será el mensaje que hemos recibido. Si queremos podemos hacer que vibre el teléfono. También podemos definir un Intent para que al pulsar en el mensaje abra la aplicación en un determinado punto y además en nuestro caso le pasamos un parámetro que en mi caso se llama update y su valor es 1, de esta forma puedo ahorrarle mucha batería y tráfico de datos al usuario si solo actualizo datos cuando yo se lo notifico.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Se podría enviar en los parámetros datos como un identificador y abrir la ficha de una noticia por ejemplo, o lo que a vosotros se os ocurra. Incluso desde el notificarMensaje&amp;nbsp;podéis&amp;nbsp;hacer de forma totalmente silenciosa alguna actualización de datos y el usuario al entrar no tendría que esperar y siempre tendría los datos actualizados.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, para empezar a enviar notificaciones para recibirlas en el dispositivo móvil,&amp;nbsp;debéis&amp;nbsp;utilizar el servicio web de la semana pasada haciendo llamadas al método sendMessageToPhone de la clase gcm. Este lo podríais integrar en una web, por ejemplo cada vez que se publique una noticia que se llame. También en un chat, o incluso&amp;nbsp;podéis&amp;nbsp;hacer llamadas a este servicio desde la misma aplicación móvil para tener vuestra app de mensajería.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;Si&amp;nbsp;queréis&amp;nbsp;podéis&amp;nbsp;aprender más sobre como trabajar en vuestra aplicación con acciones en el artículo: &amp;nbsp;&lt;a href="http://www.nosinmiubuntu.com/2013/01/enviar-y-recibir-acciones-con.html"&gt;&lt;b&gt;enviar y recibir acciones con BroadcastReceiver en Android&lt;/b&gt;&lt;/a&gt;.&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=CiRltA9KT1s:3c1rTpnhew4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/446340818188821453" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/446340818188821453" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-en-android-ii.html" title="Notificaciones Push en Android II" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s72-c/gcm-logo.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-5238054528113596238</id><published>2012-12-12T18:32:00.000+01:00</published><updated>2012-12-12T21:37:01.526+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><category scheme="http://www.blogger.com/atom/ns#" term="Push" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="MYSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="notificación" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title type="text">Notificaciones Push en Android I</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s1600/gcm-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s1600/gcm-logo.png" style="width: 150px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Quien no conoce aplicaciones como WhatsApp, Google Talk, Facebook Messenger o el tan mencionado últimamente Line? Y que tienen en común todos ellos? A parte de servir para comunicarse, que el sistema de comunicaciones se hace a través de notificaciones Push. Vamos a echarle un ojo y ver como funcionan.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ya hace bastante tiempo que estas aplicaciones se han instalado en nuestras vidas y que han conseguido desbancar casi por completo a los obsoletos SMS. Ahora gracias al nuevo servicio de Google Cloud Messaging, podemos crear nuestro propio sistema de notificaciones Push en nuestras aplicaciones. Imaginad como puede llegar a mejorar nuestra aplicación con un sencillo servicio de notificaciones.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Voy a tratar de explicar brevemente como sería el proceso de envío. En el primer paso nuestro dispositivo se registra de forma totalmente transparente al usuario en el sevidor de Google para decirle que puede recibir notificaciones para nuestra aplicación. En este registro el servidor de Google nos devuelve un Identificador a nuestra aplicación Android que deberemos almacenar en un servidor de nuestra propiedad. Una vez ya están todos presentados, desde nuestro servidor ya se pueden empezar a enviar mensajes. Para ello se envían peticiones al servidor de Google y este se encarga de enviarlo si el dispositivo está online o de esperar a que el dispositivo se reconecte para enviarlo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo primero que debemos hacer es activar el servicio de Google Cloud Messaging en la siguiente dirección&amp;nbsp;&lt;a href="https://code.google.com/apis/console" style="border: 0px none; color: #3088ff; font-family: Arial,sans-serif; line-height: 21px; margin: 0px; outline: 0px none; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank" title="Google API Console"&gt;https://code.google.com/apis/console&lt;/a&gt;. Debeis disponer de una cuenta de Google para poder realizar este proceso.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-IztotSE5BxA/UMTo6S2XptI/AAAAAAAAAqc/iqjcILFO50k/s1600/gcm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-IztotSE5BxA/UMTo6S2XptI/AAAAAAAAAqc/iqjcILFO50k/s1600/gcm.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Creamos un proyecto el cual nos dará un senderId que deberemos utilizar en la app Android. Lo&amp;nbsp;podéis&amp;nbsp;encontrar en la pestaña Overview, sección Project Number.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo siguiente es activar el servicio de mensajería. Para ello en la pestaña Services&amp;nbsp;buscáis&amp;nbsp;Google Cloud Messaging for Android y lo poneis a ON. Ya por último, vais a API Access y pulsais el botón "Create new Server key" (en la pantalla que aparece no hace falta rellenar nada). Esto nos creará una apiKey, ojo, la de la sección Key for server apps. La cual utilizaremos&amp;nbsp;después.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esta es toda la configuración que necesitamos en el servidor de Google.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos ahora a crear la parte servidor. Para ello lo haremos como es habitual en PHP y MySQL, pero vosotros lo podeis adaptar de una forma muy simple al&amp;nbsp;lenguaje&amp;nbsp;que necesiteis.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo primero que vamos a hacer es crear una tabla en nuestra base de datos para almacenar los usuarios que se registren en nuestra app para saber los registration id que nos proporcionó Google Cloud Messaging.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;CREATE TABLE IF NOT EXISTS `usuarios` (&lt;br /&gt;  `username` varchar(100) NOT NULL,&lt;br /&gt;  `gcmcode` varchar(500) NOT NULL,&lt;br /&gt;  PRIMARY KEY (`username`)&lt;br /&gt;) ENGINE=InnoDB;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como&amp;nbsp;podéis&amp;nbsp;ver, es una tabla de usuarios muy simple. El nombre de usuario es clave pero el gcmcode no, porque de vez en cuando el servicio de Google puede cambiarlo y nosotros debemos actualizarlo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a crear 3 archivos php, uno para gestionar las llamadas a las funciones de nuestra aplicación servidor, otro para los usuarios y otro para los mensajes. Vamos a empezar por los usuarios. Para ello creamos una archivo llamado &lt;b&gt;users.php&lt;/b&gt;, veamos que tiene.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?php&lt;br /&gt;class users {&lt;br /&gt; &lt;br /&gt; function __construct() {&lt;br /&gt;  $con = mysql_connect("NOMBRE_HOST", "NOMBRE_DB_USER", "DB_PASSWORD");  &lt;br /&gt;  mysql_select_db("NOMBRE_DB_DATABASE");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function saveUser($username, $gcmcode){&lt;br /&gt;  $response = array("success" =&amp;gt; "0");&lt;br /&gt;  $sql  ="INSERT INTO usuarios (username, gcmcode) VALUES ('" . stripslashes($username) . "', '" . stripslashes($gcmcode) . "') &lt;br /&gt;    ON DUPLICATE KEY UPDATE gcmcode = '" . stripslashes($gcmcode)."' ; ";&lt;br /&gt;  &lt;br /&gt;  $result = mysql_query($sql);&lt;br /&gt;  if(mysql_affected_rows() &amp;gt; 0)&lt;br /&gt;   $response["success"] = "1";  &lt;br /&gt;  &lt;br /&gt;  return json_encode($response);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function getUser($username){&lt;br /&gt;  $response = array("success" =&amp;gt; 0);&lt;br /&gt;  &lt;br /&gt;  $sql = "SELECT username, gcmcode&lt;br /&gt;    FROM usuarios &lt;br /&gt;    WHERE username='".stripslashes($username)."';";&lt;br /&gt;  $result = mysql_query($sql);&lt;br /&gt;  if(mysql_num_rows($result) &amp;gt; 0){&lt;br /&gt;   $data = mysql_fetch_array($result);&lt;br /&gt;   &lt;br /&gt;   return $data;&lt;br /&gt;  } else &lt;br /&gt;   return false;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para empezar, en el contructor de la clase &lt;b&gt;users&lt;/b&gt; configuramos la base de datos. Se debería tener los parámetros en un archivo de configuración a parte, pero para simplificar lo dejamos así. El método &lt;b&gt;saveUser&lt;/b&gt; recibe el nombre de nuestro usuario en la aplicación y el código que nos dió Google. Como veis se intenta hacer un insert en la tabla de usuarios y en caso de que el usuario ya exista se renueva el código de Google. Esto es por lo que os comentaba antes, Google de vez en cuando puede cambiar nuestro código usuario y debemos actualizarlo. El método &lt;b&gt;getUser&lt;/b&gt; lo utilizaremos en el siguiente archivo y nos devolverá información sobre un determinado usuario.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo siguiente es el archivo destinado a gestionar los mensajes, el cual llamaremos &lt;b&gt;gcm.php&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?php &lt;br /&gt;class gcm {&lt;br /&gt; &lt;br /&gt; function __construct() {&lt;br /&gt;  $con = mysql_connect("NOMBRE_HOST", "NOMBRE_DB_USER", "DB_PASSWORD");&lt;br /&gt;  mysql_select_db("NOMBRE_DB_DATABASE");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; function sendMessageToPhone($collapseKey, $messageText, $username)&lt;br /&gt; {&lt;br /&gt;  include_once 'users.php';&lt;br /&gt;  $user = new users();&lt;br /&gt;  $data = $user-&amp;gt;getUser($username); &lt;br /&gt;  if($data != false){&lt;br /&gt;  &lt;br /&gt;   $apiKey = 'AQUI LA API KEY PARA SERVER QUE OS PROPORCIONÓ GOOGLE';&lt;br /&gt;   &lt;br /&gt;   $userIdentificador = $data["gcmcode"];&lt;br /&gt;   &lt;br /&gt;   $headers = array('Authorization:key=' . $apiKey);&lt;br /&gt;   $data = array(&lt;br /&gt;     'registration_id' =&amp;gt; $userIdentificador,&lt;br /&gt;     'collapse_key' =&amp;gt; $collapseKey,&lt;br /&gt;     'data.message' =&amp;gt; $messageText);&lt;br /&gt;  &lt;br /&gt;   $ch = curl_init();&lt;br /&gt;  &lt;br /&gt;   curl_setopt($ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send");&lt;br /&gt;   if ($headers)&lt;br /&gt;    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);&lt;br /&gt;   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);&lt;br /&gt;   curl_setopt($ch, CURLOPT_POST, true);&lt;br /&gt;   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);&lt;br /&gt;  &lt;br /&gt;   $response = curl_exec($ch);&lt;br /&gt;   $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);&lt;br /&gt;   if (curl_errno($ch)) {&lt;br /&gt;    return 'fail';&lt;br /&gt;   }&lt;br /&gt;   if ($httpCode != 200) {&lt;br /&gt;    return 'status code 200';&lt;br /&gt;   }&lt;br /&gt;   curl_close($ch);&lt;br /&gt;   return $response;&lt;br /&gt;  } else {&lt;br /&gt;   return 'no user';&lt;br /&gt;  }&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Otra vez en el constructor estamos inicializando la conexión a la base de datos. Y el método &lt;b&gt;sendMessagetoPhone&lt;/b&gt; recibe tres parámetros. El primero es un identificador para indicarle a Google si debe colapsar o no los mensajes en caso de que hablen de un mismo tema. Si lanzais notificaciones sobre una misma noticia por ejemplo, colapsará los mensajes. Podeis utilizar por ejemplo el id de la noticia, su permalink que actuará como identificador, en fin, algo único que os sirva para identificar notificaciones del mismo tipo. El segundo es el mensaje que vamos a mandar y el tercero el nombre del usuario al que le enviamos el mensaje.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Este método lo que va a hacer es enviar al servidor de Google una petición para enviar un mensaje. En el apartado de &lt;b&gt;registration_id&lt;/b&gt;, si queremos enviar a más de un dispositivo simplemente creamos un array con los ids de los usuarios de destino. Y el atributo &lt;b&gt;data.message&lt;/b&gt; nos sirve para enviar el texto del mensaje. Si quisieramos enviar más datos como por ejemplo la fecha, añadiriamos el parámetro data.fecha, y si queremos, también el nombre del autor sería data.autor. Todo lo que querramos añadir a mayores debe ir precedido de "data.".&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Finalmente este método nos devolverá el resultado de la petición, la cual puede fallar por diversos motivos. El como gestionemos los errores ya dependerá de cada uno.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El último archivo que nos queda por ver es el &lt;b&gt;index.php&lt;/b&gt;, este servirá como entrada para llamar a todas los métodos que creamos antes.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?php&lt;br /&gt;include_once 'users.php';&lt;br /&gt;include_once 'gcm.php';&lt;br /&gt;$tag = $_POST['tag'];&lt;br /&gt;&lt;br /&gt;switch ($tag){&lt;br /&gt; case 'usersave':&lt;br /&gt;  $username = "";&lt;br /&gt;  $gcmcode = "";&lt;br /&gt;  if(isset($_POST['username']))&lt;br /&gt;   $username = $_POST['username'];&lt;br /&gt;  if(isset($_POST['gcmcode']))&lt;br /&gt;   $gcmcode = $_POST['gcmcode'];&lt;br /&gt;  &lt;br /&gt;  $user = new users();&lt;br /&gt;  echo $user-&amp;gt;saveUser($username, $gcmcode);&lt;br /&gt;  break;&lt;br /&gt; case 'sendmessage':&lt;br /&gt;  $username = "";&lt;br /&gt;  $message = "";&lt;br /&gt;  $collapseKey = "";&lt;br /&gt;  if(isset($_POST['message']))&lt;br /&gt;   $message = $_POST['message'];&lt;br /&gt;  if(isset($_POST['username']))&lt;br /&gt;   $username = $_POST['username'];&lt;br /&gt;  if(isset($_POST['collapsekey']))&lt;br /&gt;   $collapseKey = $_POST['collapsekey'];&lt;br /&gt;  $message = new gcm();&lt;br /&gt;  echo $message-&amp;gt;sendMessageToPhone($collapseKey, $message, $username);&lt;br /&gt;  break;&lt;br /&gt; default:&lt;br /&gt;  $response = array("success" =&amp;gt; "0", "err" =&amp;gt; "no tag");&lt;br /&gt;  echo json_encode($response);&lt;br /&gt;  break;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El archivo es muy simple, simplemente recibe por post un parámetro tag que será el que nos diga que acción realizar. Si insertamos o actualizamos un nuevo usuario además debemos enviar el nombre de usuario y el código de registro para ese usuario en el servicio de Google.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Si lo que hacemos es enviar un mensaje le indicamos el nombre de usuario, el mensaje y el collapseKey que será por así decirlo como un identificador para mensajes que se agrupen por un mismo tema. Por ejemplo para una noticia en concreto. En este caso estamos asumiendo que solo vamos a enviar a un único usuario, pero si fueramos a enviar a más usuarios, deberiamos modificar el método para poder recibir todos los usuarios que quisieramos.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Bueno, y hasta aquí por esta semana. La siguiente veremos la parte cliente en Android. Como registrar un usuario en el servicio de Google Cloud Messaging y como recibir mensajes y notificarlo.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=zbpC1e3BsXE:2yf6ko-FeSU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5238054528113596238" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5238054528113596238" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/notificaciones-push-i.html" title="Notificaciones Push en Android I" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-_u6SmHx2UTE/UMeDs-zsPoI/AAAAAAAAAq0/6pWvxJsPa3g/s72-c/gcm-logo.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-121145647455306657</id><published>2012-12-06T19:16:00.001+01:00</published><updated>2012-12-06T22:50:16.390+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Fragment" /><title type="text">Cómo utilizar fragments en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-cfOOfe5eKMw/T-DyayXYaCI/AAAAAAAAAUY/fgJNp23MZ-8/s1600/mascot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-cfOOfe5eKMw/T-DyayXYaCI/AAAAAAAAAUY/fgJNp23MZ-8/s1600/mascot.png" style="width: 75px;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Con las primeras versiones para tablet de Android se incluyó una nueva funcionalidad en la API de Google, los fragments. Trozos de la interfaz de usuario con su propio comportamiento y que pueden ser re-utilizados en las pantallas que deseemos. Por ejemplo para hacer un panel multiple al estilo de la app de Gmail o la app de nosinmiubuntu blog.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small; text-align: justify;"&gt;La siguiente imagen está sacada de la web de &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://android.com/" style="text-align: justify;"&gt;android.com&lt;/a&gt;&lt;span style="text-align: justify;"&gt;, en ella se nos muestra que con la utilización de fragments podemos llegar a conseguir que en una tablet tengamos dos pantallas de listado-detalle y en un móvil se vea en dos pantallas diferentes. Con esto se consigue aprovechar al máximo el espacio disponible según el dispositivo.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-7LRY3hkwfbA/UL2e_tx45UI/AAAAAAAAAp4/vPkaKB9RsM4/s1600/fragments.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://4.bp.blogspot.com/-7LRY3hkwfbA/UL2e_tx45UI/AAAAAAAAAp4/vPkaKB9RsM4/s1600/fragments.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como dije al principio, esta funcionalidad está disponible a partir de la versión 3.0 de Android, lo cual nos dejaría a las versiones 2.x sin ella, salvo que utilicemos la librería &lt;a href="http://www.actionbarsherlock.com/"&gt;ActionBarSherlock&lt;/a&gt; . Hoy vamos a explicar el ejemplo que nos proporciona esta en:&amp;nbsp;&lt;a href="https://github.com/JakeWharton/ActionBarSherlock/tree/master/samples/fragments"&gt;https://github.com/JakeWharton/ActionBarSherlock/tree/master/samples/fragments&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a empezar por los layouts, necesitaremos dos, se llaman ambos &lt;b&gt;fragment_layout_support.xml&lt;/b&gt;, uno va en la carpeta &lt;b&gt;layout&lt;/b&gt; y otro en &lt;b&gt;layout-land&lt;/b&gt;. Esto es así porque &amp;nbsp;tendremos dos vistas diferentes dependiendo de la orientación de la pantalla, portrait o landscape.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Esta es la versión de la carpeta layout:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:layout_width="match_parent" android:layout_height="match_parent"&amp;gt;&lt;br /&gt;    &amp;lt;fragment class="&lt;/b&gt;&lt;b&gt;&lt;span style="color: red;"&gt;aqui.vuestro.espacio.de.nombres&lt;/span&gt;&lt;/b&gt;&lt;b&gt;.FragmentLayoutSupport$TitlesFragment"&lt;/b&gt;&lt;br /&gt;&lt;b&gt;            android:id="@+id/titles"&lt;br /&gt;            android:layout_width="match_parent" android:layout_height="match_parent" /&amp;gt;&lt;br /&gt;&amp;lt;/FrameLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y esta la de la carpeta layout-land:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:orientation="horizontal"&lt;br /&gt;    android:layout_width="match_parent" android:layout_height="match_parent"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;fragment class="&lt;span style="color: red;"&gt;aqui.vuestro.espacio.de.nombres&lt;/span&gt;.FragmentLayoutSupport$TitlesFragment"&lt;br /&gt;            android:id="@+id/titles" android:layout_weight="1"&lt;br /&gt;            android:layout_width="0px" android:layout_height="match_parent" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;FrameLayout android:id="@+id/details" android:layout_weight="1"&lt;br /&gt;            android:layout_width="0px" android:layout_height="match_parent" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La diferencia entre ambos es el FrameLayout de la versión landscape. También indico en rojo que debeis poner vuestro espacio de nombres en vez del que traía el ejemplo. Justo despues de eso viene el nombre de la Activity que crearemos a continuación.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ahora vamos a ver como sería la Activity que gestiona nuestros fragments. Tiene alguna diferencia con el original ya que he quitado comentarios y el método setTheme que lo utilizan para cambiar el aspecto general de la app, y que a nosotros aquí no nos hace falta y puede llegar a confundirnos.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como dije antes se llamará &lt;b&gt;FragmentLayoutSupport&lt;/b&gt; y hereda de &lt;b&gt;SherlockFragmentActivity&lt;/b&gt; para que podamos tener toda la funcionalidad de los fragments. El método onCreate no tiene ningún problema, hacemos la llamada como siempre a nuestro layout.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo que más nos importa en un primer momento son las dos clases que tenemos dentro de la Activity, DetailsActivity y TitlesFragment. La primera verifica en su onCreate la orientación de la pantalla. Si estamos en posición LandScape no se va a utilizar ya que se mostrará al lado del detalle. En caso de utilizarse instanciamos la clase &lt;b&gt;DetailsFragment&lt;/b&gt; que veremos más adelante para mostrar el contenido de cualquiera de los items.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class FragmentLayoutSupport extends SherlockFragmentActivity {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.fragment_layout_support);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This is a secondary activity, to show what the user has selected&lt;br /&gt;     * when the screen is not large enough to show it all in one activity.&lt;br /&gt;     */&lt;br /&gt;&lt;br /&gt;    public static class DetailsActivity extends SherlockFragmentActivity {&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;            super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;            if (getResources().getConfiguration().orientation&lt;br /&gt;                    == Configuration.ORIENTATION_LANDSCAPE) {&lt;br /&gt;                // If the screen is now in landscape mode, we can show the&lt;br /&gt;                // dialog in-line with the list so we don't need this activity.&lt;br /&gt;                finish();&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (savedInstanceState == null) {&lt;br /&gt;                // During initial setup, plug in the details fragment.&lt;br /&gt;                DetailsFragment details = new DetailsFragment();&lt;br /&gt;                details.setArguments(getIntent().getExtras());&lt;br /&gt;                getSupportFragmentManager().beginTransaction().add(&lt;br /&gt;                        android.R.id.content, details).commit();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This is the "top-level" fragment, showing a list of items that the&lt;br /&gt;     * user can pick.  Upon picking an item, it takes care of displaying the&lt;br /&gt;     * data to the user as appropriate based on the currrent UI layout.&lt;br /&gt;     */&lt;br /&gt;&lt;br /&gt;    public static class TitlesFragment extends SherlockListFragment {&lt;br /&gt;        boolean mDualPane;&lt;br /&gt;        int mCurCheckPosition = 0;&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void onActivityCreated(Bundle savedInstanceState) {&lt;br /&gt;            super.onActivityCreated(savedInstanceState);&lt;br /&gt;&lt;br /&gt;            // Populate list with our static array of titles.&lt;br /&gt;            setListAdapter(new ArrayAdapter&amp;lt;String&amp;gt;(getActivity(),&lt;br /&gt;                    R.layout.simple_list_item_checkable_1,&lt;br /&gt;                    android.R.id.text1, Shakespeare.TITLES));&lt;br /&gt;&lt;br /&gt;            // Check to see if we have a frame in which to embed the details&lt;br /&gt;            // fragment directly in the containing UI.&lt;br /&gt;            View detailsFrame = getActivity().findViewById(R.id.details);&lt;br /&gt;            mDualPane = detailsFrame != null &amp;amp;&amp;amp; detailsFrame.getVisibility() == View.VISIBLE;&lt;br /&gt;&lt;br /&gt;            if (savedInstanceState != null) {&lt;br /&gt;                // Restore last state for checked position.&lt;br /&gt;                mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (mDualPane) {&lt;br /&gt;                // In dual-pane mode, the list view highlights the selected item.&lt;br /&gt;                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);&lt;br /&gt;                // Make sure our UI is in the correct state.&lt;br /&gt;                showDetails(mCurCheckPosition);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void onSaveInstanceState(Bundle outState) {&lt;br /&gt;            super.onSaveInstanceState(outState);&lt;br /&gt;            outState.putInt("curChoice", mCurCheckPosition);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void onListItemClick(ListView l, View v, int position, long id) {&lt;br /&gt;            showDetails(position);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Helper function to show the details of a selected item, either by&lt;br /&gt;         * displaying a fragment in-place in the current UI, or starting a&lt;br /&gt;         * whole new activity in which it is displayed.&lt;br /&gt;         */&lt;br /&gt;        void showDetails(int index) {&lt;br /&gt;            mCurCheckPosition = index;&lt;br /&gt;&lt;br /&gt;            if (mDualPane) {&lt;br /&gt;                // We can display everything in-place with fragments, so update&lt;br /&gt;                // the list to highlight the selected item and show the data.&lt;br /&gt;                getListView().setItemChecked(index, true);&lt;br /&gt;&lt;br /&gt;                // Check what fragment is currently shown, replace if needed.&lt;br /&gt;                DetailsFragment details = (DetailsFragment)&lt;br /&gt;                        getFragmentManager().findFragmentById(R.id.details);&lt;br /&gt;                if (details == null || details.getShownIndex() != index) {&lt;br /&gt;                    // Make new fragment to show this selection.&lt;br /&gt;                    details = DetailsFragment.newInstance(index);&lt;br /&gt;&lt;br /&gt;                    // Execute a transaction, replacing any existing fragment&lt;br /&gt;                    // with this one inside the frame.&lt;br /&gt;                    FragmentTransaction ft = getFragmentManager().beginTransaction();&lt;br /&gt;                    ft.replace(R.id.details, details);&lt;br /&gt;                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);&lt;br /&gt;                    ft.commit();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            } else {&lt;br /&gt;                // Otherwise we need to launch a new activity to display&lt;br /&gt;                // the dialog fragment with selected text.&lt;br /&gt;                Intent intent = new Intent();&lt;br /&gt;                intent.setClass(getActivity(), DetailsActivity.class);&lt;br /&gt;                intent.putExtra("index", index);&lt;br /&gt;                startActivity(intent);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This is the secondary fragment, displaying the details of a particular&lt;br /&gt;     * item.&lt;br /&gt;     */&lt;br /&gt;&lt;br /&gt;    public static class DetailsFragment extends SherlockFragment {&lt;br /&gt;        /**&lt;br /&gt;         * Create a new instance of DetailsFragment, initialized to&lt;br /&gt;         * show the text at 'index'.&lt;br /&gt;         */&lt;br /&gt;        public static DetailsFragment newInstance(int index) {&lt;br /&gt;            DetailsFragment f = new DetailsFragment();&lt;br /&gt;&lt;br /&gt;            // Supply index input as an argument.&lt;br /&gt;            Bundle args = new Bundle();&lt;br /&gt;            args.putInt("index", index);&lt;br /&gt;            f.setArguments(args);&lt;br /&gt;&lt;br /&gt;            return f;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int getShownIndex() {&lt;br /&gt;            return getArguments().getInt("index", 0);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public View onCreateView(LayoutInflater inflater, ViewGroup container,&lt;br /&gt;                Bundle savedInstanceState) {&lt;br /&gt;            if (container == null) {&lt;br /&gt;                // We have different layouts, and in one of them this&lt;br /&gt;                // fragment's containing frame doesn't exist.  The fragment&lt;br /&gt;                // may still be created from its saved state, but there is&lt;br /&gt;                // no reason to try to create its view hierarchy because it&lt;br /&gt;                // won't be displayed.  Note this is not needed -- we could&lt;br /&gt;                // just run the code below, where we would create and return&lt;br /&gt;                // the view hierarchy; it would just never be used.&lt;br /&gt;                return null;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            ScrollView scroller = new ScrollView(getActivity());&lt;br /&gt;            TextView text = new TextView(getActivity());&lt;br /&gt;            int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,&lt;br /&gt;                    4, getActivity().getResources().getDisplayMetrics());&lt;br /&gt;            text.setPadding(padding, padding, padding, padding);&lt;br /&gt;            scroller.addView(text);&lt;br /&gt;            text.setText(Shakespeare.DIALOGUE[getShownIndex()]);&lt;br /&gt;            return scroller;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La clase &lt;b&gt;TitlesFragment&lt;/b&gt; hereda de &lt;b&gt;SherlockListFragment&lt;/b&gt; y nos servirá para mostrar una lista de elementos. Para que empiece a funcionar, si vais a los layouts&amp;nbsp;veréis&amp;nbsp;en el atributo class del fragment que&amp;nbsp;después&amp;nbsp;de hacer referencia a nuestra Activity se añade el simbolo $ y el nombre de la clase TitlesFragment. Y con esto el fragment ya sabe a que clase debe llamar para mostrar su contenido.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Lo siguiente de esta clase será rellenar su ListView mediante los valores que hay en la clase Shakespeare. También se intenta instanciar el elemento details, que como vimos antes va a estar solo en un layout. Si no es nulo el valor donde almacenamos su referencia vamos a tener dos paneles para mostrar.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En esta misma clase un poco más adelante encontramos el método &lt;b&gt;showDetails&lt;/b&gt; que nos servirá para mostrar el contenido de cada uno de los items cada vez que pulsemos en un elemento de la lista. En este método se evalúa si estamos en modo &lt;b&gt;mDualPane&lt;/b&gt;, es decir, si tenemos dos paneles. En caso de ser un solo panel simplemente se llama a la activity &lt;b&gt;DetailsActivity&lt;/b&gt; para mostrar el contenido, y en caso de ser dos se instancia &lt;b&gt;DetailsFragment&lt;/b&gt; que pasará a mostrarse en el FrameLayout details de nuestro layout. En ambos casos se les pasa como argumento index para saber de nuestra lista de elementos cual debemos mostrar.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, nos queda explicar la clase &lt;b&gt;DetailsFragment&lt;/b&gt; que ya comentamos antes. Simplemente se va encargar de recoger el parámetro index que nos dirá el item que debemos mostrar de la clase Shakespeare.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Su método &lt;b&gt;onCreateView&lt;/b&gt; será el encargado de crear y devolver la vista que se verá finalmente. En este caso se crea y devuelve un &lt;b&gt;ScrollView&lt;/b&gt; al que se le añade un &lt;b&gt;TextView&lt;/b&gt; con el texto de nuestro item.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Durante todo el artículo hemos hablado de la clase Shakespeare. Simplemente es una clase con dos String Arrays, uno para los títulos y otro para los textos. Se podría complicar mucho más el ejemplo descargando datos de un servicio web o leyendo de la base de datos, pero los fragments ya son suficientemente complejos como para en un primer vistazo hacerlo más difícil.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public final class Shakespeare {&lt;br /&gt;    /**&lt;br /&gt;     * Our data, part 1.&lt;br /&gt;     */&lt;br /&gt;    public static final String[] TITLES =&lt;br /&gt;    {&lt;br /&gt;            "Henry IV (1)",&lt;br /&gt;            "Henry V",&lt;br /&gt;            "Henry VIII",&lt;br /&gt;            "Richard II",&lt;br /&gt;            "Richard III",&lt;br /&gt;            "Merchant of Venice",&lt;br /&gt;            "Othello",&lt;br /&gt;            "King Lear"&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Our data, part 2.&lt;br /&gt;     */&lt;br /&gt;    public static final String[] DIALOGUE =&lt;br /&gt;    {&lt;br /&gt;            "So shaken as we are, so wan with care," +&lt;br /&gt;            "Find we a time for frighted peace to pant," +&lt;br /&gt;            "And breathe short-winded accents of new broils" +&lt;br /&gt;            "To be commenced in strands afar remote." +&lt;br /&gt;            "No more the thirsty entrance of this soil" +&lt;br /&gt;            "Shall daub her lips with her own children's blood;" +&lt;br /&gt;            "Nor more shall trenching war channel her fields," +&lt;br /&gt;            "Nor bruise her flowerets with the armed hoofs" +&lt;br /&gt;            "Of hostile paces: those opposed eyes," +&lt;br /&gt;            "Which, like the meteors of a troubled heaven," +&lt;br /&gt;            "All of one nature, of one substance bred," +&lt;br /&gt;            "Did lately meet in the intestine shock" +&lt;br /&gt;            "And furious close of civil butchery" +&lt;br /&gt;            "Shall now, in mutual well-beseeming ranks," +&lt;br /&gt;            "March all one way and be no more opposed" +&lt;br /&gt;            "Against acquaintance, kindred and allies:" +&lt;br /&gt;            "The edge of war, like an ill-sheathed knife," +&lt;br /&gt;            "No more shall cut his master. Therefore, friends," +&lt;br /&gt;            "As far as to the sepulchre of Christ," +&lt;br /&gt;            "Whose soldier now, under whose blessed cross" +&lt;br /&gt;            "We are impressed and engaged to fight," +&lt;br /&gt;            "Forthwith a power of English shall we levy;" +&lt;br /&gt;            "Whose arms were moulded in their mothers' womb" +&lt;br /&gt;            "To chase these pagans in those holy fields" +&lt;br /&gt;            "Over whose acres walk'd those blessed feet" +&lt;br /&gt;            "Which fourteen hundred years ago were nail'd" +&lt;br /&gt;            "For our advantage on the bitter cross." +&lt;br /&gt;            "But this our purpose now is twelve month old," +&lt;br /&gt;            "And bootless 'tis to tell you we will go:" +&lt;br /&gt;            "Therefore we meet not now. Then let me hear" +&lt;br /&gt;            "Of you, my gentle cousin Westmoreland," +&lt;br /&gt;            "What yesternight our council did decree" +&lt;br /&gt;            "In forwarding this dear expedience.",&lt;br /&gt;&lt;br /&gt;            "Hear him but reason in divinity," +&lt;br /&gt;            "And all-admiring with an inward wish" +&lt;br /&gt;            "You would desire the king were made a prelate:" +&lt;br /&gt;            "Hear him debate of commonwealth affairs," +&lt;br /&gt;            "You would say it hath been all in all his study:" +&lt;br /&gt;            "List his discourse of war, and you shall hear" +&lt;br /&gt;            "A fearful battle render'd you in music:" +&lt;br /&gt;            "Turn him to any cause of policy," +&lt;br /&gt;            "The Gordian knot of it he will unloose," +&lt;br /&gt;            "Familiar as his garter: that, when he speaks," +&lt;br /&gt;            "The air, a charter'd libertine, is still," +&lt;br /&gt;            "And the mute wonder lurketh in men's ears," +&lt;br /&gt;            "To steal his sweet and honey'd sentences;" +&lt;br /&gt;            "So that the art and practic part of life" +&lt;br /&gt;            "Must be the mistress to this theoric:" +&lt;br /&gt;            "Which is a wonder how his grace should glean it," +&lt;br /&gt;            "Since his addiction was to courses vain," +&lt;br /&gt;            "His companies unletter'd, rude and shallow," +&lt;br /&gt;            "His hours fill'd up with riots, banquets, sports," +&lt;br /&gt;            "And never noted in him any study," +&lt;br /&gt;            "Any retirement, any sequestration" +&lt;br /&gt;            "From open haunts and popularity.",&lt;br /&gt;&lt;br /&gt;            "I come no more to make you laugh: things now," +&lt;br /&gt;            "That bear a weighty and a serious brow," +&lt;br /&gt;            "Sad, high, and working, full of state and woe," +&lt;br /&gt;            "Such noble scenes as draw the eye to flow," +&lt;br /&gt;            "We now present. Those that can pity, here" +&lt;br /&gt;            "May, if they think it well, let fall a tear;" +&lt;br /&gt;            "The subject will deserve it. Such as give" +&lt;br /&gt;            "Their money out of hope they may believe," +&lt;br /&gt;            "May here find truth too. Those that come to see" +&lt;br /&gt;            "Only a show or two, and so agree" +&lt;br /&gt;            "The play may pass, if they be still and willing," +&lt;br /&gt;            "I'll undertake may see away their shilling" +&lt;br /&gt;            "Richly in two short hours. Only they" +&lt;br /&gt;            "That come to hear a merry bawdy play," +&lt;br /&gt;            "A noise of targets, or to see a fellow" +&lt;br /&gt;            "In a long motley coat guarded with yellow," +&lt;br /&gt;            "Will be deceived; for, gentle hearers, know," +&lt;br /&gt;            "To rank our chosen truth with such a show" +&lt;br /&gt;            "As fool and fight is, beside forfeiting" +&lt;br /&gt;            "Our own brains, and the opinion that we bring," +&lt;br /&gt;            "To make that only true we now intend," +&lt;br /&gt;            "Will leave us never an understanding friend." +&lt;br /&gt;            "Therefore, for goodness' sake, and as you are known" +&lt;br /&gt;            "The first and happiest hearers of the town," +&lt;br /&gt;            "Be sad, as we would make ye: think ye see" +&lt;br /&gt;            "The very persons of our noble story" +&lt;br /&gt;            "As they were living; think you see them great," +&lt;br /&gt;            "And follow'd with the general throng and sweat" +&lt;br /&gt;            "Of thousand friends; then in a moment, see" +&lt;br /&gt;            "How soon this mightiness meets misery:" +&lt;br /&gt;            "And, if you can be merry then, I'll say" +&lt;br /&gt;            "A man may weep upon his wedding-day.",&lt;br /&gt;&lt;br /&gt;            "First, heaven be the record to my speech!" +&lt;br /&gt;            "In the devotion of a subject's love," +&lt;br /&gt;            "Tendering the precious safety of my prince," +&lt;br /&gt;            "And free from other misbegotten hate," +&lt;br /&gt;            "Come I appellant to this princely presence." +&lt;br /&gt;            "Now, Thomas Mowbray, do I turn to thee," +&lt;br /&gt;            "And mark my greeting well; for what I speak" +&lt;br /&gt;            "My body shall make good upon this earth," +&lt;br /&gt;            "Or my divine soul answer it in heaven." +&lt;br /&gt;            "Thou art a traitor and a miscreant," +&lt;br /&gt;            "Too good to be so and too bad to live," +&lt;br /&gt;            "Since the more fair and crystal is the sky," +&lt;br /&gt;            "The uglier seem the clouds that in it fly." +&lt;br /&gt;            "Once more, the more to aggravate the note," +&lt;br /&gt;            "With a foul traitor's name stuff I thy throat;" +&lt;br /&gt;            "And wish, so please my sovereign, ere I move," +&lt;br /&gt;            "What my tongue speaks my right drawn sword may prove.",&lt;br /&gt;&lt;br /&gt;            "Now is the winter of our discontent" +&lt;br /&gt;            "Made glorious summer by this sun of York;" +&lt;br /&gt;            "And all the clouds that lour'd upon our house" +&lt;br /&gt;            "In the deep bosom of the ocean buried." +&lt;br /&gt;            "Now are our brows bound with victorious wreaths;" +&lt;br /&gt;            "Our bruised arms hung up for monuments;" +&lt;br /&gt;            "Our stern alarums changed to merry meetings," +&lt;br /&gt;            "Our dreadful marches to delightful measures." +&lt;br /&gt;            "Grim-visaged war hath smooth'd his wrinkled front;" +&lt;br /&gt;            "And now, instead of mounting barded steeds" +&lt;br /&gt;            "To fright the souls of fearful adversaries," +&lt;br /&gt;            "He capers nimbly in a lady's chamber" +&lt;br /&gt;            "To the lascivious pleasing of a lute." +&lt;br /&gt;            "But I, that am not shaped for sportive tricks," +&lt;br /&gt;            "Nor made to court an amorous looking-glass;" +&lt;br /&gt;            "I, that am rudely stamp'd, and want love's majesty" +&lt;br /&gt;            "To strut before a wanton ambling nymph;" +&lt;br /&gt;            "I, that am curtail'd of this fair proportion," +&lt;br /&gt;            "Cheated of feature by dissembling nature," +&lt;br /&gt;            "Deformed, unfinish'd, sent before my time" +&lt;br /&gt;            "Into this breathing world, scarce half made up," +&lt;br /&gt;            "And that so lamely and unfashionable" +&lt;br /&gt;            "That dogs bark at me as I halt by them;" +&lt;br /&gt;            "Why, I, in this weak piping time of peace," +&lt;br /&gt;            "Have no delight to pass away the time," +&lt;br /&gt;            "Unless to spy my shadow in the sun" +&lt;br /&gt;            "And descant on mine own deformity:" +&lt;br /&gt;            "And therefore, since I cannot prove a lover," +&lt;br /&gt;            "To entertain these fair well-spoken days," +&lt;br /&gt;            "I am determined to prove a villain" +&lt;br /&gt;            "And hate the idle pleasures of these days." +&lt;br /&gt;            "Plots have I laid, inductions dangerous," +&lt;br /&gt;            "By drunken prophecies, libels and dreams," +&lt;br /&gt;            "To set my brother Clarence and the king" +&lt;br /&gt;            "In deadly hate the one against the other:" +&lt;br /&gt;            "And if King Edward be as true and just" +&lt;br /&gt;            "As I am subtle, false and treacherous," +&lt;br /&gt;            "This day should Clarence closely be mew'd up," +&lt;br /&gt;            "About a prophecy, which says that 'G'" +&lt;br /&gt;            "Of Edward's heirs the murderer shall be." +&lt;br /&gt;            "Dive, thoughts, down to my soul: here" +&lt;br /&gt;            "Clarence comes.",&lt;br /&gt;&lt;br /&gt;            "To bait fish withal: if it will feed nothing else," +&lt;br /&gt;            "it will feed my revenge. He hath disgraced me, and" +&lt;br /&gt;            "hindered me half a million; laughed at my losses," +&lt;br /&gt;            "mocked at my gains, scorned my nation, thwarted my" +&lt;br /&gt;            "bargains, cooled my friends, heated mine" +&lt;br /&gt;            "enemies; and what's his reason? I am a Jew. Hath" +&lt;br /&gt;            "not a Jew eyes? hath not a Jew hands, organs," +&lt;br /&gt;            "dimensions, senses, affections, passions? fed with" +&lt;br /&gt;            "the same food, hurt with the same weapons, subject" +&lt;br /&gt;            "to the same diseases, healed by the same means," +&lt;br /&gt;            "warmed and cooled by the same winter and summer, as" +&lt;br /&gt;            "a Christian is? If you prick us, do we not bleed?" +&lt;br /&gt;            "if you tickle us, do we not laugh? if you poison" +&lt;br /&gt;            "us, do we not die? and if you wrong us, shall we not" +&lt;br /&gt;            "revenge? If we are like you in the rest, we will" +&lt;br /&gt;            "resemble you in that. If a Jew wrong a Christian," +&lt;br /&gt;            "what is his humility? Revenge. If a Christian" +&lt;br /&gt;            "wrong a Jew, what should his sufferance be by" +&lt;br /&gt;            "Christian example? Why, revenge. The villany you" +&lt;br /&gt;            "teach me, I will execute, and it shall go hard but I" +&lt;br /&gt;            "will better the instruction.",&lt;br /&gt;&lt;br /&gt;            "Virtue! a fig! 'tis in ourselves that we are thus" +&lt;br /&gt;            "or thus. Our bodies are our gardens, to the which" +&lt;br /&gt;            "our wills are gardeners: so that if we will plant" +&lt;br /&gt;            "nettles, or sow lettuce, set hyssop and weed up" +&lt;br /&gt;            "thyme, supply it with one gender of herbs, or" +&lt;br /&gt;            "distract it with many, either to have it sterile" +&lt;br /&gt;            "with idleness, or manured with industry, why, the" +&lt;br /&gt;            "power and corrigible authority of this lies in our" +&lt;br /&gt;            "wills. If the balance of our lives had not one" +&lt;br /&gt;            "scale of reason to poise another of sensuality, the" +&lt;br /&gt;            "blood and baseness of our natures would conduct us" +&lt;br /&gt;            "to most preposterous conclusions: but we have" +&lt;br /&gt;            "reason to cool our raging motions, our carnal" +&lt;br /&gt;            "stings, our unbitted lusts, whereof I take this that" +&lt;br /&gt;            "you call love to be a sect or scion.",&lt;br /&gt;&lt;br /&gt;            "Blow, winds, and crack your cheeks! rage! blow!" +&lt;br /&gt;            "You cataracts and hurricanoes, spout" +&lt;br /&gt;            "Till you have drench'd our steeples, drown'd the cocks!" +&lt;br /&gt;            "You sulphurous and thought-executing fires," +&lt;br /&gt;            "Vaunt-couriers to oak-cleaving thunderbolts," +&lt;br /&gt;            "Singe my white head! And thou, all-shaking thunder," +&lt;br /&gt;            "Smite flat the thick rotundity o' the world!" +&lt;br /&gt;            "Crack nature's moulds, an germens spill at once," +&lt;br /&gt;            "That make ingrateful man!"&lt;br /&gt;    };&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último nos falta definir nuestra activity en el AndroidManifest.xml, en este caso de una forma un poco diferente al resto de ocasiones:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt; &amp;lt;activity android:label="@string/fragment_layout_support" android:name=".FragmentLayoutSupport" /&amp;gt;&lt;br /&gt; &amp;lt;activity android:name=".FragmentLayoutSupport$DetailsActivity"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=YRnbAEJflzU:UZ3d5Zp7cYM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/121145647455306657" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/121145647455306657" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/como-utilizar-fragments-en-android.html" title="Cómo utilizar fragments en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-cfOOfe5eKMw/T-DyayXYaCI/AAAAAAAAAUY/fgJNp23MZ-8/s72-c/mascot.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-2085413414247600854</id><published>2012-12-04T00:00:00.000+01:00</published><updated>2012-12-04T00:00:01.123+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sistema operativo libre" /><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><category scheme="http://www.blogger.com/atom/ns#" term="Gnome" /><category scheme="http://www.blogger.com/atom/ns#" term="X" /><category scheme="http://www.blogger.com/atom/ns#" term="Guía" /><category scheme="http://www.blogger.com/atom/ns#" term="Berkeley" /><category scheme="http://www.blogger.com/atom/ns#" term="Instalación" /><title type="text">Guía de instalación de FreeBSD (Parte III)</title><content type="html">&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-QOk96sCdxbk/ULTq5XPkAnI/AAAAAAAAAqc/PQ3PsHmlXsc/s1600/freebsd-logo_redimensionado.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-QOk96sCdxbk/ULTq5XPkAnI/AAAAAAAAAqc/PQ3PsHmlXsc/s1600/freebsd-logo_redimensionado.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Tal y como habíamos anticipado en la segunda parte de la guía de instalación de FreeBSD, en esta tercera entrega vamos a instalar el &lt;b&gt;sistema de ventanas &lt;i&gt;X&lt;/i&gt;&lt;/b&gt; y el &lt;b&gt;entorno de escritorio &lt;i&gt;GNOME&lt;/i&gt;&lt;/b&gt;. El procedimiento es el mismo que el utilizado hasta ahora, es decir, mediante &lt;i&gt;pkg_add&lt;/i&gt;.&amp;nbsp; La diferencia está en que el número de paquetes requeridos por &lt;i&gt;X&lt;/i&gt; (y sobre todo por &lt;i&gt;GNOME&lt;/i&gt;) es considerablemente mayor, así que toca armarse de paciencia y esperar a que todas las descargas se completen.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos allá. Instalamos las &lt;i&gt;X&lt;/i&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-SZ693pVvIyc/ULTvKvY652I/AAAAAAAAAqw/mJ68Z2iXj_Q/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-SZ693pVvIyc/ULTvKvY652I/AAAAAAAAAqw/mJ68Z2iXj_Q/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Para que en la configuración de las &lt;i&gt;X&lt;/i&gt; se reconozca el teclado y el ratón es necesario arrancar dos servicios al inicio: &lt;i&gt;&lt;b&gt;D-Bus&lt;/b&gt;&lt;/i&gt; (&lt;i&gt;Desktop Bus&lt;/i&gt;) y &lt;i&gt;&lt;b&gt;HAL&lt;/b&gt;&lt;/i&gt; (&lt;i&gt;Hardware Abstraction Layer&lt;/i&gt;). Para ello, editamos &lt;i&gt;/etc/rc.conf&lt;/i&gt; y añadimos las dos líneas marcadas en verde; luego reiniciamos el equipo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-qTNdNtWPkvI/ULTwUA3HqnI/AAAAAAAAAq4/oqQ8ohLZGa8/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-qTNdNtWPkvI/ULTwUA3HqnI/AAAAAAAAAq4/oqQ8ohLZGa8/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Ejecutamos el configurador:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-MnJciNZqN5o/ULT4HtNDVuI/AAAAAAAAArM/Ll1tNia6xHc/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-MnJciNZqN5o/ULT4HtNDVuI/AAAAAAAAArM/Ll1tNia6xHc/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Se nos&amp;nbsp;confirma que ha sido generado un fichero de configuración&amp;nbsp;&lt;i&gt;/root/xorg.conf.new&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-vLxalnuH7nw/ULT5B1y54BI/AAAAAAAAArU/iKp0LALXrm4/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-vLxalnuH7nw/ULT5B1y54BI/AAAAAAAAArU/iKp0LALXrm4/s400/04.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Comprobamos que&amp;nbsp;dicho fichero existe&amp;nbsp;y lo movemos a &lt;i&gt;/etc/X11/xorg.conf&lt;/i&gt; , pues es en esa ruta donde las &lt;i&gt;X&lt;/i&gt; buscarán su fichero de configuración. A continuación ejecutamos &lt;i&gt;startx&lt;/i&gt; para iniciar el entorno gráfico básico:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-075zfXv6DPA/ULT6K3gtfCI/AAAAAAAAArc/kbiDZMK3Pnc/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-075zfXv6DPA/ULT6K3gtfCI/AAAAAAAAArc/kbiDZMK3Pnc/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;La configuración automática ha funcionado.&amp;nbsp; Para salir utilizamos &lt;i&gt;exit&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-qzIS7K5FO_E/ULT6esRGYqI/AAAAAAAAArk/L7Mo1pJHRx4/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/-qzIS7K5FO_E/ULT6esRGYqI/AAAAAAAAArk/L7Mo1pJHRx4/s400/06.png" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Es el turno de &lt;i&gt;GNOME&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-XlLw3rg3oAE/ULUQzNrST_I/AAAAAAAAAr4/bqzguOk4OMY/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-XlLw3rg3oAE/ULUQzNrST_I/AAAAAAAAAr4/bqzguOk4OMY/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Instalación finalizada:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-uCf4l5KYTXc/ULUQ-SqLHNI/AAAAAAAAAsA/mZii02b_TFw/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-uCf4l5KYTXc/ULUQ-SqLHNI/AAAAAAAAAsA/mZii02b_TFw/s400/08.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Ya no necesitamos ser &lt;i&gt;root&lt;/i&gt;, así que cerramos sesión y entramos con nuestro usuario estándar:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-T5i0naLEQ9g/ULURi_tV7fI/AAAAAAAAAsI/pbifBQuaWa0/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-T5i0naLEQ9g/ULURi_tV7fI/AAAAAAAAAsI/pbifBQuaWa0/s400/09.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Para que al arrancar &lt;i&gt;startx&lt;/i&gt; no nos salga el entorno gráfico anterior, si no que se inicie &lt;i&gt;GNOME&lt;/i&gt;, tenemos que crear el fichero oculto de configuración &lt;i&gt;.xinitrc&lt;/i&gt; y guardar en él la ruta del ejecutable &lt;i&gt;gnome-session&lt;/i&gt;.&amp;nbsp; Buscamos la ruta de dicho ejecutable (con &lt;i&gt;which&lt;/i&gt;) y la escribimos en &lt;i&gt;.xinitrc&lt;/i&gt;.&amp;nbsp; Ahora ya podemos arrancar &lt;i&gt;startx&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-OlCQ8R6CNHc/ULUS8i85iII/AAAAAAAAAsQ/t4kLjAU28pc/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-OlCQ8R6CNHc/ULUS8i85iII/AAAAAAAAAsQ/t4kLjAU28pc/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Bienvenidos a &lt;i&gt;GNOME&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-pPcGlH-RIwc/ULUTNDHtBEI/AAAAAAAAAsY/iyaJ-ZE15Ms/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/-pPcGlH-RIwc/ULUTNDHtBEI/AAAAAAAAAsY/iyaJ-ZE15Ms/s400/11.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Aunque veamos los menús en español, el teclado por defecto está en inglés americano, así que vamos a cambiarlo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-oi5-_1odCTQ/ULUTe0cz4OI/AAAAAAAAAsg/Lpg2vtt4tDo/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/-oi5-_1odCTQ/ULUTe0cz4OI/AAAAAAAAAsg/Lpg2vtt4tDo/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Pestaña &lt;i&gt;Distribuciones&lt;/i&gt;, botón &lt;i&gt;Añadir&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-n4OsYcD9YcU/ULUTySsDGeI/AAAAAAAAAso/qQ8GOAAj8dM/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://4.bp.blogspot.com/-n4OsYcD9YcU/ULUTySsDGeI/AAAAAAAAAso/qQ8GOAAj8dM/s400/13.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;País &lt;i&gt;España&lt;/i&gt;, botón &lt;i&gt;Añadir&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-pIdKgi5KqA8/ULUUC2gUF6I/AAAAAAAAAsw/IKVqH7iY05w/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://4.bp.blogspot.com/-pIdKgi5KqA8/ULUUC2gUF6I/AAAAAAAAAsw/IKVqH7iY05w/s400/14.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Marcamos &lt;i&gt;EE.UU.&lt;/i&gt; para eliminarlo y pulsamos el botón &lt;i&gt;Quitar&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-QBNtdNnEjR4/ULUUXgOXwrI/AAAAAAAAAs4/uQ8JCsGjfsg/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://1.bp.blogspot.com/-QBNtdNnEjR4/ULUUXgOXwrI/AAAAAAAAAs4/uQ8JCsGjfsg/s400/15.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Finalmente, si deseamos salir de &lt;i&gt;GNOME&lt;/i&gt; y volver al modo texto:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-_hxNoxI3xgU/ULUVYh8lFgI/AAAAAAAAAtA/OLm4R19Zwig/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://2.bp.blogspot.com/-_hxNoxI3xgU/ULUVYh8lFgI/AAAAAAAAAtA/OLm4R19Zwig/s400/16.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Con esta tercera entrega finalizamos la instalación y la configuración básica de FreeBSD.&amp;nbsp; Esperamos que esta guía sirva como base para promover el interés por este sistema operativo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=KMJQWpLSelo:KxCCqfD0PL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/2085413414247600854" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/2085413414247600854" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/guia-de-instalacion-de-freebsd-parte-iii.html" title="Guía de instalación de FreeBSD (Parte III)" /><author><name>hckorootx</name><uri>http://www.blogger.com/profile/00520963500831835524</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-QOk96sCdxbk/ULTq5XPkAnI/AAAAAAAAAqc/PQ3PsHmlXsc/s72-c/freebsd-logo_redimensionado.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-4961107276185029840</id><published>2012-12-02T12:00:00.000+01:00</published><updated>2012-12-02T15:36:00.892+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software Libre" /><title type="text">Premios PortalProgarmas al mejor Software Libre 2012</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-g6V8HgsuMuE/UAdUPon5pzI/AAAAAAAACbA/7dq_KGMVXjM/s1600/wine-notepad.redimensionado.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-g6V8HgsuMuE/UAdUPon5pzI/AAAAAAAACbA/7dq_KGMVXjM/s1600/wine-notepad.redimensionado.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Desde hace 4 años&lt;span style="font-size: small;"&gt; &lt;/span&gt;la web&amp;nbsp; &lt;b&gt;PortalProgramas&lt;/b&gt; viene celebrando sus &lt;b&gt;"Premios al mejor Software Libre"&lt;/b&gt;, y en esta cuarta edición nos han pedido que lo demos a conocer. Estos premios son un certamen creado para promocionar el conocimiento y el uso de los programas libres&lt;span style="font-size: small;"&gt;, además de q&lt;span style="font-size: small;"&gt;ue los usua&lt;span style="font-size: small;"&gt;rios valoren el trabajo de los desarrollado&lt;span style="font-size: small;"&gt;res.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La mayoría de nosotros utilizamos Software Libre en nuestro día a día con aplicaciones tan conocidas como &lt;i&gt;Firefox&lt;/i&gt;, bases de datos &lt;i&gt;M&lt;/i&gt;&lt;i&gt;ySQL&lt;/i&gt; o el mismo servidor &lt;i&gt;Apache&lt;/i&gt;, aunque siempre salen a la luz nuevos proyectos, que quizá merezcan reconocimiento pero carezcan de la posibilidad de publicitarse al público, y ahí es donde estos premios entran con nuestra colaboración.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-Ds_g0_0svdM/ULqlPIah5XI/AAAAAAAACyk/68dfxUoRW-4/s1600/Captura+de+pantalla+de+2012-12-02+01:47:04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/-Ds_g0_0svdM/ULqlPIah5XI/AAAAAAAACyk/68dfxUoRW-4/s640/Captura+de+pantalla+de+2012-12-02+01:47:04.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt; Entre l&lt;span style="font-size: small;"&gt;as categorías disponibles&lt;span style="font-size: small;"&gt;, &lt;/span&gt;podemos destacar la de&lt;/span&gt; &lt;span style="color: #444444;"&gt;&lt;b&gt;"Programa con mayor potencial de crecimiento"&lt;/b&gt;&lt;/span&gt;,&lt;b&gt;&lt;span style="color: #444444;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #444444;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: black;"&gt;que&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt; recibirá un premio exclusivo en forma  de donación de 300 euros&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size: small;"&gt;o las de &lt;span style="color: #444444;"&gt;&lt;b&gt;"Software Libre más popular"&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #444444;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;b&gt; "Mejor blog de software  libre"&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;,&amp;nbsp; &lt;span style="font-size: small;"&gt;aunque existe un total de &lt;span style="font-size: small;"&gt;diez,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; las cuales podéis consultar en su &lt;b&gt;&lt;a href="http://www.portalprogramas.com/software-libre/premios"&gt;web&lt;/a&gt;&lt;/b&gt;.&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Desde el 26 de Noviembre hasta el 6 de Diciembre, cualquier usuario que lo desee puede&lt;span style="font-size: small;"&gt; &lt;/span&gt;nominar la aplicación o web&lt;span style="font-size: small;"&gt; que considere&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;digna de ello &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;en &lt;span style="font-size: small;"&gt;la sección de &lt;a href="http://www.portalprogramas.com/software-libre/premios/nominar"&gt;&lt;b&gt;nominaci&lt;/b&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;ones&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;. &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;a href="http://www.portalprogramas.com/software-libre/premios/nominar."&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez &lt;span style="font-size: small;"&gt;c&lt;/span&gt;errado el plazo de nominaciones, se procederá&lt;span style="font-size: small;"&gt; a votar en cada categoría&lt;/span&gt; hasta el 28 de diciembre&lt;span style="font-size: small;"&gt;, conociéndose&lt;span style="font-size: small;"&gt; l&lt;/span&gt;&lt;/span&gt;os premiados a partir del 15 de enero. &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Desde el blog consideramos que es una buena iniciativa, ya que con ésta se ayuda a seguir adelante a proyectos muy interesantes, como &lt;span style="font-size: small;"&gt;es&lt;/span&gt; el caso de aplicaciones como &lt;i&gt;LibreOffice, Openshot o Blender&lt;/i&gt; entre otros.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Dispon&lt;span style="font-size: small;"&gt;éis de más información en la we&lt;span style="font-size: small;"&gt;b de &lt;b&gt;&lt;a href="http://www.portalprogramas.com/software-libre/premios"&gt;PortalProgramas&lt;/a&gt;&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Saludos.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=jozK1u_xG-4:Epy5sS3sLZg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/4961107276185029840" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/4961107276185029840" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/12/premios-portalprogarmas-al-mejor.html" title="Premios PortalProgarmas al mejor Software Libre 2012" /><author><name>Ángel Fernández Ochoa</name><uri>https://plus.google.com/108563870874955409518</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-xNDvrcTm9VI/AAAAAAAAAAI/AAAAAAAAC2I/VzmXSo-hVKY/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-g6V8HgsuMuE/UAdUPon5pzI/AAAAAAAACbA/7dq_KGMVXjM/s72-c/wine-notepad.redimensionado.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-5989150131992621181</id><published>2012-11-30T11:00:00.000+01:00</published><updated>2012-12-02T19:11:04.310+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JDownloader" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title type="text">Instala JDownloader en Ubuntu mediante repositorio PPA</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kYMQ1RTfz_g/UIwSSbYZSWI/AAAAAAAACkE/4iJ9oV1mHGw/s1600/jdownloader.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-kYMQ1RTfz_g/UIwSSbYZSWI/AAAAAAAACkE/4iJ9oV1mHGw/s1600/jdownloader.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;La mayoría de vosotros prefiere la descarga directa de archivos desde servicios como Mediafire, Rapidgator o Uploaded entre otros,&amp;nbsp; en lugar de hacerlo por &lt;a href="http://www.nosinmiubuntu.com/2012/11/qbittorent-un-completo-y-liviano.html"&gt;Bittorrent&lt;/a&gt;. Para este tipo de servicios disponemos de una herramienta como es &lt;b&gt;JDownloader.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;JDownloader es una plataforma de&lt;b&gt; &lt;span style="color: #444444;"&gt;&lt;i&gt;código abierto&lt;/i&gt;&lt;/span&gt;&lt;/b&gt; que está escrita en &lt;span style="color: #444444;"&gt;&lt;b&gt;&lt;i&gt;Java&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;, y que nos da la posibilidad de gestionar las descarga de archivos de servidores como los que hemos indicado anteriormente, pudiendo realizar descargas múltiples pararelas, reconocimiento de captcha o incluso extracción automática de archivos que pueden estar divididos en partes.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Esta grandiosa aplicación nos permite automatizar la descarga de una gran cantidad de archivos, pudiendo pararlas y reiniciarlas cuando lo necesitemos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Si quieres instalarla en &lt;b&gt;Ubuntu&lt;/b&gt; existe la opción de hacerlo a través de &lt;b&gt;respositorio PPA&lt;/b&gt;, por lo que bastará con:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: center;"&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;sudo add-apt-repository&amp;nbsp; ppa:jd-team/jdownloader&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;sudo apt-get update&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;sudo apt-get install jdownloader&lt;/b&gt; &lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Al abrir la aplicación p&lt;span style="font-size: small;"&gt;or primera vez nos encontraremos con que &lt;span style="font-size: small;"&gt;comienza a &lt;span style="font-size: small;"&gt;comprobar&lt;span style="font-size: small;"&gt; l&lt;span style="font-size: small;"&gt;os paquetes &lt;span style="font-size: small;"&gt;que hay instalados, para así disponer de la última versión de estos.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nL7LIlFGZg4/ULgQw0Do9oI/AAAAAAAACwo/86u6NVgDjGE/s1600/Captura+de+pantalla+de+2012-11-30+02:45:25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://3.bp.blogspot.com/-nL7LIlFGZg4/ULgQw0Do9oI/AAAAAAAACwo/86u6NVgDjGE/s400/Captura+de+pantalla+de+2012-11-30+02:45:25.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;Una vez iniciada&amp;nbsp; nos pedirá que elijamos el idiom&lt;span style="font-size: small;"&gt;a:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-aUlwmFqLpnY/ULgRMtEm9CI/AAAAAAAACww/w-Ae7oB-nck/s1600/Captura+de+pantalla+de+2012-11-30+02:51:37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://1.bp.blogspot.com/-aUlwmFqLpnY/ULgRMtEm9CI/AAAAAAAACww/w-Ae7oB-nck/s400/Captura+de+pantalla+de+2012-11-30+02:51:37.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;Además nos pregunta si deseam&lt;span style="font-size: small;"&gt;os hacer uso de la extensi&lt;span style="font-size: small;"&gt;ón de gestión de descargas&lt;b&gt; &lt;a href="https://addons.mozilla.org/es/firefox/addon/flashgot/"&gt;FlashGot&lt;/a&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;, y&lt;span style="font-size: small;"&gt; que habrá &lt;span style="font-size: small;"&gt;instalar por separad&lt;span style="font-size: small;"&gt;o&lt;span style="font-size: small;"&gt;, descargándolo desde la página de Addons de&lt;span style="font-size: small;"&gt; Mozilla.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QHAzRnnoOoA/ULgTxnBzsMI/AAAAAAAACw8/d0ez7gmCuUA/s1600/Captura+de+pantalla+de+2012-11-30+03:02:14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://3.bp.blogspot.com/-QHAzRnnoOoA/ULgTxnBzsMI/AAAAAAAACw8/d0ez7gmCuUA/s400/Captura+de+pantalla+de+2012-11-30+03:02:14.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Una vez instalada nos encontraremos que tiene un aspecto bastante intuitivo, y que nos permite &lt;b&gt;añadir los enlaces&lt;/b&gt; con el simple hecho de copiarlos &lt;span style="font-size: small;"&gt;en&lt;/span&gt; el navegador, y que podremos localizar en la pestaña &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'Captura&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dor de &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Enlaces'&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3lXVnKRuxDA/ULgPOcmqilI/AAAAAAAACwg/GdZPR6Fp_j0/s1600/Captura+de+pantalla+de+2012-11-30+02:42:38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://2.bp.blogspot.com/-3lXVnKRuxDA/ULgPOcmqilI/AAAAAAAACwg/GdZPR6Fp_j0/s400/Captura+de+pantalla+de+2012-11-30+02:42:38.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;Además&lt;span style="font-size: small;"&gt;, nos per&lt;span style="font-size: small;"&gt;mite el uso de &lt;b&gt;complementos&lt;/b&gt; para controlarla remotamente, &lt;span style="font-size: small;"&gt;progr&lt;span style="font-size: small;"&gt;amar el apagado del equipo una vez finalice la descarga, o descomprimir automáticamente &lt;span style="font-size: small;"&gt;los archivos descragados que componen&lt;span style="font-size: small;"&gt; uno mayor.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-O7cc5dTgyhI/ULgUpzl-yFI/AAAAAAAACxc/OJQsr-2ojKQ/s1600/Captura+de+pantalla+de+2012-11-30+03:05:12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-O7cc5dTgyhI/ULgUpzl-yFI/AAAAAAAACxc/OJQsr-2ojKQ/s400/Captura+de+pantalla+de+2012-11-30+03:05:12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;unque tras &lt;span style="font-size: small;"&gt;la desapar&lt;span style="font-size: small;"&gt;ición de un servicio &lt;span style="font-size: small;"&gt;como Megaupload ha perdido adeptos&lt;span style="font-size: small;"&gt;, &lt;span style="font-size: small;"&gt;no deja de ser &lt;span style="font-size: small;"&gt;una aplicación muy útil para servicios de es&lt;span style="font-size: small;"&gt;e tipo&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;. &lt;span style="font-size: small;"&gt;E&lt;/span&gt;&lt;/span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, en &lt;span style="font-size: small;"&gt;definitiva,&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;un&lt;span style="font-size: small;"&gt;a herramienta muy fácil de usar&lt;span style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;que nos facilita la descarga de archivos que están &lt;span style="font-size: small;"&gt;divididos &lt;/span&gt;en &lt;span style="font-size: small;"&gt;una gran cantidad de&lt;span style="font-size: small;"&gt; partes,&lt;span style="font-size: small;"&gt; además de una alterna&lt;span style="font-size: small;"&gt;tiva muy válida para usar como gestor de descargas&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;Saludos.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=0Xlx6lqPBGg:05lZr75S5FY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5989150131992621181" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/5989150131992621181" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/instala-jdownloader-en-ubuntu-mediante.html" title="Instala JDownloader en Ubuntu mediante repositorio PPA" /><author><name>Ángel Fernández Ochoa</name><uri>https://plus.google.com/108563870874955409518</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-xNDvrcTm9VI/AAAAAAAAAAI/AAAAAAAAC2I/VzmXSo-hVKY/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kYMQ1RTfz_g/UIwSSbYZSWI/AAAAAAAACkE/4iJ9oV1mHGw/s72-c/jdownloader.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-3148871078540248353</id><published>2012-11-28T21:17:00.001+01:00</published><updated>2012-12-02T03:08:15.337+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlliteopenhelper" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlite" /><category scheme="http://www.blogger.com/atom/ns#" term="onUpdate" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title type="text">Actualizar bases de datos SQLite en Android</title><content type="html">&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s1600/New+Database.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s1600/New+Database.png" style="width: 70px;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;Ya vimos hace un tiempo como manejar una base de datos desde nuestro dispositivo móvil con el motor de base de datos &lt;b&gt;SQLite&lt;/b&gt; que viene con Android. Una de las cosas que nos puede llegar a suceder con el tiempo es que a nuestra base de datos le tengamos que añadir más campos o hacer algún update en alguna tabla.&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small; text-align: justify;"&gt;Normalmente intentamos dejar el modelo de la base de datos bien definido para no tener que hacer cambios en la base de datos. Pero en el caso de que tengamos que hacer modificaciones en nuestra aplicación una vez está publicada esto puede llegar a complicarse, pero no mucho.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a retomar el código que escribimos en su día sobre &lt;a href="http://www.nosinmiubuntu.com/2011/11/como-guardar-datos-en-android-bases-de.html"&gt;como guardar datos en una base de datos&lt;/a&gt;. En ese código definimos una variable llamada versión. Esta versión va a ser la versión de la base de datos. Al introducir nuevos cambios debemos cambiar su valor de 1 a 2, y si más adelante quisieramos hacer más cambios debemos cambiar a 3 y así todas las veces que hagamos un update.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso que tenemos que hacer es definir en una variable que llamaremos &lt;b&gt;SQLUpdateV2&lt;/b&gt; todas las consultas que necesitamos. En este caso como tenemos una tabla de libros vamos a añadirles una columna tipo int que llamaremos precio.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private String SQLUpdateV2 = "ALTER TABLE libros ADD COLUMN precio INT;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez hemos definido esta consulta vamos a utilizar, para ello necesitamos sobreescribir el método onUpdate de la clase &lt;b&gt;SQLiteOpenHelper&lt;/b&gt; de la que hereda la clase que estamos utilizando. Este método nos va dar dos parámetros esenciales, la&amp;nbsp;versión&amp;nbsp;anterior y la versión actual. Comparando estos dos parámetros debemos saber cuando ejecutar nuestra consulta de actualización. Veamos como:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {&lt;br /&gt;if(versionAnterior == 1 &amp;amp;&amp;amp; versionNueva == 2){&lt;br /&gt;db.execSQL(SQLUpdateV2);&lt;br /&gt;}&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Cuando solo tenemos dos versiones la cosa es más fácil. Simplemente comprobamos que la versión anterior es 1 y la nueva es 2. En ese caso ejecutamos nuestra actualización y listo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Tened en cuenta que esto que se está ejecutando no nos tenemos que preocupar de ejecutarlo por nuestra cuenta ya que al heredar de la clase &lt;b&gt;SQLiteOpenHelper&lt;/b&gt;, cuando creamos un objeto de nuestra clase se ejecutará automáticamente.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a complicar un poco más la cosa. Ya hemos realizado los cambios, subido la aplicación al market y hay gente que ya se la descargó y otra que no. Por lo tanto, hay gente con la versión 1 y gente con la versión 2. Y nos damos cuenta que tendríamos que haber dado un valor por defecto de 20 a los libros. Vamos otra vez a crear nuestra consulta de actualización. Pero esta vez le llamamos &lt;b&gt;SQLUpdateV3&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;private String SQLUpdateV3 = "UPDATE libros SET precio = 20;"&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Y el método &lt;b&gt;onUpdate&lt;/b&gt; debemos modificarlo de la siguiente forma. No os&amp;nbsp;olvidéis&amp;nbsp;de cambiar el parámetro versión a 3.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;@Override&lt;br /&gt;public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {&lt;br /&gt;if(versionAnterior == 1 &amp;amp;&amp;amp; versionNueva &amp;gt;= 2){&lt;br /&gt;db.execSQL(SQLUpdateV2);&lt;br /&gt;}&lt;br /&gt;if(versionAnterior &amp;gt;= 1 &amp;amp;&amp;amp; versionNueva &amp;gt;= 3){&lt;br /&gt;db.execSQL(SQLUpdateV3);&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En este caso hemos cambiado un poco la condición para la actualización de la versión 2, serán aquellas cuya versión antigua sea la 1 y la nueva de la 2 en adelante, porque el usuario puede tener la 2 o la 3. Y para la actualización a la versión 3 serán aquellos que tengan la versión anterior 1 en adelante y la nueva debe ser la 3 en adelante.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Debemos hacerlo así por lo que os decía, una vez publicada en el market la app, perdemos el control de la versión de la base de datos que tiene la gente, puede haber gente que pase por todas las versiones de la base de datos y otras que salte de la 1 a la 3 sin pasar por la 2. Una vez que tenemos esto claro es muy fácil hacer actualizaciones en la base de datos de nuestra app.&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=OgAoBXohcrM:qSzRj4BD1qc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3148871078540248353" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/3148871078540248353" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/actualizar-bases-de-datos-sqlite-en.html" title="Actualizar bases de datos SQLite en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6Yyp7O_uV3A/TtTDReE8TXI/AAAAAAAAAJw/pAjJQLbKxb4/s72-c/New+Database.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-264598793196389564</id><published>2012-11-27T00:00:00.000+01:00</published><updated>2012-12-02T17:58:17.239+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sistema operativo libre" /><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><category scheme="http://www.blogger.com/atom/ns#" term="Guía" /><category scheme="http://www.blogger.com/atom/ns#" term="Berkeley" /><category scheme="http://www.blogger.com/atom/ns#" term="Instalación" /><title type="text">Guía de instalación de FreeBSD (Parte II)</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CccCDiVSft0/ULObpZQU-TI/AAAAAAAAAoo/Eykx3mBYMFI/s1600/freebsd-logo_redimensionado.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-CccCDiVSft0/ULObpZQU-TI/AAAAAAAAAoo/Eykx3mBYMFI/s1600/freebsd-logo_redimensionado.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En esta segunda entrega de la guía de instalación de FreeBSD vamos a instalar &lt;i&gt;&lt;b&gt;vim&lt;/b&gt;&lt;/i&gt;, versión mejorada (&lt;i&gt;&lt;b&gt;V&lt;/b&gt;i &lt;b&gt;IM&lt;/b&gt;proved&lt;/i&gt;) del conocido editor de texto &lt;i&gt;vi&lt;/i&gt;, y configurarlo para que se comporte como el &lt;i&gt;vim&lt;/i&gt; de Linux.&amp;nbsp; También llevaremos a cabo las modificaciones necesarias para utilizar el &lt;b&gt;mapa de teclado ISO-8859-15&lt;/b&gt; (teclado español con símbolo del Euro).&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Comencemos entrando en el sistema como usuario &lt;i&gt;root&lt;/i&gt;.&amp;nbsp; Esta es la pantalla de bienvenida:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-wuE7GMqIkzE/ULOd2bir6PI/AAAAAAAAAow/YgsewBYplHY/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-wuE7GMqIkzE/ULOd2bir6PI/AAAAAAAAAow/YgsewBYplHY/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;En FreeBSD, la utilidad destinada a la instalación de paquetes es &lt;b&gt;&lt;i&gt;pkg_add&lt;/i&gt;&lt;/b&gt;. Instalemos &lt;i&gt;vim&lt;/i&gt; (la opción &lt;i&gt;-r&lt;/i&gt; le indica a &lt;i&gt;pkg_add&lt;/i&gt; que descargue el paquete de los repositorios de FreeBSD):&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-TJlFnewPyKo/ULOe_-UUZLI/AAAAAAAAAo4/iIlviFxxhLs/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-TJlFnewPyKo/ULOe_-UUZLI/AAAAAAAAAo4/iIlviFxxhLs/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Paquete instalado.&amp;nbsp; Se nos muestra una advertencia de seguridad y el modo de subsanarla, añadiendo la línea &lt;code&gt;set nomodeline&lt;/code&gt; al fichero de configuración de &lt;i&gt;vim&lt;/i&gt; (&lt;i&gt;~/.vimrc&lt;/i&gt;):&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-w0xAqAzftjY/ULOgG9K8PAI/AAAAAAAAApA/PsfvElE9IKE/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-w0xAqAzftjY/ULOgG9K8PAI/AAAAAAAAApA/PsfvElE9IKE/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Agregamos dicha línea y otras tres para completar la configuración de &lt;i&gt;vim&lt;/i&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;set nocompatible&lt;/code&gt; (Evitar cambios inesperados por parte del sistema operativo)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;set backspace=2&lt;/code&gt; (Comportamiento de la tecla &lt;i&gt;Retroceso&lt;/i&gt;: 2 = borrar carácter)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;set tabstop=4&lt;/code&gt; (La tecla &lt;i&gt;Tab&lt;/i&gt; provoca un salto de 4 espacios)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-X2mnXX6JRWg/ULOmw2Yb5BI/AAAAAAAAApU/6tEnIvUBcwA/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-X2mnXX6JRWg/ULOmw2Yb5BI/AAAAAAAAApU/6tEnIvUBcwA/s400/04.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El siguiente paso es configurar el mapa de teclado.&amp;nbsp; Editamos el fichero &lt;i&gt;/etc/rc.conf&lt;/i&gt; (&lt;i&gt;# vim /etc/rc.conf&lt;/i&gt;) y comentamos la segunda línea, que en teoría está para que el mapa de teclado sea el español, pero que en la práctica no funciona.&amp;nbsp; Para entrar en el modo de edición de &lt;i&gt;vim&lt;/i&gt; pulsamos la tecla &lt;i&gt;i&lt;/i&gt; ; vemos cómo aparece la palabra &lt;i&gt;-- INSERT --&lt;/i&gt;. Luego añadimos las líneas marcadas en verde:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-1QlOkomTFIk/ULOoQ8m4nYI/AAAAAAAAApc/59Tsm7I_JBc/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-1QlOkomTFIk/ULOoQ8m4nYI/AAAAAAAAApc/59Tsm7I_JBc/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para guardar los cambios, pulsamos la tecla &lt;i&gt;Esc&lt;/i&gt; (saliendo así del modo de edición) y escribimos &lt;i&gt;:x&lt;/i&gt; para grabar y salir.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;A continuación editamos el fichero &lt;i&gt;/etc/login.conf&lt;/i&gt; .&amp;nbsp; Añadimos las dos líneas marcadas en verde:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-rpZQroWe2Vs/ULOsU8JStxI/AAAAAAAAApw/_7tamaoRgRc/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-rpZQroWe2Vs/ULOsU8JStxI/AAAAAAAAApw/_7tamaoRgRc/s400/06.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Comentamos las cuatro líneas marcadas en rojo y salimos guardando los cambios:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-6Ji3VNA_jSM/ULOsn2BIlyI/AAAAAAAAAp4/_dFO42YxiEA/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-6Ji3VNA_jSM/ULOsn2BIlyI/AAAAAAAAAp4/_dFO42YxiEA/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para generar una versión en forma de base de datos de &lt;i&gt;/etc/login.conf&lt;/i&gt; (&lt;i&gt;/etc/login.conf.db&lt;/i&gt;), mejorando así el rendimiento del sistema, ejecutamos el siguiente comando y reiniciamos el equipo:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-zemSrcWuAbk/ULOuGF5SJSI/AAAAAAAAAqA/ZwgVk7h1X7Y/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-zemSrcWuAbk/ULOuGF5SJSI/AAAAAAAAAqA/ZwgVk7h1X7Y/s400/08.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como podemos observar en la captura que viene a continuación, ya disponemos de vocales con tilde, letra &lt;i&gt;ñ&lt;/i&gt; y símbolo del Euro:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/--7XWqQEGEAw/ULOuWNOCecI/AAAAAAAAAqI/LEQk7j403Uc/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/--7XWqQEGEAw/ULOuWNOCecI/AAAAAAAAAqI/LEQk7j403Uc/s400/09.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Eso es todo.&amp;nbsp; En la próxima entrega instalaremos &lt;b&gt;X&lt;/b&gt; y &lt;b&gt;GNOME&lt;/b&gt;, para poder disfrutar por fin de un entorno gráfico.&amp;nbsp; Saludos!!!&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=A4ai02-ejIU:HM4PdueFRhE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/264598793196389564" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/264598793196389564" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/guia-de-instalacion-de-freebsd-parte-ii.html" title="Guía de instalación de FreeBSD (Parte II)" /><author><name>hckorootx</name><uri>http://www.blogger.com/profile/00520963500831835524</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-CccCDiVSft0/ULObpZQU-TI/AAAAAAAAAoo/Eykx3mBYMFI/s72-c/freebsd-logo_redimensionado.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-9156707590422541359</id><published>2012-11-21T13:06:00.002+01:00</published><updated>2012-11-21T13:49:24.614+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3pies" /><category scheme="http://www.blogger.com/atom/ns#" term="SherlockActionBar" /><category scheme="http://www.blogger.com/atom/ns#" term="configuración" /><category scheme="http://www.blogger.com/atom/ns#" term="sharedpreferences" /><category scheme="http://www.blogger.com/atom/ns#" term="daniel" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title type="text">SharedPreferences aún más fácil en Android</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-RwEUvLFKIkI/Tst87lhBTQI/AAAAAAAAAJg/vX3pHHXB408/s1600/gtk-properties.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-RwEUvLFKIkI/Tst87lhBTQI/AAAAAAAAAJg/vX3pHHXB408/s1600/gtk-properties.png" style="width: 64px;" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;I&lt;/span&gt;nvestigando un poco en una de mis librerías favoritas, &lt;a href="http://www.actionbarsherlock.com/"&gt;ActionBarSherlock&lt;/a&gt;,&amp;nbsp;encontré&amp;nbsp;una forma de crear pantallas de configuración con muy poquito código. Si recordaís ya vimos algo de este tema en &lt;a href="http://www.nosinmiubuntu.com/2011/11/como-guardar-datos-en-android.html"&gt;un artículo sobre las SharedPreferences&lt;/a&gt;. Vamos a tomar el ejemplo que nos&amp;nbsp;da&amp;nbsp;esta librería y lo veremos en detalle.&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size: small; text-align: justify;"&gt;Las pantallas de configuración no tienen muchas opciones, pero con lo que nos ofrece es suficiente para la mayoría de cosas que podemos configurar. La primera diferencia con las pantallas que normalmente hacemos es que estas no se guardan en la carpeta &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b style="text-align: justify;"&gt;layout&lt;/b&gt;&lt;span style="text-align: justify;"&gt;, sino en la &lt;/span&gt;&lt;b style="text-align: justify;"&gt;xml&lt;/b&gt;&lt;span style="text-align: justify;"&gt;. Creamos la carpeta xml, dentro de &lt;/span&gt;&lt;b style="text-align: justify;"&gt;res&lt;/b&gt;&lt;span style="text-align: justify;"&gt;, y en xml creamos un archivo llamado &lt;/span&gt;&lt;b style="text-align: justify;"&gt;preferences.xml&lt;/b&gt;&lt;span style="text-align: justify;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; text-align: justify; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;&lt;br /&gt;    &amp;lt;PreferenceCategory android:title="@string/inline_preferences"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;CheckBoxPreference&lt;br /&gt;                android:key="checkbox_preference"&lt;br /&gt;                android:title="@string/title_checkbox_preference"&lt;br /&gt;                android:summary="@string/summary_checkbox_preference" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/PreferenceCategory&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;PreferenceCategory android:title="@string/dialog_based_preferences"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;EditTextPreference&lt;br /&gt;                android:key="edittext_preference"&lt;br /&gt;                android:title="@string/title_edittext_preference"&lt;br /&gt;                android:summary="@string/summary_edittext_preference"&lt;br /&gt;                android:dialogTitle="@string/dialog_title_edittext_preference" /&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;ListPreference&lt;br /&gt;                android:key="list_preference"&lt;br /&gt;                android:title="@string/title_list_preference"&lt;br /&gt;                android:summary="@string/summary_list_preference"&lt;br /&gt;                android:entries="@array/entries_list_preference"&lt;br /&gt;                android:entryValues="@array/entryvalues_list_preference"&lt;br /&gt;                android:dialogTitle="@string/dialog_title_list_preference" /&amp;gt;&lt;br /&gt;    &amp;lt;/PreferenceCategory&amp;gt;&lt;br /&gt;    &amp;lt;PreferenceCategory android:title="@string/launch_preferences"&amp;gt;&lt;br /&gt;        &amp;lt;PreferenceScreen&lt;br /&gt;                android:title="@string/title_intent_preference"&lt;br /&gt;                android:summary="@string/summary_intent_preference"&amp;gt;&lt;br /&gt;            &amp;lt;intent android:action="android.intent.action.VIEW"&lt;br /&gt;                    android:data="http://www.android.com" /&amp;gt;&lt;br /&gt;        &amp;lt;/PreferenceScreen&amp;gt;&lt;br /&gt;    &amp;lt;/PreferenceCategory&amp;gt;&lt;br /&gt;    &amp;lt;PreferenceCategory android:title="@string/preference_attributes"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;CheckBoxPreference&lt;br /&gt;                android:key="parent_checkbox_preference"&lt;br /&gt;                android:title="@string/title_parent_preference"&lt;br /&gt;                android:summary="@string/summary_parent_preference" /&amp;gt;&lt;br /&gt;        &amp;lt;!-- The visual style of a child is defined by this styled theme attribute. --&amp;gt;&lt;br /&gt;        &amp;lt;CheckBoxPreference&lt;br /&gt;                android:key="child_checkbox_preference"&lt;br /&gt;                android:dependency="parent_checkbox_preference"&lt;br /&gt;                android:layout="?android:attr/preferenceLayoutChild"&lt;br /&gt;                android:title="@string/title_child_preference"&lt;br /&gt;                android:summary="@string/summary_child_preference" /&amp;gt;&lt;br /&gt;    &amp;lt;/PreferenceCategory&amp;gt;&lt;br /&gt;&amp;lt;/PreferenceScreen&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Los elementos básicos de esta pantalla son los &lt;b&gt;PreferenceScreen&lt;/b&gt;, las &lt;b&gt;PreferenceCategory&lt;/b&gt; y los items con los que guardaremos nuestras configuraciones.&amp;nbsp;La PreferenceScreen es la pantalla entera que se nos mostrará, donde se mostrarán el resto de elementos, y las PreferenceCategory nos permiten crear categorías o agrupaciones dentro de nuestra pantalla.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;El elemento común a los diferentes items es que debemos definir la propiedad &lt;b&gt;key&lt;/b&gt;. Esta va a ser la clave que se guarde en las &lt;b&gt;SharedPreferences&lt;/b&gt;&amp;nbsp;para luego poder recuperar los valores almacenados. También podemos darle un título con &lt;b&gt;title&lt;/b&gt; y una descripción con &lt;b&gt;summary&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos a ver los elementos que podemos utilizar:&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;CheckBoxPreference, es un checkbox. En los dos últimos podemos ver un ejemplo de como un CheckBox depende de otro,&amp;nbsp;diciéndole&amp;nbsp;al segundo que depende del primero, este se activará o no según el valor del primero.&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;EditTextPreference, también muy simple. Un TextBox donde podemos ingresar un texto.&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;ListPreference, damos al usuario una serie de opciones predefinidas donde se puede escoger uno de los valores. Luego volveremos a ellos para ver como configurarlos.&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;RingtonePreference. Un item un tanto curioso, nos permite seleccionar una canción cualquiera de nuestro dispositivo.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para poder configurar un ListPreference debemos crear un array con los valores que puede elegir el usuario. Para ello en la carpeta &lt;b&gt;values&lt;/b&gt; dentro de res creamos un archivo llamado &lt;b&gt;arrays.xml&lt;/b&gt;, y dentro de este incluimos todos los arrays que necesitemos.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; text-align: justify; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;    &amp;lt;string-array name="entries_list_preference"&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;Alpha Option 01&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;Beta Option 02&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;Charlie Option 03&amp;lt;/item&amp;gt;  &lt;br /&gt;    &amp;lt;/string-array&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;string-array name="entryvalues_list_preference"&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;alpha&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;beta&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;charlie&amp;lt;/item&amp;gt;  &lt;br /&gt;    &amp;lt;/string-array&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para indicar los valores de nuestro ListPreference seteamos las propiedades &lt;b&gt;entries&lt;/b&gt;, que será el texto que se muestre al usuario, y &lt;b&gt;entryvalues&lt;/b&gt;, que serán los valores que manejará internamente la aplicación. Aunque aquí se manejan dos arrays, si&amp;nbsp;queréis,&amp;nbsp;podéis&amp;nbsp;utilizar uno solo en ambos valores.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Otra de las opciones que hay es insertar una PreferenceScreen dentro de otra. En nuestro ejemplo se inserta un Intent dentro de este para que elijamos que aplicación vamos a utilizar para abrir un navegador.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Vamos ahora a ver como mostrar nuestra pantalla de configuración, simplemente creamos una nueva clase llamada &lt;b&gt;Preference&lt;/b&gt; que será muy similar a una Activity salvo que &amp;nbsp;heredará de&amp;nbsp;&lt;b&gt;SherlockPreferenceActivity&lt;/b&gt;. Acordaros de definirla igual que cualquier otra Activity en el archivo &lt;b&gt;AndroidManifest.xml&lt;/b&gt;.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; text-align: justify; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;public class Preference extends SherlockPreferenceActivity {    &lt;br /&gt;    @Override&lt;br /&gt;    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;        addPreferencesFromResource(R.xml.preferences);&lt;br /&gt;    }&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Como veis es como una Activity salvo por la herencia y que en vez de hacer un setContentView llamamos a &lt;b&gt;addPreferencesFromResource&lt;/b&gt; y le indicamos nuestro archivo de configuración. Al haber heredado de esta clase no tendremos que hacer nada más, sencillo ¿no?&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Cada vez que entremos la configuración ya estará cargada correctamente, y para guardar simplemente &amp;nbsp;seleccionamos un valor en cualquiera de nuestros items de configuración y se guardará automáticamente.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Por último, vamos a ver como podemos obtener los valores configurados desde cualquier sitio de nuestra aplicación. Simplemente creamos un objeto de tipo SharedPreferences y obtenemos el valor correspondiente, en este caso el que tiene la key "edittext_preference".&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; text-align: justify; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Context);&lt;br /&gt;String valor = prefs.getString("edittext_preference", "valor por defecto");&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para este artículo he seguido el ejemplo que ActionBarSherlock pone a nuestra disposición en su cuenta de Github.com. No he incluido los valores @string de todos los componentes porque, además de no ser el punto importante de este artículo, los&amp;nbsp;podéis&amp;nbsp;encontrar en el lugar indicado o sino sustituirlos vosotros por los que se os antoje.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Espero que mi primera entrada &lt;a href="http://www.nosinmiubuntu.com/2012/11/nosinmiubuntu-cambia-de-cara.html"&gt;con el nuevo diseño&lt;/a&gt;, os resulte&amp;nbsp; más amena y fácil de leer. Como siempre estamos encantados de leer vuestros comentarios y  saber que&amp;nbsp;opináis&amp;nbsp;para seguir mejorando.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Escrito por&amp;nbsp;&lt;b&gt;&lt;a href="http://www.3pies.es/"&gt;3pies, desarrollo de aplicaciones móviles Android &amp;amp; web&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=jatHDGhkJ0c:3p3INAne5RY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/9156707590422541359" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/9156707590422541359" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/sharedpreferences-aun-mas-facil-en.html" title="SharedPreferences aún más fácil en Android" /><author><name>3pies</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-vyF0xaDj7ww/T5eg8tcnUxI/AAAAAAAAARM/YRmEEvc77Sk/s220/3piesw.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-RwEUvLFKIkI/Tst87lhBTQI/AAAAAAAAAJg/vX3pHHXB408/s72-c/gtk-properties.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-1516996804349453600</id><published>2012-11-20T20:37:00.000+01:00</published><updated>2012-11-20T23:59:30.095+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sistema operativo libre" /><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><category scheme="http://www.blogger.com/atom/ns#" term="Guía" /><category scheme="http://www.blogger.com/atom/ns#" term="Berkeley" /><category scheme="http://www.blogger.com/atom/ns#" term="Instalación" /><title type="text">Guía de instalación de FreeBSD (Parte I)</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-rDC0NkeVFxw/UKq17ZeIOOI/AAAAAAAACtU/RSwR2DDcWo0/s1600/freebsd-logo.redimensionado.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-rDC0NkeVFxw/UKq17ZeIOOI/AAAAAAAACtU/RSwR2DDcWo0/s1600/freebsd-logo.redimensionado.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;FreeBSD&lt;/b&gt; es un &lt;b&gt;sistema operativo libre&lt;/b&gt; basado en la variante 4.4 BSD-Lite del UNIX de Berkeley (Universidad de California). Es &lt;b&gt;multiusuario&lt;/b&gt;, &lt;b&gt;multitarea&lt;/b&gt; y &lt;b&gt;multiproceso&lt;/b&gt;, y funciona con procesadores&lt;i&gt; Intel&lt;/i&gt;, &lt;i&gt;AMD&lt;/i&gt; y &lt;i&gt;Cyrix&lt;/i&gt; entre otros, tanto en arquitecturas de 32 como de 64 bits. Además, es compatible con los ejecutables binarios de GNU/Linux.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;En esta primera parte de la guía aprenderemos a instalar FreeBSD en nuestro disco duro; dicha instalación se lleva a cabo en modo texto, lo que nos recordará en cierto modo a &lt;a href="http://www.nosinmiubuntu.com/p/slackware-desde-cero.html"&gt;Slackware&lt;/a&gt; o &lt;a href="http://www.nosinmiubuntu.com/p/guia-de-instalacion-de-arch-linux.html"&gt;Arch Linux&lt;/a&gt;. La imagen ISO adecuada para nuestro equipo la podemos encontrar en los siguientes enlaces:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;32 bits:&lt;/b&gt;&amp;nbsp;&lt;a href="ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-dvd1.iso"&gt;FreeBSD-9.0-RELEASE-i386-dvd1.iso&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;64 bits:&lt;/b&gt; &lt;a href="ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-dvd1.iso"&gt;FreeBSD-9.0-RELEASE-amd64-dvd1.iso&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Una vez preparado el medio de instalación, configuramos el equipo para que arranque desde el lector de DVD. En la siguiente captura observamos el comienzo del proceso de carga:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-t2cG0G0CaRc/UKrAKfuh3SI/AAAAAAAAAiU/ozUzY8-vaSU/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-t2cG0G0CaRc/UKrAKfuh3SI/AAAAAAAAAiU/ozUzY8-vaSU/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;A continuación se nos presenta una pantalla de bienvenida con varias opciones. Para iniciar la instalación del sistema operativo basta con pulsar &lt;b&gt;1&lt;/b&gt; ó &lt;b&gt;ENTER&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-8oYM4Fziz_g/UKrARodLtlI/AAAAAAAAAic/F5mK7_SELpk/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-8oYM4Fziz_g/UKrARodLtlI/AAAAAAAAAic/F5mK7_SELpk/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Antes de proceder, es necesario aclarar que en los sucesivos menús utilizaremos los &lt;b&gt;CURSORES&lt;/b&gt; para desplazarnos por ellos, la &lt;b&gt;BARRA ESPACIADORA&lt;/b&gt; para seleccionar/deseleccionar elementos y la tecla &lt;b&gt;ENTER&lt;/b&gt; para confirmar los cambios realizados. Comenzamos presionando &lt;b&gt;ENTER&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-P-mY-9BUbQY/UKqvyK6mZ_I/AAAAAAAAAh4/Gah_S5Qq52s/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-P-mY-9BUbQY/UKqvyK6mZ_I/AAAAAAAAAh4/Gah_S5Qq52s/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;¿&lt;/span&gt;&lt;span style="font-size: small;"&gt;Vamos a especificar un mapa de teclado? Sí:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/--cCJQZ6F13g/UKrBkIdqwmI/AAAAAAAAAik/X285eXdUmpg/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/--cCJQZ6F13g/UKrBkIdqwmI/AAAAAAAAAik/X285eXdUmpg/s400/04.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Teclado español con símbolo del Euro (ISO-8859-15&lt;/span&gt;&lt;span style="font-size: small;"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-XpOmpk6M4F8/UKrB2yMmnZI/AAAAAAAAAis/I5r2LVMBnoE/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://3.bp.blogspot.com/-XpOmpk6M4F8/UKrB2yMmnZI/AAAAAAAAAis/I5r2LVMBnoE/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Le damos un nombre &lt;/span&gt;&lt;span style="font-size: small;"&gt;al equipo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-D9ioHn3cEyI/UKrCFBqTGHI/AAAAAAAAAi0/hH-yM72vlhM/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-D9ioHn3cEyI/UKrCFBqTGHI/AAAAAAAAAi0/hH-yM72vlhM/s400/06.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Seleccionamos componentes opcionales&lt;/span&gt;&lt;span style="font-size: small;"&gt;; en este caso, sólo la colección de ports (un &lt;b&gt;port&lt;/b&gt; se utiliza para instalar una aplicación mediante la compilación de su código fuente, en contraposición al &lt;b&gt;package&lt;/b&gt;, que consiste en la instalación de los binarios ya compilados, tal y como sucede con el &lt;i&gt;apt-get install&lt;/i&gt; de Ubuntu):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-lD6Q-znvkg8/UKrE0ktBGqI/AAAAAAAAAjE/3qoj9iUWk18/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-lD6Q-znvkg8/UKrE0ktBGqI/AAAAAAAAAjE/3qoj9iUWk18/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Es el momento de particionar el disco duro. Vamos a hacer un particionado manual:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-4xwitatviJA/UKrFn1dKJtI/AAAAAAAAAjM/HPwiAv6OSkE/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-4xwitatviJA/UKrFn1dKJtI/AAAAAAAAAjM/HPwiAv6OSkE/s400/08.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Observamo&lt;/span&gt;&lt;span style="font-size: small;"&gt;s un sólo disco de 15 GB sin particiones. La nomenclatura cambia con respecto a Linux; el primer disco duro pasa de ser &lt;i&gt;/dev/sda&lt;/i&gt; a &lt;i&gt;/dev/ada0&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-0leV6V2mwr8/UKrIPL6X-CI/AAAAAAAAAjc/PbjCLs8gE9E/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-0leV6V2mwr8/UKrIPL6X-CI/AAAAAAAAAjc/PbjCLs8gE9E/s400/09.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-size: small;"&gt;Lo primero es crear la tabla de particiones. Hay varias clases; quizá la más adecuada (por moderna y flexible) sería &lt;b&gt;GPT&lt;/b&gt;, pero utilizaremos la clásica &lt;b&gt;MBR&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-mvOGgFSfKQM/UKrJc4qYyWI/AAAAAAAAAjk/c81xLJaguDA/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-mvOGgFSfKQM/UKrJc4qYyWI/AAAAAAAAAjk/c81xLJaguDA/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Tabla de particiones satisfactoriamente creada:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-Tkb9pw4kFkU/UKrJoTq7e6I/AAAAAAAAAjs/bdO8bLIL8mk/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-Tkb9pw4kFkU/UKrJoTq7e6I/AAAAAAAAAjs/bdO8bLIL8mk/s400/11.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;En el siguiente paso encontramos otra diferencia con Linux; en Linux asignamos directamente cada partición creada a una parte del sistema de ficheros, por ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;/dev/sda1&lt;/i&gt; para &lt;i&gt;/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;/dev/sda2&lt;/i&gt; para &lt;i&gt;/home&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;/dev/sda3&lt;/i&gt; para &lt;i&gt;swap&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;En FreeBSD es necesario crear primero una partición maestra o &lt;b&gt;slice&lt;/b&gt; de tipo &lt;i&gt;freebsd&lt;/i&gt;, que contendrá el sistema de ficheros al completo. Si queremos utilizar el disco entero,&amp;nbsp; el slice tendrá su mismo tamaño:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-9n-4Bpf9nNE/UKrMQtEhs0I/AAAAAAAAAj8/QDmZ0_JtbBM/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-9n-4Bpf9nNE/UKrMQtEhs0I/AAAAAAAAAj8/QDmZ0_JtbBM/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;El slice (&lt;i&gt;&lt;b&gt;s1&lt;/b&gt;&lt;/i&gt;) ha sido creado:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-AabucTBUWs0/UKrM1Gjzt3I/AAAAAAAAAkE/w-CLODZQiSg/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-AabucTBUWs0/UKrM1Gjzt3I/AAAAAAAAAkE/w-CLODZQiSg/s400/13.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Ahora ya podemos aplicar la metodología propia de Linux en lo que a particionado se refiere. Creamos 4 particiones, una de 2 GB para el directorio raíz &lt;i&gt;/&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/--vGH0LdAINg/UKrNmQehCKI/AAAAAAAAAkM/iGXbi29FeMw/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/--vGH0LdAINg/UKrNmQehCKI/AAAAAAAAAkM/iGXbi29FeMw/s400/14.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Una de 1 GB para el área de intercambio &lt;i&gt;swap&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-w95H-sbfXT0/UKrN0aD3sbI/AAAAAAAAAkU/xh6lDVKScN8/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-w95H-sbfXT0/UKrN0aD3sbI/AAAAAAAAAkU/xh6lDVKScN8/s400/15.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Una de 1 GB para el directorio &lt;i&gt;/var&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-XqPnS3OptZw/UKrOGviiR4I/AAAAAAAAAkc/IR-PM5yYXUA/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-XqPnS3OptZw/UKrOGviiR4I/AAAAAAAAAkc/IR-PM5yYXUA/s400/16.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Una de 1 GB para el directorio &lt;i&gt;/tmp&lt;/i&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-LDAf_eTWW4M/UKrOSaTRKeI/AAAAAAAAAkk/7b1SmGFxnvY/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-LDAf_eTWW4M/UKrOSaTRKeI/AAAAAAAAAkk/7b1SmGFxnvY/s400/17.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Y una de 10 GB para el directorio &lt;i&gt;/usr&lt;/i&gt; , que es el que más volumen de ficheros va a soportar (en FreeBSD, la localización real de &lt;i&gt;/home&lt;/i&gt; es &lt;i&gt;/usr/home&lt;/i&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-CDbXVDPef70/UKrO8yMEr5I/AAAAAAAAAks/QU2rve2YSx8/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-CDbXVDPef70/UKrO8yMEr5I/AAAAAAAAAks/QU2rve2YSx8/s400/18.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Aquí está el resultado; cuatro particiones &lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;,&lt;i&gt;&lt;b&gt;d&lt;/b&gt;&lt;/i&gt;,&lt;i&gt;&lt;b&gt;e&lt;/b&gt;&lt;/i&gt;,&lt;i&gt;&lt;b&gt;f&lt;/b&gt;&lt;/i&gt; de tipo &lt;i&gt;freebsd-ufs&lt;/i&gt; (lo que vendría siendo &lt;i&gt;ext2&lt;/i&gt; en Linux) y una partición &lt;b&gt;&lt;i&gt;b&lt;/i&gt;&lt;/b&gt; de tipo &lt;i&gt;freebsd-swap&lt;/i&gt;, todo dentro de un único slice &lt;i&gt;s1&lt;/i&gt;. ¿Por qué no está la partición &lt;b&gt;&lt;i&gt;c&lt;/i&gt;&lt;/b&gt;? Porque la letra &lt;i&gt;c&lt;/i&gt; se utiliza para representar el espacio libre en disco... curiosidades o caprichos de los de Berkeley:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-RdCDglKsI7c/UKrQFClrzzI/AAAAAAAAAk0/cUNQPsYMRkQ/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-RdCDglKsI7c/UKrQFClrzzI/AAAAAAAAAk0/cUNQPsYMRkQ/s400/19.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Pulsamos &lt;b&gt;Finish&lt;/b&gt; y luego &lt;b&gt;Commit&lt;/b&gt; para llevar a cabo los cambios:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-UXzmYzOc_DM/UKrQTVnNEZI/AAAAAAAAAk8/x1oUswDrlzM/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-UXzmYzOc_DM/UKrQTVnNEZI/AAAAAAAAAk8/x1oUswDrlzM/s400/20.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Instalando paquetes:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-tFsu75_UpQM/UKrQghd5CFI/AAAAAAAAAlE/mXYhhAwbOBg/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-tFsu75_UpQM/UKrQghd5CFI/AAAAAAAAAlE/mXYhhAwbOBg/s400/21.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Paquetes instalados.&amp;nbsp;Se nos pide una contraseña para el usuario &lt;i&gt;root&lt;/i&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-te3U7Zr7mXg/UKurgzse8fI/AAAAAAAAAlU/qvlWflKo8AQ/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-te3U7Zr7mXg/UKurgzse8fI/AAAAAAAAAlU/qvlWflKo8AQ/s400/22.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Configuración de los dispositivos de red. En este caso tenemos un único dispositivo &lt;i&gt;em0&lt;/i&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-8SetkaV0AKg/UKusJU1TlMI/AAAAAAAAAlc/Z18F7x4cqE8/s1600/23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-8SetkaV0AKg/UKusJU1TlMI/AAAAAAAAAlc/Z18F7x4cqE8/s400/23.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Queremos configurar el protocolo IP versión 4? Sí:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-WAVuuvurz4I/UKusoq2US7I/AAAAAAAAAlk/uR_E2Mxc5yI/s1600/24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-WAVuuvurz4I/UKusoq2US7I/AAAAAAAAAlk/uR_E2Mxc5yI/s400/24.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Utilizar DHCP para obtener la IP? Sí:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-acVuAXMUtTI/UKuwdjOX_YI/AAAAAAAAAl0/MGTCZb5o8sg/s1600/25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-acVuAXMUtTI/UKuwdjOX_YI/AAAAAAAAAl0/MGTCZb5o8sg/s400/25.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Configurar el protocolo IP versión 6? No:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-tNwCyMgOFDc/UKuwrvOUw4I/AAAAAAAAAl8/i47J7snLXYk/s1600/26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-tNwCyMgOFDc/UKuwrvOUw4I/AAAAAAAAAl8/i47J7snLXYk/s400/26.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Direcciones IP de los servidores DNS (ya obtenidas mediante DHCP):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-G8yJL18n0u4/UKuxKwqzALI/AAAAAAAAAmE/ow5ktBnQo30/s1600/27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-G8yJL18n0u4/UKuxKwqzALI/AAAAAAAAAmE/ow5ktBnQo30/s400/27.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Pasamos al siguiente&amp;nbsp;punto de la instalación, la configuración de la zona horaria. No vamos a utilizar UTC, ya que seleccionaremos el huso horario correspondiente a nuestra localización geográfica:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-Jxoamgi3tJs/UKux6TJ_yxI/AAAAAAAAAmM/ONSeewwsVIg/s1600/28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-Jxoamgi3tJs/UKux6TJ_yxI/AAAAAAAAAmM/ONSeewwsVIg/s400/28.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Europa:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-U4T_9FYBRC8/UKuyKKf0bTI/AAAAAAAAAmU/lv3AFfEPcG0/s1600/29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-U4T_9FYBRC8/UKuyKKf0bTI/AAAAAAAAAmU/lv3AFfEPcG0/s400/29.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;España:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-b1f5_oiTAAg/UKuzeizdqqI/AAAAAAAAAmc/1ITYwY5Edb8/s1600/30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-b1f5_oiTAAg/UKuzeizdqqI/AAAAAAAAAmc/1ITYwY5Edb8/s400/30.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Península:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-vzIBa4SXXbg/UKuzxIwxKvI/AAAAAAAAAmk/9oDLxkTzKQI/s1600/31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-vzIBa4SXXbg/UKuzxIwxKvI/AAAAAAAAAmk/9oDLxkTzKQI/s400/31.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Abreviatura para el huso horario seleccionado. &lt;i&gt;CET&lt;/i&gt; o &lt;i&gt;Central European Time&lt;/i&gt; (Francia, Alemania, Italia, España, etc):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-kcDB1tNiSEM/UKu0jIELCnI/AAAAAAAAAms/rJnI_BDN4Hw/s1600/32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-kcDB1tNiSEM/UKu0jIELCnI/AAAAAAAAAms/rJnI_BDN4Hw/s400/32.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Servicios que se iniciarán con el arranque del sistema. Por defecto sólo se inicia el shell seguro &lt;i&gt;sshd&lt;/i&gt;, pero vamos a añadir otro servicio, &lt;i&gt;moused&lt;/i&gt;, encargado del ratón: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-R0UZYktgV4s/UKu81rkhfhI/AAAAAAAAAnA/YsKgWsKbgz8/s1600/33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-R0UZYktgV4s/UKu81rkhfhI/AAAAAAAAAnA/YsKgWsKbgz8/s400/33.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Si por cualquier motivo el sistema se vuelve inestable y queremos ayudar a los programadores de FreeBSD a identificar el problema, podemos habilitar el volcado (o no):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/--OSbDyVlj2s/UKvAr-D3ywI/AAAAAAAAAnU/eacJDDOiI2E/s1600/34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/--OSbDyVlj2s/UKvAr-D3ywI/AAAAAAAAAnU/eacJDDOiI2E/s400/34.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Creamos un usuario estándar? Sí:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-gk6wQT3l-ew/UKvCCB_2YgI/AAAAAAAAAnc/JF1QNf3fS9E/s1600/35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-gk6wQT3l-ew/UKvCCB_2YgI/AAAAAAAAAnc/JF1QNf3fS9E/s400/35.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Como podemos observar en la siguiente captura, se nos solicita diversa información acerca del usuario a crear, pero con introducir el nombre de inicio de sesión y la contraseña nos bastará:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-L1eXxj0U9bA/UKvCl2NvVYI/AAAAAAAAAnk/MlyRYNo4iRA/s1600/36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-L1eXxj0U9bA/UKvCl2NvVYI/AAAAAAAAAnk/MlyRYNo4iRA/s400/36.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Confirmamos la información introducida y, si lo deseamos, agregamos otro usuario (en este caso no):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-47-mTQCLWG8/UKvDuVz4tZI/AAAAAAAAAns/6KBHnoC6PCc/s1600/37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-47-mTQCLWG8/UKvDuVz4tZI/AAAAAAAAAns/6KBHnoC6PCc/s400/37.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Aplicamos la configuración y salimos del instalador:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-pzwPm-FIGu4/UKvFdZwvcII/AAAAAAAAAn0/ErxcUaex_30/s1600/38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-pzwPm-FIGu4/UKvFdZwvcII/AAAAAAAAAn0/ErxcUaex_30/s400/38.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Necesitamos llevar a cabo alguna otra configuración manual a través del terminal? Negativo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-W9exduXwvH4/UKvF8DaksmI/AAAAAAAAAn8/5YrGeUZha3U/s1600/39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-W9exduXwvH4/UKvF8DaksmI/AAAAAAAAAn8/5YrGeUZha3U/s400/39.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Reiniciamos el sistema:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-sqSg1z_oZjY/UKvGB436KHI/AAAAAAAAAoE/vB3Cr0_r_Yo/s1600/40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-sqSg1z_oZjY/UKvGB436KHI/AAAAAAAAAoE/vB3Cr0_r_Yo/s400/40.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Y, por fin, pantalla de login:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-bGR1M2Crk7Q/UKvGQ6pBEcI/AAAAAAAAAoM/AiHRONhGdiI/s1600/41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-bGR1M2Crk7Q/UKvGQ6pBEcI/AAAAAAAAAoM/AiHRONhGdiI/s400/41.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¿Y cómo se apaga el equipo? Con el comando &lt;i&gt;poweroff&lt;/i&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-Tiy7Jh3UU78/UKvHBCdXyXI/AAAAAAAAAoU/Z3_TVECmw6c/s1600/42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://1.bp.blogspot.com/-Tiy7Jh3UU78/UKvHBCdXyXI/AAAAAAAAAoU/Z3_TVECmw6c/s400/42.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;¡Proceso completado! De todos modos, llegado este punto el sistema puede parecer poco útil, sobre todo por la ausencia de un entorno gráfico al que tan acostumbrados estamos.&amp;nbsp; Por ello, en las siguientes entregas de esta guía llevaremos a cabo algunas configuraciones básicas, así como la instalación de X y GNOME.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Como ya habréis observado, FreeBSD no es tan intuitivo como &lt;b&gt;Ubuntu&lt;/b&gt; u otras distribuciones de GNU/Linux, pero es un buen campo de aprendizaje para quienes quieran profundizar en el terreno de los sistemas operativos libres, o incluso utilizarlo como sistema principal, aunque quizá esté más orientado a funcionar como servidor.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Un saludo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=YPz_cdnlzPw:-bITCc96HHU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1516996804349453600" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1516996804349453600" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/guia-de-instalacion-de-freebsd-parte-i.html" title="Guía de instalación de FreeBSD (Parte I)" /><author><name>hckorootx</name><uri>http://www.blogger.com/profile/00520963500831835524</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-rDC0NkeVFxw/UKq17ZeIOOI/AAAAAAAACtU/RSwR2DDcWo0/s72-c/freebsd-logo.redimensionado.png" height="72" width="72" /></entry><entry><id>tag:blogger.com,1999:blog-8847417749346587759.post-1402796579623311098</id><published>2012-11-19T16:00:00.000+01:00</published><updated>2012-11-19T21:02:27.924+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="qBittorrent" /><category scheme="http://www.blogger.com/atom/ns#" term="torrent" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title type="text">qBittorent, un completo y liviano cliente BitTorrent </title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-lUJiaiIzIOk/UKlekUBs_qI/AAAAAAAACrU/amHXxVjxRYo/s1600/Qbittorrent_logo.redimensionado.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-lUJiaiIzIOk/UKlekUBs_qI/AAAAAAAACrU/amHXxVjxRYo/s1600/Qbittorrent_logo.redimensionado.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Durante varios años he venido probando diferentes clientes BitTorrent desde la correspondiente versión de GNU/Linux, y sobre todo desde que me decidí a usar Ubuntu como sistema operativo. Los que he probado hasta el día de hoy han sido KTorrent, Deluge, Transmission y uTorrent, aunque finalmente me he decidido por &lt;b&gt;qBittorrent&lt;/b&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Hasta no hace mucho venía usando &lt;i&gt;uTorrent&lt;/i&gt; p&lt;span style="font-size: small;"&gt;rincipal&lt;span style="font-size: small;"&gt;mente &lt;span style="font-size: small;"&gt;por&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; su velocidad, pero tras probar &lt;i&gt;qBittorrent&lt;/i&gt;, he encontrado mi cliente de descargas para este protocolo, ya que me da la misma &lt;b&gt;velocidad&lt;/b&gt; además de otras&lt;span style="font-size: small;"&gt; funcionalidades&lt;/span&gt;, pero usando una herramienta de &lt;b&gt;Software Libre&lt;/b&gt;, desarrollada por voluntarios y que no tiene nada que envidiarle&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;.&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;Este&lt;span style="font-size: small;"&gt; ligero cliente Bittorrent es&lt;/span&gt;&lt;/span&gt; una aplicación escrita en &lt;i&gt;Qt4&lt;/i&gt;, y basado en la librería &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;libtorrent-rasterbar&lt;span style="font-size: small;"&gt;,&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;y entre sus &lt;b&gt;características&lt;/b&gt;&lt;span style="font-size: small;"&gt;, &lt;span style="font-size: small;"&gt;además de la velocidad, ya men&lt;span style="font-size: small;"&gt;cionada &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;podemos destacar:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Una &lt;b&gt;interfaz&lt;/b&gt; muy similar a la de este tipo de clientes, donde &lt;span style="font-size: small;"&gt;hay una&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;clasificación de los torrents&lt;span style="font-size: small;"&gt; según&lt;span style="font-size: small;"&gt; su&lt;/span&gt;&lt;/span&gt; estado (Descargando, Completados, etc.), aunque nos permite añadir etiquetas con la que realizar nuestra propia clasificación.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/-O50eymfmH3s/UKl066a5U2I/AAAAAAAACr0/DbFw0DJqtv0/s1600/Captura+de+pantalla+de+2012-11-18+23%253A26%253A44.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://4.bp.blogspot.com/-O50eymfmH3s/UKl066a5U2I/AAAAAAAACr0/DbFw0DJqtv0/s400/Captura+de+pantalla+de+2012-11-18+23%253A26%253A44.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Buscador de torre&lt;/b&gt;&lt;b&gt;nts integrado,&lt;/b&gt; en el que localizar lo que necesit&lt;span style="font-size: small;"&gt;e&lt;/span&gt;mos sin necesidad de acudir al navegador u otros complementos, pudiendo además añadir otros motores de búsqueda. Además el buscador nos permite elegir &lt;i&gt;categorías&lt;/i&gt; como 'Juegos', 'Vídeos' o 'Libros' con las que los resultados son más precisos.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-BlvZXhATOdU/UKl3JeGUxPI/AAAAAAAACsE/bh2UzpE6y3Y/s1600/Captura+de+pantalla+de+2012-11-19+01:02:26.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://1.bp.blogspot.com/-BlvZXhATOdU/UKl3JeGUxPI/AAAAAAAACsE/bh2UzpE6y3Y/s400/Captura+de+pantalla+de+2012-11-19+01:02:26.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Lector RSS, &lt;/b&gt;una opción muy interesante para estar al día de las novedades, y que podemos personalizar con diferentes reglas, programando así las descargas de las novedades que en realidad queremos.&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/-Zlb4b0VPTJA/UKl4oJqaFxI/AAAAAAAACsM/xTGn0A7GwDM/s1600/Captura+de+pantalla+de+2012-11-19+01:08:43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://3.bp.blogspot.com/-Zlb4b0VPTJA/UKl4oJqaFxI/AAAAAAAACsM/xTGn0A7GwDM/s400/Captura+de+pantalla+de+2012-11-19+01:08:43.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Interfaz web&lt;/b&gt; con la que controlar la&lt;span style="font-size: small;"&gt;s descargas desde cualquier lugar de manera remota.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/-fX0ZEVWliX0/UKl9kC2zHuI/AAAAAAAACsw/y1xMTH42-Ng/s1600/Captura+de+pantalla+de+2012-11-19+01:29:50.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://1.bp.blogspot.com/-fX0ZEVWliX0/UKl9kC2zHuI/AAAAAAAACsw/y1xMTH42-Ng/s400/Captura+de+pantalla+de+2012-11-19+01:29:50.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Ade&lt;span style="font-size: small;"&gt;más de &lt;span style="font-size: small;"&gt;esto&lt;/span&gt;, incorpora &lt;span style="font-size: small;"&gt;otra serie de funcionalidades que son com&lt;span style="font-size: small;"&gt;unes&lt;/span&gt; a la mayoría de clientes como:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;Es posible&lt;span style="font-size: small;"&gt; a&lt;/span&gt;ñadir torrents &lt;span style="font-size: small;"&gt;directamente desde&lt;/span&gt; la URL.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Soporta todas las extensiones Bittorrent como: DHT, Peer Exchange, Full &lt;span style="font-size: small;"&gt;encryption, Magnet/BitComet URIs, ...&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Posibilidad de limitar velocidad de descarga/subida, además de la prioridad.&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Sopor&lt;span style="font-size: small;"&gt;te para redireci&lt;span style="font-size: small;"&gt;onamiento de puertos&lt;/span&gt; &lt;/span&gt;UPnP/NAT-PMP&lt;span style="font-size: small;"&gt;.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Permite la creación de nuestros propios Torrents , o la selección de archivos a descargar dentro de uno.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Soporte para&amp;nbsp; filtrado de IP.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Si tras esto quieres probar esta interesante aplicación bastará con:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;pre style="border-color: rgb(204, 204, 204); border-style: dashed; border-width: 1px; margin: 0pt; overflow: auto; padding: 8px 12px; width: 640px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;sudo apt-get install qbittorrent&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;Para obtener más información acerca de ella, nada mejor que acceder a la &lt;b&gt;&lt;a href="http://www.qbittorrent.org/"&gt;web oficial del proyecto&lt;/a&gt;&lt;/b&gt;, donde podr&lt;span style="font-size: small;"&gt;ás&lt;/span&gt; encontrar &lt;span style="font-size: small;"&gt;su propio foro, el repositorio &lt;span style="font-size: small;"&gt;git o &lt;/span&gt;&lt;/span&gt;una wiki de ayuda&lt;span style="font-size: small;"&gt;, además de la posibilidad de descargar el c&lt;span style="font-size: small;"&gt;ódigo fuente o el binario de instalación para &lt;span style="font-size: small;"&gt;tu distribución preferida.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;Saludos.&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nosinmiubuntu?a=W334Re1VAvc:eUTkL2Nblt8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nosinmiubuntu?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1402796579623311098" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8847417749346587759/posts/default/1402796579623311098" /><link rel="alternate" type="text/html" href="http://www.nosinmiubuntu.com/2012/11/qbittorent-un-completo-y-liviano.html" title="qBittorent, un completo y liviano cliente BitTorrent " /><author><name>Ángel Fernández Ochoa</name><uri>https://plus.google.com/108563870874955409518</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-xNDvrcTm9VI/AAAAAAAAAAI/AAAAAAAAC2I/VzmXSo-hVKY/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-lUJiaiIzIOk/UKlekUBs_qI/AAAAAAAACrU/amHXxVjxRYo/s72-c/Qbittorrent_logo.redimensionado.png" height="72" width="72" /></entry></feed>
