tag:blogger.com,1999:blog-78655169396029244392024-03-16T17:06:48.082-07:00Tutoriales - HTML 5 -No olvides escribir tu comentario y PARTICIPA!!!Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.comBlogger80125tag:blogger.com,1999:blog-7865516939602924439.post-1458799312775436652023-01-06T16:44:00.001-08:002023-01-06T16:44:19.618-08:00¡No podrás creer lo perfectos que son estos pantalones de Lefties para lucir tus piernas!<p><span style="font-size: medium;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-size: medium;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI7m8rGDEyNYCytyLxYRjLNy5YYPgXoq43I-bSIfHMMa31O26cJXCAFaTTJuVewZoRbKh9GEvKJtXVMqj5eU-V9Man0-juhinoC9__Tlk1pbkhiFPJgFlNFagmMZLVVWbddPDlTLO77Dn-QQp7MrE7A9QlG9Nr8Bmtc3xdRNx3TeD4PEGE8sWuTN88/s768/lefties.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="768" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI7m8rGDEyNYCytyLxYRjLNy5YYPgXoq43I-bSIfHMMa31O26cJXCAFaTTJuVewZoRbKh9GEvKJtXVMqj5eU-V9Man0-juhinoC9__Tlk1pbkhiFPJgFlNFagmMZLVVWbddPDlTLO77Dn-QQp7MrE7A9QlG9Nr8Bmtc3xdRNx3TeD4PEGE8sWuTN88/s320/lefties.png" width="320" /></a></span></div><span style="font-size: medium;"><br />¡Si estás buscando pantalones que realcen tus piernas, Lefties tiene lo que necesitas! La marca de moda española ha lanzado una nueva línea de pantalones que son perfectos para lucir tus piernas.</span><p></p><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p><span style="font-size: medium;">Lo que hace que estos pantalones sean tan especiales es su corte ajustado y el tejido elástico que se ajusta a tu cuerpo como un guante. Además, están disponibles en una amplia variedad de colores y estilos, desde clásicos negros hasta tonos más llamativos como rojo y amarillo.</span></p><p><span style="font-size: medium;">Pero lo mejor de todo es que estos pantalones no sólo te harán lucir bien, sino que también son muy cómodos. Su tejido elástico y su corte ajustado los hacen ideales para cualquier ocasión, desde ir al trabajo hasta salir de fiesta con amigos.</span></p><p><span style="font-size: medium;">Si estás buscando pantalones que realcen tus piernas y te hagan sentir cómoda y segura, ¡no puedes perderte esta nueva línea de Lefties! Con su amplia variedad de colores y estilos, ¡seguro que encontrarás algo que se ajuste a tu estilo y tu cuerpo. ¡No esperes más y consigue ya tus pantalones perfectos de Lefties! **<br /></span></p></div></div></div>Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-11894684507792334592023-01-06T16:36:00.001-08:002023-01-06T16:36:10.133-08:00¡Sorpresa! Inditex baja el precio de este vestido de Bershka que está arrasando en la web<div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p><span style="font-size: medium;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-size: medium;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj42qh6isn0CFPQKYc7mxceI1RYlp1vF_qD05I0CFZbWp6MnHSNVxwdnPCDcWNbRslwotsUxYDt_kG9N8YTq2JUu2mgoaI7fCuDuFCZ_2vtTd5-_LdFazYst1tPx5Mdo95brNnr2-GHPyyaLFPg7VI2U4Su0JjevVg_Q9f2MAmhEIqcC-PrI_zc2Upm/s768/Bershka.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="768" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj42qh6isn0CFPQKYc7mxceI1RYlp1vF_qD05I0CFZbWp6MnHSNVxwdnPCDcWNbRslwotsUxYDt_kG9N8YTq2JUu2mgoaI7fCuDuFCZ_2vtTd5-_LdFazYst1tPx5Mdo95brNnr2-GHPyyaLFPg7VI2U4Su0JjevVg_Q9f2MAmhEIqcC-PrI_zc2Upm/s320/Bershka.png" width="320" /></a></span></div><span style="font-size: medium;"><br />¡Buenas noticias para aquellos que estén buscando un vestido chic y asequible! Inditex, el gigante de la moda español dueño de marcas como Zara, Massimo Dutti y Bershka, ha decidido bajar el precio de un vestido de Bershka que está arrasando en la web.</span><p></p><p><span style="font-size: medium;">Este vestido de Bershka es una pieza versátil que se puede usar tanto para ocasiones formales como informales. Su diseño sencillo pero elegante lo convierte en una opción perfecta para cualquier ocasión. Además, su precio asequible lo ha convertido en un favorito entre las compradoras en línea.</span></p><p><span style="font-size: medium;">Pero ahora, Inditex ha decidido hacerlo aún más atractivo reduciendo aún más su precio. Esta noticia es una gran oportunidad para aquellos que estén buscando un vestido de calidad a un precio asequible.</span></p><p><span style="font-size: medium;">No es la primera vez que Inditex toma medidas para hacer sus productos más accesibles para el público. La compañía ha implementado varias iniciativas en el pasado, como la introducción de líneas de moda sostenible y la creación de programas de reciclaje.</span></p><p><span style="font-size: medium;">Si estás interesado en este vestido de Bershka asequible y chic, ¡no esperes demasiado tiempo! Con su precio reducido, es probable que se agoten rápidamente. ¡No te pierdas esta oportunidad de conseguir una pieza de moda de calidad a un precio asequible gracias a Inditex! ** <br /></span></p></div></div></div><p></p>Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-31386307134937690802020-05-08T02:15:00.000-07:002020-05-15T13:13:11.207-07:00Cómo recuperar mis bitcoins o tokens<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO6MN5HdVYBiohvC9qBPOthuN7lo8LrkLthYyiZnuWOcl_pOxFAoYRm6bnQSzfsHFWqzcXrKJ7jcYyskm-T8LtdDsJJ30k1OW590AffJTQ99NTK43LHwVqcQKkhzgahpMAbJq1g2BDVfM/s1600/hombrepensantedoble.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="270" data-original-width="270" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO6MN5HdVYBiohvC9qBPOthuN7lo8LrkLthYyiZnuWOcl_pOxFAoYRm6bnQSzfsHFWqzcXrKJ7jcYyskm-T8LtdDsJJ30k1OW590AffJTQ99NTK43LHwVqcQKkhzgahpMAbJq1g2BDVfM/s200/hombrepensantedoble.jpg" width="200" /></a></div>
Hoy, vamos a presentar un post algo especial. Se trata de un servicio de ayuda a aquellas personas que bien por desconocimiento o por olvido han dejado de tener acceso a sus cuentas de bitcoins (u otro tipo de criptomonedas).<br />
Estos serían los posibles casos de pérdida:<br />
<ul>
<li>Tengo bitcoins lo pero no se dónde.</li>
<li>Olvidé la contraseña de mi wallet.</li>
<li>Olvidé la contraseña de mi antiguo correo electrónico dónde es posible que estén.</li>
</ul>
<div>
<br /></div>
<div>
<br /></div>
<div>
<a name='more'></a><br /></div>
<div>
También ayudamos en los casos de que tengas sospecha de que un familiar que ya no está, tenía bitcoins y legalmente te pertenecieran. </div>
<div>
<br /></div>
<div>
Si quieres más información o necesitas nuestros servicios no dudes en enviarnos un email a la siguiente direccion de e-mail y estaremos en contacto:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgQILUnKDok9rLYskMjJZQAky0krW5Su5mNlQKJ3-hLaRitrk1SlqDk6aCILDmA8f_brjG84d0d-tQJWIlraQr2LS5l5BCv7CPy5ShnEczNiETZBMI20jVcbKC1S5bDAPG0g_4Aj_fb2s/s1600/BitcoinsLost%2540gmail.com.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="30" data-original-width="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgQILUnKDok9rLYskMjJZQAky0krW5Su5mNlQKJ3-hLaRitrk1SlqDk6aCILDmA8f_brjG84d0d-tQJWIlraQr2LS5l5BCv7CPy5ShnEczNiETZBMI20jVcbKC1S5bDAPG0g_4Aj_fb2s/s1600/BitcoinsLost%2540gmail.com.png" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Muchas gracias.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Posibles entradas:</div>
<div style="text-align: left;">
<ul>
<li>Mi padre tenía bitcoins pero no se se como recuperarlos</li>
<li>Cómo se donde tengo mis antiguos Bitcoins</li>
<li>Yo creo que tuve Bitcoins</li>
<li>He perdido mis Bitcoins para siempre</li>
<li>Nose como retirar los bitcoins</li>
</ul>
</div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com1tag:blogger.com,1999:blog-7865516939602924439.post-18558525742974276422020-04-23T12:18:00.001-07:002020-05-15T13:26:32.319-07:00Gana tokens eth y trx gratis jugando!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh53IHSBZ6uTyNWBba5fqIQhuIxf-U4FnRADfecnHF_aGaY8DEh2khpzuTFjcUaWw3EepLJ7U2GL-ULTF7AUYWDT0BclZZyUuGGTyEKHhtm2dAlLN2QIL01q99QM6Jlq-l7M4iDe-kuJC4/s1600/95275145-pile-of-golden-bitcoin-currency-tokens-isolated-over-the-white-background.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="918" data-original-width="758" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh53IHSBZ6uTyNWBba5fqIQhuIxf-U4FnRADfecnHF_aGaY8DEh2khpzuTFjcUaWw3EepLJ7U2GL-ULTF7AUYWDT0BclZZyUuGGTyEKHhtm2dAlLN2QIL01q99QM6Jlq-l7M4iDe-kuJC4/s200/95275145-pile-of-golden-bitcoin-currency-tokens-isolated-over-the-white-background.jpg" width="165" /></a>Como ya sabemos, en el mundo de criptomonedas, los Tokens, están tomando un protagonismo especial.<br />
<br />
Los Tokens son generados a partir de una blockchain, las blockchain que más tokens tienen son Ethereum y Tron.<br />
<br />
Actualmente el mundo blockchain esta evolucionando hacia los smartphones, con wallets, con aplicaciones para minar y últimamente con juegos dónde la moneda virtual del juego es un Token que pertenece a una blockchain, el cual se puede exportar del juego al Wallet y de ahí moverlo, gastarlo o acumularlo.<br />
<br />
<b>En este post os muestro unas aplicaciones que he probado</b>, de las cuales ya he cobrado y sin gastar nada. No publicaré ningún juego que tengas que hacer un ingreso previo para ganar tokens. En el caso de minar, sí es necesario tener un mínimo de tokens en el wallet para hacerlo funcionar.<br /><pre style="text-align: left;"><br /></pre>
<a name='more'></a>
<h2>
<b><span style="font-size: x-large;">Game: CryptoMiner idleMiner</span></b></h2>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVh3gZIHj11YIJ0SCghtTFrh-n-fvJ6Acazj68KMsuMwXfxm_mn4dZUWFzzZjzJuf9klC0bglQtykT2tElU6HEN6M0j8rPIrmqVjlvBjzuMJ3vO8ajUo6tQmHIf31BsfeVOWnilOOOIY/s1600/Screenshot_20200423-194646.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVh3gZIHj11YIJ0SCghtTFrh-n-fvJ6Acazj68KMsuMwXfxm_mn4dZUWFzzZjzJuf9klC0bglQtykT2tElU6HEN6M0j8rPIrmqVjlvBjzuMJ3vO8ajUo6tQmHIf31BsfeVOWnilOOOIY/s320/Screenshot_20200423-194646.png" width="180" /></a></div>
<b>Cryptominer </b>un juego muy entretenido, es un buen simulador de una granja de minado.<br />
Hay que ir evolucionando las granjas, encargarte de la electricidad, contratar a un personal cualificado para cada tarea e ir recogiendo los beneficios.<br />
<br />
<b>Token</b><br />
<b>Nombre: </b>HoraToken<br />
<b>Cuando: </b>Se cobra semanalmente<br />
<b>Cuanto: </b>Dependiendo en la posición del ranking, suelo cobrar 1000 HoraTokens semanales<br />
<br />
<b>Enlace referido</b><br />
Utilizando este enlace empiezas con HoraTokens Extras:<br />
<br />
<b style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif;"><span style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif; font-size: large;"><a href="https://idleminer.onelink.me/Irub/b20a4a8b" style="background-color: white; color: #1155cc; font-family: Arial, Helvetica, sans-serif;" target="_blank">https://idleminer.onelink.me/<wbr></wbr>Irub/b20a4a8b</a></span></b><br />
<b style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif;"><br /></b><pre style="text-align: left;"></pre><pre style="text-align: left;"><br /></pre><pre style="text-align: left;"><br /></pre><h2><b style="font-size: xx-large;">Game: BeeHive</b></h2><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSToGFiptnnpnk5TrDWSZqMdYV8E2P2VSU0F1W5I4tQE6sk1pWCC-vsPBc2CM0mPhyphenhyphenhJLRvvGIpZthPhO41LROfPB_eFuDwWkbSzGXLeaPwwAEfOEUWIU7EoKffpweNphDH1QBenI3AXQ/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="449" data-original-width="1000" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSToGFiptnnpnk5TrDWSZqMdYV8E2P2VSU0F1W5I4tQE6sk1pWCC-vsPBc2CM0mPhyphenhyphenhJLRvvGIpZthPhO41LROfPB_eFuDwWkbSzGXLeaPwwAEfOEUWIU7EoKffpweNphDH1QBenI3AXQ/w640-h288/efeda75ee5734211a0581fef1f550800.jpg" width="640" /></a></div><b style="font-size: xx-large;"><br /></b></div><div><b>BeeHive</b> es un juego de paciencia, el rol es que eres un apicultor y tienes que ir comprando abejas, las abejas se compran con Tron (trx) y vas recolectando la miel y la vas vendiendo por Tron, contra más abejas más miel, y contra más miel más Tron. El mecanismo es bastante simple y la interfaz esta curiosa. Si entras através del siguiente link tendrás miel de regalo en el registro!</div><div><br /></div><div><b><a href="https://tronhives.com/game?ref=TUFP3XscewSLoqtnU1bFbXRJuT3v2mjZc9" target="_blank">https://tronhives.com/game?ref=TUFP3XscewSLoqtnU1bFbXRJuT3v2mjZc9</a></b></div><h2>
<b style="font-size: xx-large;">Game: Merge Cats</b></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOKEAKdG7PCl3vAahH_D6VNALbwFH9kmXZdfEXIoT2jYAh6ohhabbd2F5VuM66CHXl5GBCOW68W9wCUwfKy0DB3uRENJJ3elJPpmScqonrvHXWYcSL9o6nYM47oqocCaoGZ8W5AYsZ0gE/s1600/Screenshot_20200423-194524.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOKEAKdG7PCl3vAahH_D6VNALbwFH9kmXZdfEXIoT2jYAh6ohhabbd2F5VuM66CHXl5GBCOW68W9wCUwfKy0DB3uRENJJ3elJPpmScqonrvHXWYcSL9o6nYM47oqocCaoGZ8W5AYsZ0gE/s320/Screenshot_20200423-194524.png" width="180" /></a></div>
<div style="text-align: right;">
<br /></div>
<b>Merge Cats </b>es un juego súper adictivo, empiezas a ganar SOUL Tokens desde el primer día. El juego trata de ir consiguiendo gatos e ir fusionándose entre sí para tener gatos de más nivel. Los gatos van corriendo alrededor de la pantalla y van soltando modenas cada vez que pasan por meta.<br />
<br />
<b>Token</b><br />
<b>Nombre: </b>Soul<br />
<b>Cuando: </b>Se cobra cada 1000 souls (cada semana)<br />
<b>Cuanto: </b>Depende de las misiones diáreas aparte de torneos que van creando<br />
<br />
<b>Enlace referido</b><br />
Entra ya con 900 Souls si usas el siguiente enlace:<br />
<br />
<b style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif;"><span style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif; font-size: large;"><a href="https://soulmerge.page.link/Xswx" style="background-color: white; color: #1155cc; font-family: Arial, Helvetica, sans-serif;" target="_blank">https://soulmerge.page.link/<wbr></wbr>Xswx</a></span></b><br />
<b style="background-color: white; color: #1155cc; font-family: arial, helvetica, sans-serif;"><br /></b>
<br />
<br />
<h2>
<b><span style="font-size: x-large;">Min</span></b><b><span style="font-size: x-large;">er: Enecuum</span></b></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnay9MWeqVmoRs9QpwlqUZrMbZ50aNhKxGT8pQLLTRThE9dFfCLiDGAoqeeen5ne_a2uenXDa4DjLgEL0EP_blWixr2PTsI-1pfNmOwZEqdq249pEX0P_dbUP5ZDuoo79fgjB4w_bactc/s1600/Screenshot_20200423-195100.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnay9MWeqVmoRs9QpwlqUZrMbZ50aNhKxGT8pQLLTRThE9dFfCLiDGAoqeeen5ne_a2uenXDa4DjLgEL0EP_blWixr2PTsI-1pfNmOwZEqdq249pEX0P_dbUP5ZDuoo79fgjB4w_bactc/s320/Screenshot_20200423-195100.png" width="180" /></a></div>
<b>Enecuum </b>és un minador para el smartphone, funciona en segundo plano y deja una notificación siempre activa con el Saldo actual y el valor en $. Se puede retirar en cualquier momento.<br />
No he notado ningún cambio en el gasto de batería ya que lo único que hace es firmar certificados SSL como si se tratase de un https.<br />
<br />
El precio del token ENQ va fructuando y ya está disponible para intercambiar a Btc o eth en algunos exchanges.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh30HZwSCDpYdd6-ZWZa8ouo-ET7k-D7UyKctcJDThFsys-niTOG5KKg2yyzu2HDwxjvCs1kTe9wj80BQBtv_MAQmnznTNNcxgLIUS3R_GM0gsGAYEEsoxn-QTyWrXWEDLYEdwB1NUTMvY/s1600/1587664396267.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="500" data-original-width="500" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh30HZwSCDpYdd6-ZWZa8ouo-ET7k-D7UyKctcJDThFsys-niTOG5KKg2yyzu2HDwxjvCs1kTe9wj80BQBtv_MAQmnznTNNcxgLIUS3R_GM0gsGAYEEsoxn-QTyWrXWEDLYEdwB1NUTMvY/s200/1587664396267.jpg" width="200" /></a><b><br /></b><br />
<b>Enlace referido</b><br />
Si escaneas este Qr al registrarte en la app tendrás un benefício de 0.10% diáreo.<br />
<b><br /></b>
<b><span style="font-size: large;"><a href="https://enecuum.com/">https://enecuum.com/</a></span></b><br />
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<br /><br />
<h2>
<b><span style="font-size: x-large;">Miner: Electroneum</span></b></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-VAcxuKNs4Ud9u373PbfLF3rVyRZHULTdxWsYLM8j2NdZxiub6byzFfofI7Xf4iSw1XVvsQsNZI2jn745cBaYfAinOaqTstR_YW7gXat672jt23ryms5aF7wc_T6mx8735RJfNnfeGn8/s1600/Screenshot_20200423-194458.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-VAcxuKNs4Ud9u373PbfLF3rVyRZHULTdxWsYLM8j2NdZxiub6byzFfofI7Xf4iSw1XVvsQsNZI2jn745cBaYfAinOaqTstR_YW7gXat672jt23ryms5aF7wc_T6mx8735RJfNnfeGn8/s320/Screenshot_20200423-194458.png" width="180" /></a></div>
<b>Electroneum </b>és un minador para el smartphone, no es necesario tenerlo en segundo plano, simplemente hay que abrirlo una vez por semana para darle al botón 'Extender' y así minar durante la siguiente semana, aunque la app se mantenga cerrada.<br />
<br />
El Token en ETN y se puede retirar cada 100 ETN, hace que lo tengo una semana, aún no he podido cobrar<br />
<br />
<b>Enlace referido </b><br />
Si introduces este código al registrarte en referido aumentarás la cantidad de ETN, el código hay que introducirlo en 'Generar más ETN' -> 'Ingresar código de referido'<br />
<br />
Código: <b><span style="font-size: large;">727D6B</span></b><br />
<b><span style="font-size: large;"><br /></span></b>
<b><span style="font-size: large;"><br /></span></b>
<b><span style="font-size: large;"><br /></span></b>
<b><span style="font-size: large;"><br /></span></b><i><b>
Muchas grácias, espero vuestros comentarios en el post y comentar que resultados o que juego os gusta más!</b></i>Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com3tag:blogger.com,1999:blog-7865516939602924439.post-47272070270754419322016-01-02T14:24:00.001-08:002016-01-02T14:25:29.330-08:00Full Nodo Bitcoin en Raspberry Wheezy - node<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPgA6acxijGlKJ-MvFa91GxGl2EYdhFlkArMnAEGUXcOJVdf_C3evxTHwkOvTSGWu_ISLyEXuTHAlKyOoAS91vo3tDGvqGiTkZJXbI2UUuko_BWFwi_2wsbMR1IL1n8B1hoZucyw_ePxA/s1600/bitcoin-raspi.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPgA6acxijGlKJ-MvFa91GxGl2EYdhFlkArMnAEGUXcOJVdf_C3evxTHwkOvTSGWu_ISLyEXuTHAlKyOoAS91vo3tDGvqGiTkZJXbI2UUuko_BWFwi_2wsbMR1IL1n8B1hoZucyw_ePxA/s200/bitcoin-raspi.jpg" width="200" /></a></div>
Buenas!<br />
<br />
Hoy os presente este tutorial de como montar un demonio Bitcoin en un Raspberry pi 2.<br />
Si seguís todos los pasos no debeis encontrar ningún error en el proceso.<br />
Los comandos que utilizo en el vídeo están en los comentarios de youtube.<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ArLPPrt_NMo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/ArLPPrt_NMo?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: right;">
<i><span style="color: #999999;">Muchas gracias!</span></i></div>
<div class="separator" style="clear: both; text-align: right;">
<i><span style="color: #999999;">Espero vuestros comentarios!</span></i></div>
<div style="text-align: center;">
<br /></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-59091509670274922942015-12-01T19:15:00.000-08:002015-12-01T19:15:20.792-08:00AppCompatActivity cannot resolve Android Gradle<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjhqwe77y3oD8aWLr8Gk-67JUxRBwsrpdiI3eemBk1A4dHrGWWCGfgnPKCFg3j-LgAQ6hJSxJBvkb3eFrU6MrPjT5JS2dGsm0n5idXZ0Hr1-05lopJC63xuivFvRx7C6nBcvMiy51qbX4/s1600/logo_gradle_android.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjhqwe77y3oD8aWLr8Gk-67JUxRBwsrpdiI3eemBk1A4dHrGWWCGfgnPKCFg3j-LgAQ6hJSxJBvkb3eFrU6MrPjT5JS2dGsm0n5idXZ0Hr1-05lopJC63xuivFvRx7C6nBcvMiy51qbX4/s200/logo_gradle_android.png" width="199" /></a></div>
Buenas a todos!<br />
<br />
Hoy vamos a mostrar una ayuda para todos aquellos que actualizan android Studio y después al intentar generar el Gradle da error en algunos archivos .xml de sistema.<br />
<br />
En este caso en concreto para solucionar el AppCompatActivity. A mi me ayudó mucho espero que a vosotros también.<br />
<br />
El tema está en los archivos build.gradle (tanto en el del Modulo como en el del Project) y en el Compile Sdk Version que se encuentra en las propiedades del proyecto.<br />
<br />
<a name='more'></a><br />
<br />
Guía rápida:<br />
<br />
1- En el archivo build.gradle (project) sustituye tu antigua versión por esta:<br />
<br />
<pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">classpath </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.tools.build:gradle:1.3.1'
</span></code></pre>
<div style="border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">
<span style="color: black; font-family: 'Times New Roman'; white-space: normal;">2- Dependiendo de tu versión de '</span>Compile Sdk Version<span style="color: black; font-family: 'Times New Roman'; white-space: normal;">' que se encuentra en las propiedades tendrás que sustituir tu com.android.support en tu build.gradle (module) por uno de los siguientes:</span></div>
<pre class="default prettyprint prettyprinted" style="border: 0px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;"> </span><span class="com" style="border: 0px; color: grey; margin: 0px; padding: 0px;">//si usas compileSdkVersion=23</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:23.1.0'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:23.0.1'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:23.0.0'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
</span><span class="com" style="border: 0px; color: grey; margin: 0px; padding: 0px;">//si usas compileSdkVersion 22</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:22.2.1'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:22.2.0'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:22.1.1'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:22.1.0'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:22.0.0'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
</span><span class="com" style="border: 0px; color: grey; margin: 0px; padding: 0px;">//si usas compileSdkVersion 21</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:21.0.3'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:21.0.2'</span><span class="pln" style="border: 0px; color: black; margin: 0px; padding: 0px;">
compile </span><span class="str" style="border: 0px; color: maroon; margin: 0px; padding: 0px;">'com.android.support:appcompat-v7:21.0.0'</span></code></pre>
<pre class="default prettyprint prettyprinted" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><span style="font-family: Times New Roman;"><i><span style="background-color: white; white-space: normal;">Al usar el </span><span style="white-space: normal;">AppCompatActivity se pone apartir del compileSdkVersion 22 en target version tengo también 22 tanto en las propiedades como en el build.gradle. Regenerar vuestro gradle (o reinicia android studio guardando cambios) y espero que esté solucionado.</span></i></span></pre>
<pre class="default prettyprint prettyprinted" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; text-align: right; width: auto; word-wrap: normal;"><span style="color: #999999; font-family: Times New Roman;"><span style="white-space: normal;"><i>Muchas gracias! Espero vuestros comentarios!</i></span></span></pre>
</pre>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-65620745442910217902015-05-11T08:03:00.001-07:002015-05-11T08:05:01.728-07:00Fallo: Windows escritorio vacio inicia con usuario temporal ( TEMP )<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQzLDlp9Mtwr6OIjOcPn3jLZRAhGv7X0yNUXQ5du-NCYRqHJJv2IdEn95cOxXsxTBeFNTSAD2d4ewvDKJ6fPVMv4d6uN_rR7XGCqJWLqrA77QUmxgTf-QBWHjIkDYWv6ZXpOPSQf1LnU/s1600/wallpaper-windows-xp-roto.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQzLDlp9Mtwr6OIjOcPn3jLZRAhGv7X0yNUXQ5du-NCYRqHJJv2IdEn95cOxXsxTBeFNTSAD2d4ewvDKJ6fPVMv4d6uN_rR7XGCqJWLqrA77QUmxgTf-QBWHjIkDYWv6ZXpOPSQf1LnU/s200/wallpaper-windows-xp-roto.jpg" width="200" /></a></div>
Buenas tardes!<br />
<br />
Hoy vamos a solucionar un problema que le pasa aveces a windows. Encendemos el Pc un día normal y el escritorio aparece vacío, reiniciamos y sigue igual. ¿Que ha pasado? ¿Que hago?<br />
<br />
Lo que pasa es que esta iniciando el usuario TEMP en vez de el vuestro, a continuación os explico a como solucionarlo de la manera más rápida y fácil posible.<br />
<br />
<b><br /></b>
<b></b><br />
<a name='more'></a><br />
<b>Paso 1:</b><br />
Vamos a ejecutar (buscar en windows 7/8) y escribimos <b>regedit </b>y damos a enter:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt26mIZDtinrrEMh6XGVktHfS6ixkmlzC6FcN6KoGh7gfGFdjUlRF_OgzPYcR0d_CTnakfCcgtwITTZ2xS0ZSTBMxHXCra-sGvI8jHLxgMWREgEkaSxNKsXQ95V6Jqo2yJE24a7O8PEOM/s1600/paso1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt26mIZDtinrrEMh6XGVktHfS6ixkmlzC6FcN6KoGh7gfGFdjUlRF_OgzPYcR0d_CTnakfCcgtwITTZ2xS0ZSTBMxHXCra-sGvI8jHLxgMWREgEkaSxNKsXQ95V6Jqo2yJE24a7O8PEOM/s320/paso1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Paso 2:</b></div>
<div class="separator" style="clear: both; text-align: left;">
Se abrirá una ventana con unos desplegables a la izquierda y vamos clickando hasta llegar al final con lo siguiente:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><i>HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows NT > CurrentVersion > ProfileList</i></span></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><i><br /></i></span></div>
<div style="text-align: left;">
<b>Paso 3:</b></div>
<div style="text-align: left;">
Al desplegar ProfileList veremos unas carpetas, y ahi dos o más que tienen un nombre largo con un formato parecido a este x-xxx-xxx-xxxxxx-xxxxxxxx nos fijamos que habrán <b style="text-decoration: underline;">dos iguales</b> con la única diferencia que una tiene terminación <b><u>.bak </u></b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Hay que cambiar el nombre (F2) y<b> <u>quitar el .bak y añadírselo al final al otro que se llamaba igual.</u></b> ( Ten encuenta que por un momento los nombres coincidirán y no te dejará cambiarlo, añade una X al final para que los nombres no coincidan y recuerda de quitarla después. )</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b>Paso 4:</b></div>
<div style="text-align: left;">
Cerrar el RegEdit y reiniciar el Pc. Y ya estará arreglado.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Muchas gracias a todos!</i></span></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Comentar el resultado para ayudar a los demás!</i></span></div>
<div style="text-align: left;">
<span style="font-size: x-small;"><b><br /></b></span></div>
<div style="text-align: left;">
<span style="font-size: x-small;"><b><br /></b></span></div>
<div style="text-align: left;">
<span style="font-size: x-small;"><b><br /></b></span></div>
<div style="text-align: left;">
<span style="font-size: x-small;"><b><br /></b></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com1tag:blogger.com,1999:blog-7865516939602924439.post-23357589409708615642015-03-06T01:33:00.000-08:002015-03-06T01:33:18.092-08:00Parsing: Ordenar Json online des de web!<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwsKqpodbmJVYmKs1204gbafjn_HpRAQxtZlRAt9JefzshYaqdB_nQ-ndsFV8ghLVwb5mS3dwkpMIRngAm6_yEFsglcj65mqj9s9z-4Y4oDJTD9Fjb0Z3xoqYuuR5PTSSP-HaBd0P_agY/s1600/02540.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwsKqpodbmJVYmKs1204gbafjn_HpRAQxtZlRAt9JefzshYaqdB_nQ-ndsFV8ghLVwb5mS3dwkpMIRngAm6_yEFsglcj65mqj9s9z-4Y4oDJTD9Fjb0Z3xoqYuuR5PTSSP-HaBd0P_agY/s1600/02540.png" /></a></div>
Buenas!<br />
<br />
¿Cuantas veces os ha pasado que tenéis un código Json y está todo a mogollón?<br />
<br />
Pues os pongo un par de páginas webs tools que son muy útiles, simplemente con poner el código Json os lo muestra ordenado en forma de arbol.<br />
<br />
Adjunto unas impresiones de pantalla para que veáis el resultado.<br />
<br />
<br />
<a name='more'></a><br /><br /><div>
- <a href="http://adf.ly/17hVZY">http://json.parser.online.fr/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGOLWC-Hszf5n_gUvuJWxIMbHr3GvRnOzI9T0-c3Pyyw3b802KXfNhgcJj3HxZdRlyto9sLniqsfNuwB6oj3l_s6yvstyLQNxrT4RHwhyphenhyphenWxZbmP7rvjpiB3bb_TXQyiY1w4-Ba2jqbk3w/s1600/111111111111.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGOLWC-Hszf5n_gUvuJWxIMbHr3GvRnOzI9T0-c3Pyyw3b802KXfNhgcJj3HxZdRlyto9sLniqsfNuwB6oj3l_s6yvstyLQNxrT4RHwhyphenhyphenWxZbmP7rvjpiB3bb_TXQyiY1w4-Ba2jqbk3w/s1600/111111111111.PNG" height="320" width="225" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
- <a href="http://adf.ly/17hXDg">https://www.jsoneditoronline.org/</a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRMI4p4JpHq9cKHHOXB3Iiu2ysKZ40u1uQr04lGlJH6iIt2evfCk0nRy97IkKQZcv3nZADkdoHY_G4Pry8b9eMI77LSj2nNpVZ4TN6beJPyLNPaga0AWLROHz-2k3bOacLtP9bpXsSTTo/s1600/222222222222222222.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRMI4p4JpHq9cKHHOXB3Iiu2ysKZ40u1uQr04lGlJH6iIt2evfCk0nRy97IkKQZcv3nZADkdoHY_G4Pry8b9eMI77LSj2nNpVZ4TN6beJPyLNPaga0AWLROHz-2k3bOacLtP9bpXsSTTo/s1600/222222222222222222.PNG" height="320" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Muchas gracias!</i></span></div>
<div class="separator" style="clear: both; text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Espero comentarios!</i></span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<br />
<br />
<br /></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-75638777224257061712015-03-03T04:26:00.000-08:002015-03-03T04:26:10.148-08:00Android: Layout y objetos con semi transparencia (alpha)<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGS0cbZBD8DExlNTHfFSZbZKvFTv45PIbj3e3V5BcKAkEwfioZzZRx_bHMCMsIUebSc5q_UL1o_y09qZKdZdeB8zKOJtNmcRYU6t5EKpmpqiEuzUrrNbmkZGeJflfME-n_pEt7_lD88I/s1600/3434a.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGS0cbZBD8DExlNTHfFSZbZKvFTv45PIbj3e3V5BcKAkEwfioZzZRx_bHMCMsIUebSc5q_UL1o_y09qZKdZdeB8zKOJtNmcRYU6t5EKpmpqiEuzUrrNbmkZGeJflfME-n_pEt7_lD88I/s1600/3434a.png" /></a></div>
Buenos días!<br />
<br />
Hoy mas que un tutorial traigo un pequeño truco muy sencillo para conseguir que nuestras layouts u objetos (pueden set Buttons, Edittext, etc) tengan aspecto de semi-transparencia o lo que es lo mismo, sean menos opacos.<br />
<br />
Todo esto se hace des de el .xml sin mayor complejidad.<br />
<br />
<br />
<a name='more'></a>Para conseguir el efecto de transparencia simplemente hay que añadir dos caracteres delante del código de color Hexagesimal en el apartado background (en este caso).<br />
<pre><span class="nl">android:</span><span class="n">background</span><span class="o">=</span><span class="s">"#FFFFFF"</span> <span class="o">>---->-></span> <span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"#33FFFFFF"</span>
</pre>
Como vemos hemos añadido un 33 que pertenece a un 20% de opacidad.<br />
<br />
Veamos un ejemplo más práctico creando cuatro Layouts:<br />
<pre><span class="o"><</span><span class="n">RelativeLayout</span> <span class="n">xmlns</span><span class="o">:</span><span class="n">android</span><span class="o">=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="n">xmlns</span><span class="o">:</span><span class="n">tools</span><span class="o">=</span><span class="s">"http://schemas.android.com/tools"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"match_parent"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"match_parent"</span>
<span class="n">tools</span><span class="o">:</span><span class="n">context</span><span class="o">=</span><span class="s">".MyActivity"</span>
<span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"@drawable/fondo"</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">EJEMPLO</span> <span class="n">un</span> <span class="n">LinearLayout</span> <span class="mi">100</span><span class="o">%</span> <span class="n">de</span> <span class="n">opacidad</span> <span class="o">--></span>
<span class="o"><</span><span class="n">LinearLayout</span>
<span class="n">android</span><span class="o">:</span><span class="n">orientation</span><span class="o">=</span><span class="s">"horizontal"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"70dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_alignParentTop</span><span class="o">=</span><span class="s">"true"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_centerHorizontal</span><span class="o">=</span><span class="s">"true"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_marginTop</span><span class="o">=</span><span class="s">"126dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">id</span><span class="o">=</span><span class="s">"@+id/linearLayout"</span>
<span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"#FFFFFFFF"</span><span class="o">></</span><span class="n">LinearLayout</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">EJEMPLO</span> <span class="n">un</span> <span class="n">LinearLayout</span> <span class="mi">70</span><span class="o">%</span> <span class="n">opacidad</span> <span class="o">--></span>
<span class="o"><</span><span class="n">LinearLayout</span>
<span class="n">android</span><span class="o">:</span><span class="n">orientation</span><span class="o">=</span><span class="s">"horizontal"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"70dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_below</span><span class="o">=</span><span class="s">"@+id/linearLayout"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_marginTop</span><span class="o">=</span><span class="s">"10dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_centerHorizontal</span><span class="o">=</span><span class="s">"true"</span>
<span class="n">android</span><span class="o">:</span><span class="n">id</span><span class="o">=</span><span class="s">"@+id/linearLayout2"</span>
<span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"#B3FFFFFF"</span><span class="o">></</span><span class="n">LinearLayout</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">EJEMPLO</span> <span class="n">un</span> <span class="n">LinearLayout</span> <span class="mi">40</span><span class="o">%</span> <span class="n">de</span> <span class="n">opacidad</span> <span class="o">--></span>
<span class="o"><</span><span class="n">LinearLayout</span>
<span class="n">android</span><span class="o">:</span><span class="n">orientation</span><span class="o">=</span><span class="s">"horizontal"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"70dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_below</span><span class="o">=</span><span class="s">"@+id/linearLayout2"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_centerHorizontal</span><span class="o">=</span><span class="s">"true"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_marginTop</span><span class="o">=</span><span class="s">"10dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">id</span><span class="o">=</span><span class="s">"@+id/linearLayout3"</span>
<span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"#66FFFFFF"</span><span class="o">></</span><span class="n">LinearLayout</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">EJEMPLO</span> <span class="n">un</span> <span class="n">LinearLayout</span> <span class="mi">20</span><span class="o">%</span> <span class="n">de</span> <span class="n">opacidad</span> <span class="o">--></span>
<span class="o"><</span><span class="n">LinearLayout</span>
<span class="n">android</span><span class="o">:</span><span class="n">orientation</span><span class="o">=</span><span class="s">"horizontal"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"70dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_below</span><span class="o">=</span><span class="s">"@+id/linearLayout3"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_centerHorizontal</span><span class="o">=</span><span class="s">"true"</span>
<span class="n">android</span><span class="o">:</span><span class="n">layout_marginTop</span><span class="o">=</span><span class="s">"10dp"</span>
<span class="n">android</span><span class="o">:</span><span class="n">background</span><span class="o">=</span><span class="s">"#33FFFFFF"</span><span class="o">></</span><span class="n">LinearLayout</span><span class="o">></span>
<span class="o"></</span><span class="n">RelativeLayout</span><span class="o">></span>
</pre>
<br />
Aquí una captura del resultado:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBAPCOUKdeA1u8geRstuXu232eFpJhmgWAzix1MbBpns-O8c9OOIln27LAbbh5BnhgSGeMv19ivShcIO-vR_fh0gDnYmD0Nlz3hGCdJdSG481osQGQPCd03B3negriF5HGWJ8hLDg4oEg/s1600/ddddd.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBAPCOUKdeA1u8geRstuXu232eFpJhmgWAzix1MbBpns-O8c9OOIln27LAbbh5BnhgSGeMv19ivShcIO-vR_fh0gDnYmD0Nlz3hGCdJdSG481osQGQPCd03B3negriF5HGWJ8hLDg4oEg/s1600/ddddd.PNG" height="320" width="198" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Y lo más importante, igual que hemos añadido un '33' para conseguir el 20% de oipacidad aquí os dejo la tabla completa para las demás opacidades:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="background-color: white; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; text-align: center;">
<div style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 19.5px;">
Hex Opacity Values</div>
<div style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 19.5px;">
<br /></div>
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">100% — FF</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">95% — F2</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">90% — E6</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">85% — D9</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">80% — CC</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">75% — BF</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">70% — B3</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">65% — A6</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">60% — 99</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">55% — 8C</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">50% — 80</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">45% — 73</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">40% — 66</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">35% — 59</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">30% — 4D</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">25% — 40</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">20% — 33</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">15% — 26</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">10% — 1A</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">5% — 0D</span></span><br />
<span style="color: #222222; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 19.5px;">0% — 00</span></span></div>
<div style="text-align: right;">
<i><span style="background-color: white; color: #999999; font-size: x-small;">Muchas gracias a todos!!</span></i></div>
<div style="text-align: right;">
<i><span style="background-color: white; color: #999999; font-size: x-small;">Espero vuestros comentarios!</span></i></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com9tag:blogger.com,1999:blog-7865516939602924439.post-49417882524298333232015-02-16T14:36:00.000-08:002015-02-16T14:36:43.020-08:00Android: Guardar datos en la aplicación<div class="separator" style="clear: both; text-align: center;">
<a href="http://techybloggerz.com/wp-content/uploads/2012/07/Save-Space-On-Android.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://techybloggerz.com/wp-content/uploads/2012/07/Save-Space-On-Android.jpg" height="200" width="166" /></a></div>
Buenas tardes!<br />
<br />
Hoy vamos a ver como poder guardar datos en nuestra aplicación de manera persistente, es decir, si cierra la aplicación y mata el proceso al abrirla esos datos guardados seguirán estado disponibles para su utilización.<br />
<br />
La clase que vamos a utilizar es <b>SharedPreferences </b>que funciona con una Key y su valor. Por ejemplo, <i>key=email value=xxx@tutorialeshtml5.com</i>. Para acceder al email abra que buscar la key 'email'.<br />
<br />
Vamos a ver un ejemplo totalmente explicado para entenderlo perfectamente:<br />
<br />
<a name='more'></a><pre><span class="kd">
</span></pre>
<pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyActivity</span> <span class="kd">extends</span> <span class="n">ActionBarActivity</span> <span class="o">{</span>
<span class="c1">//Creamos los objetos necesarios</span>
<span class="kd">private</span> <span class="n">Button</span> <span class="n">bt_guardar</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">TextView</span> <span class="n">txt</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">EditText</span> <span class="n">ed_text</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">SharedPreferences</span> <span class="n">datos</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">valorLeido</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_my</span><span class="o">);</span>
<span class="c1">//Relacionamosocn el Layout XML</span>
<span class="n">bt_guardar</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">button</span><span class="o">);</span>
<span class="n">txt</span> <span class="o">=</span> <span class="o">(</span><span class="n">TextView</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">textView</span><span class="o">);</span>
<span class="n">ed_text</span> <span class="o">=</span> <span class="o">(</span><span class="n">EditText</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">editText</span><span class="o">);</span>
<span class="c1">//Leemos si hay datos guardados llamados 'Mail' en el archivo fichero_app</span>
<span class="c1">//si no encuentra ningún dato cojerá como valor 'dato no encontrado'</span>
<span class="n">datos</span> <span class="o">=</span> <span class="n">getSharedPreferences</span><span class="o">(</span><span class="s">"fichero_app"</span><span class="o">,</span> <span class="n">Context</span><span class="o">.</span><span class="na">MODE_PRIVATE</span><span class="o">);</span>
<span class="n">valorLeido</span> <span class="o">=</span> <span class="n">datos</span><span class="o">.</span><span class="na">getString</span><span class="o">(</span><span class="s">"Mail"</span><span class="o">,</span> <span class="s">"Dato no encontrado"</span><span class="o">);</span>
<span class="c1">//Añadimos el valor leido al textview de la aplicacion</span>
<span class="n">txt</span><span class="o">.</span><span class="na">setText</span><span class="o">(</span><span class="n">valorLeido</span><span class="o">);</span>
<span class="c1">//Al pulsar el boton guardar</span>
<span class="n">bt_guardar</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">View</span><span class="o">.</span><span class="na">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">view</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//recuperamos el 'datos' abierto anteriormente</span>
<span class="n">SharedPreferences</span><span class="o">.</span><span class="na">Editor</span> <span class="n">editor</span> <span class="o">=</span> <span class="n">datos</span><span class="o">.</span><span class="na">edit</span><span class="o">();</span>
<span class="c1">//guardamos ne el campo 'mail' lo que este escrito en el edittext 'ed_text'</span>
<span class="n">editor</span><span class="o">.</span><span class="na">putString</span><span class="o">(</span><span class="s">"Mail"</span><span class="o">,</span> <span class="n">ed_text</span><span class="o">.</span><span class="na">getText</span><span class="o">().</span><span class="na">toString</span><span class="o">());</span>
<span class="c1">//aquí podemois guardar más datos antes del commit.</span>
<span class="n">editor</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
<pre><span class="o">
</span></pre>
<pre><span class="o">Para ver el resultado añado el vídeo del proyecto.</span></pre>
<pre style="text-align: center;"><span class="o">
</span></pre>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/nIJM8QtUrJk/0.jpg" src="http://www.youtube.com/embed/nIJM8QtUrJk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: right;">
<span style="color: #666666; font-size: x-small;"><i>Muchas gracias!</i></span></div>
<div class="separator" style="clear: both; text-align: right;">
<span style="color: #666666; font-size: x-small;"><i>Espero comentarios!</i></span></div>
<pre style="text-align: center;"><span class="o">
</span></pre>
<pre style="text-align: center;"><span class="o">
</span></pre>
<br />
<br />
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com1tag:blogger.com,1999:blog-7865516939602924439.post-64124469714473095832014-09-26T03:47:00.001-07:002014-09-26T04:22:24.258-07:00Marcar todos los emails / correos de gmail como leídos<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEfW7hsBtndc4SDj0tJGmF6Vl3hjANrqWPAaCAvKZ7ROnYd7fGyFunpLU9mmWDpjnz8hd9xeqYvq9hCWliEFC6bTT7qcDbRuBS4DEq3_B9i0Nxj8Ln645u73wHgTm6hF4NR5bmc7DhN2M/s1600/gmail-1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEfW7hsBtndc4SDj0tJGmF6Vl3hjANrqWPAaCAvKZ7ROnYd7fGyFunpLU9mmWDpjnz8hd9xeqYvq9hCWliEFC6bTT7qcDbRuBS4DEq3_B9i0Nxj8Ln645u73wHgTm6hF4NR5bmc7DhN2M/s1600/gmail-1.png" height="200" width="200" /></a></div>
<b><br /></b>
<b><br /></b>
<b>Buenos días,</b><br />
Hoy nos alejamos un poco de la temática de este blog pero voy a publicar un breve tutorial de como marcar todos tus emails de gmail como leídos.<br />
Muchos podrán decir, simplemente dale a marcar todo y marcar como leído, pero en el caso de tener más de 1000 emails sin leer eso no funciona, a no ser que quieras estar todo un día en ello.<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<b>1-</b> Clicamos en la rueda dentada y entramos en ajustes.-<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmSu1ajSl3_QMJ0iBYlCmpwgEF1H6LRL32toPVHzvjCEaSFdsn1UG6u3aDuNfTrCOSB2L4nEyNhrE1UmBxDJn0pEIr1OzilifIgtm_s3zoPXCT1v3YhcC9xCnTgeH9y3v9U8FqPWj1fCw/s1600/111.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmSu1ajSl3_QMJ0iBYlCmpwgEF1H6LRL32toPVHzvjCEaSFdsn1UG6u3aDuNfTrCOSB2L4nEyNhrE1UmBxDJn0pEIr1OzilifIgtm_s3zoPXCT1v3YhcC9xCnTgeH9y3v9U8FqPWj1fCw/s1600/111.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>2-</b> Clicamos en Filtros </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3O7vp4yJYoEpN1HB9HZ8O8AEWRcw8tenLxSWWowtNKTM0EzWLL4rcYZSUhDXkT65kzOWI7ydgP-Ogbt2Nmkc43hHiUfzLUXOA0Ny8aw2K9ga4R3yLMMyWyOg-wMbzmBGIGUgNu5-cQ0k/s1600/222.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3O7vp4yJYoEpN1HB9HZ8O8AEWRcw8tenLxSWWowtNKTM0EzWLL4rcYZSUhDXkT65kzOWI7ydgP-Ogbt2Nmkc43hHiUfzLUXOA0Ny8aw2K9ga4R3yLMMyWyOg-wMbzmBGIGUgNu5-cQ0k/s1600/222.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>3-</b> Creamos un filtro nuevo </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5xVWLjFGHm7t0CVaJX3NpGbgsOsX-oGfZgnQWkC8d3_sd0uGdqmGFbg6c47FBld3eN6-YOXmqMcl6EKa7jRvgLtyT0jnkzH33EMTqsGBL5G3p_9umHIsSg54gXopRJLswdqdvZM0Vprc/s1600/333.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5xVWLjFGHm7t0CVaJX3NpGbgsOsX-oGfZgnQWkC8d3_sd0uGdqmGFbg6c47FBld3eN6-YOXmqMcl6EKa7jRvgLtyT0jnkzH33EMTqsGBL5G3p_9umHIsSg54gXopRJLswdqdvZM0Vprc/s1600/333.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>4-</b> En el apartado DE ponemos un asterísco * </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjP0nC2zGO2198A9eiEN7WCQM9itPR3xZD6ytim7n_qgr0BT4KH8yo9SJrAdGtjovb1NBFYpNARFjRXfMgN_kwR5isvRS766XmQvl1dmwitNfTTuKZ2arOZg_cyRjH8SBCUgXcE-1CA4I/s1600/444.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjP0nC2zGO2198A9eiEN7WCQM9itPR3xZD6ytim7n_qgr0BT4KH8yo9SJrAdGtjovb1NBFYpNARFjRXfMgN_kwR5isvRS766XmQvl1dmwitNfTTuKZ2arOZg_cyRjH8SBCUgXcE-1CA4I/s1600/444.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>5-</b> Damos a Crear un filtro con estos criterios... </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqRMZDHZr04x1nsdjRkZUYsSd4Deiog7xckQ6AUIw4pYzHbxicZZVdBLqAY7oz5axve6M4CaPndsfKqBfLP26bDdJtH84mKpt46hWtHI-h3iUu0EtTKqEYv0yEIttXzLZElo-gKniAzFg/s1600/555.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqRMZDHZr04x1nsdjRkZUYsSd4Deiog7xckQ6AUIw4pYzHbxicZZVdBLqAY7oz5axve6M4CaPndsfKqBfLP26bDdJtH84mKpt46hWtHI-h3iUu0EtTKqEYv0yEIttXzLZElo-gKniAzFg/s1600/555.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>6-</b> Marcamos la opción Marcar como leídos y IMPORTANTE marcar la opción 'Aplicar el filtro también a las conversaciones...' y damos a crear filtro.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSfkkdJOLCG7zFUuNSpPiD-CB0b2ubSJvc2tecVzMRa382UxKwJpcUEeC1qDOKXHKHTTKIHbjDOJSchbT6fOQrdyFikfkdQB3MW4-g_jlJk5TKJjGT-PxTjI-UBXPpTSK7jid6mt-x1Ds/s1600/666.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSfkkdJOLCG7zFUuNSpPiD-CB0b2ubSJvc2tecVzMRa382UxKwJpcUEeC1qDOKXHKHTTKIHbjDOJSchbT6fOQrdyFikfkdQB3MW4-g_jlJk5TKJjGT-PxTjI-UBXPpTSK7jid6mt-x1Ds/s1600/666.PNG" height="41" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Volvemos a bandeja de entrada y actualizamos la web. Y listo! todos marcados como leídos!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: red;">Importante, una vez esten todos como leídos hay que volver a filtros y eliminar el filtro creado, sino nunca nos marcaría los emails como nuevos!</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: red;"><br /></span></div>
<div class="separator" style="clear: both; text-align: right;">
<i><span style="color: #cccccc;">No olviden escribir su comentario!</span></i></div>
<div class="separator" style="clear: both; text-align: right;">
<i><span style="color: #cccccc;">Gracias! :D</span></i></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com1tag:blogger.com,1999:blog-7865516939602924439.post-33247834613261931002014-08-10T05:33:00.000-07:002014-08-10T05:33:30.779-07:00Tutorial leer codigo qr con android decode<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB8Fx8D7vvAHS6rTB3aLotV_GOFVZJpm8fJ7JiSgHR0Am6hDvlREWS6uYq1Gq8MUZo-jrI9JdM6i-FrWKwlkzN2vaBOxKlRyboziYNfsoba7iFwffkzqaJGqY3gFyDYZLRvx_xXkDqs94/s1600/des88carga.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB8Fx8D7vvAHS6rTB3aLotV_GOFVZJpm8fJ7JiSgHR0Am6hDvlREWS6uYq1Gq8MUZo-jrI9JdM6i-FrWKwlkzN2vaBOxKlRyboziYNfsoba7iFwffkzqaJGqY3gFyDYZLRvx_xXkDqs94/s1600/des88carga.jpg" height="150" width="150" /></a></div>
Buenos dias!<br />
Hoy vamos a ver como hacer un simple decode de qr y código de barras en nuestra aplicación. Se trata de lanzar una clase llamada xzing que nos devolverá a nuestra aplicación lo que haya leído del código para poder utilizarlo a nuestro antojo.<br />
Simplemente se trata de añadir dos class a nuestro proyecto y llamarlos des de nuestro Activity. Vamos al grano y hacerlo de una manera sencilla.<br />
He subido la clase<b> IntentIntegrator</b> y <b>IntentResult </b>para que simplemente los descargeis y los pongáis dentro de vuestro proyecto.<br />
<br />
<a name='more'></a><br />
Primero descargamos las dos Class, descargar<b> <a href="http://adf.ly/r0k5S">IntentIntegrator</a></b> y<b> <a href="http://adf.ly/r0k77">IntentResult</a>.</b><br />
Una vez descargados los metemos dentro de la carpeta donde tengamos nuestro activity. Ha continuación pongo el cógigdo de nuestro activity el cual llamara a IntentIntegrator y IntentResult, y nos devolverá el valor del código QR, está totoalmente comentado:<br />
<b>MainActivity.class:</b><br />
<pre><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">tywors</span><span class="o">.</span><span class="na">lectorqr</span><span class="o">.</span><span class="na">lectorqr</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.content.Intent</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.support.v7.app.ActionBarActivity</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.Menu</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.MenuItem</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Toast</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyActivity</span> <span class="kd">extends</span> <span class="n">ActionBarActivity</span> <span class="o">{</span>
<span class="c1">//declaramos nuestro boton</span>
<span class="kd">private</span> <span class="n">Button</span> <span class="n">bt_scan</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_my</span><span class="o">);</span>
<span class="c1">//Boton en el XML</span>
<span class="n">bt_scan</span><span class="o">=(</span><span class="n">Button</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">bt_scan</span><span class="o">);</span>
<span class="c1">//Añadimos Listener, al clickar...</span>
<span class="n">bt_scan</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">View</span><span class="o">.</span><span class="na">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Lanzamos la activity del escaner</span>
<span class="n">IntentIntegrator</span><span class="o">.</span><span class="na">initiateScan</span><span class="o">(</span><span class="n">MyActivity</span><span class="o">.</span><span class="na">this</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="o">}</span>
<span class="c1">//Marcamos lo que queremos que haga una vez haya leido el código</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onActivityResult</span><span class="o">(</span><span class="kt">int</span> <span class="n">requestCode</span><span class="o">,</span> <span class="kt">int</span> <span class="n">resultCode</span><span class="o">,</span> <span class="n">Intent</span> <span class="n">data</span><span class="o">)</span> <span class="o">{</span>
<span class="k">switch</span><span class="o">(</span><span class="n">requestCode</span><span class="o">)</span> <span class="o">{</span>
<span class="k">case</span> <span class="n">IntentIntegrator</span><span class="o">.</span><span class="na">REQUEST_CODE</span><span class="o">:</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">resultCode</span> <span class="o">==</span> <span class="n">RESULT_CANCELED</span><span class="o">){</span>
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
<span class="c1">//Recogemos los datos que nos envio el código Qr/codigo de barras</span>
<span class="n">IntentResult</span> <span class="n">scanResult</span> <span class="o">=</span> <span class="n">IntentIntegrator</span><span class="o">.</span><span class="na">parseActivityResult</span><span class="o">(</span>
<span class="n">requestCode</span><span class="o">,</span> <span class="n">resultCode</span><span class="o">,</span> <span class="n">data</span><span class="o">);</span>
<span class="n">String</span> <span class="n">UPCScanned</span> <span class="o">=</span> <span class="n">scanResult</span><span class="o">.</span><span class="na">getContents</span><span class="o">();</span>
<span class="c1">//cOMO ES SOLO UN EJEMPLO LO SACAREMOS POR PANTALLA.</span>
<span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">getApplicationContext</span><span class="o">(),</span><span class="n">UPCScanned</span><span class="o">,</span><span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_LONG</span>
<span class="o">).</span><span class="na">show</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">break</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
<br />
Una vez esto tendremos que añadir un botón llamado bt_scan en nuestro .xml y listo!<br />
<br />
<div style="text-align: center;">
Proyecto para descargar para android studio!</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-size: large;"><a href="http://adf.ly/r0kNe">Descargar</a></span></b></div>
<div style="text-align: center;">
<b><span style="font-size: large;"><br /></span></b></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Espero vuestros comentarios!!!</span></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Muchas gracias!!!</span></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com9tag:blogger.com,1999:blog-7865516939602924439.post-47279765695734957192014-06-15T11:23:00.000-07:002014-06-15T11:23:08.954-07:00Menú lateral desplegable DrawerLayout android (Slider)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZEaeBXInvru13s9gUAgE-ki-9Tw0t0otqiUrROEcV8do5HmWdILjU9Byhq4TRcEsWGFdKH3heW7u3mKshwJjwYFRmcOxualy_S_uzuQ9FEGO51ynw8lzmSok1pXTxC1eoX95bsEP808/s1600/ffff.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZEaeBXInvru13s9gUAgE-ki-9Tw0t0otqiUrROEcV8do5HmWdILjU9Byhq4TRcEsWGFdKH3heW7u3mKshwJjwYFRmcOxualy_S_uzuQ9FEGO51ynw8lzmSok1pXTxC1eoX95bsEP808/s1600/ffff.PNG" height="179" width="200" /></a></div>
Buenos días!<br />
<br />
Hoy vamos a ver como crear un menú desplegable del tipo Google Maps o google plus +. Parece algo complicado pero he intentado hacerlo lo más simple posible! eso si, siempre se puede perfeccionar muchísimo subiendo así el nivel de dificultad.<br />
Para que funcione el nivel desplegable es necesario API 11 y si queremos desplearlo con un botón en vez de arrastrando con el dedo ará falta la versión API 14.<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
Como siempre he creado el código totalmente comentado. Para empezar mostraré el Xml, basado en android.support.v4.widget.DrawerLayout, simplemente he añadido un listview.<br />
<pre><span class="nt"><android.support.v4.widget.DrawerLayout</span>
<span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="na">android:id=</span><span class="s">"@+id/drawer_layout"</span>
<span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span><span class="nt">></span>
<span class="nt"><FrameLayout</span>
<span class="na">android:id=</span><span class="s">"@+id/content_frame"</span>
<span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span> <span class="nt">></span>
<span class="nt"></FrameLayout></span>
<span class="nt"><ListView</span> <span class="na">android:id=</span><span class="s">"@+id/left_drawer"</span>
<span class="na">android:layout_width=</span><span class="s">"240dp"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_gravity=</span><span class="s">"start"</span>
<span class="na">android:choiceMode=</span><span class="s">"singleChoice"</span>
<span class="na">android:divider=</span><span class="s">"@android:color/transparent"</span>
<span class="na">android:dividerHeight=</span><span class="s">"0dp"</span>
<span class="na">android:background=</span><span class="s">"#ff11"</span><span class="nt">/></span>
<span class="nt"></android.support.v4.widget.DrawerLayout></span>
</pre>
Una vez visto el Xml a continuación el Java:<br />
<pre><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">tywors</span><span class="o">.</span><span class="na">menulateral</span><span class="o">.</span><span class="na">app</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.content.res.Configuration</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.support.v4.app.ActionBarDrawerToggle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.support.v4.widget.DrawerLayout</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.support.v7.app.ActionBarActivity</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.MenuItem</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.AdapterView</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.ArrayAdapter</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.ListView</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Toast</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainActivity</span> <span class="kd">extends</span> <span class="n">ActionBarActivity</span> <span class="o">{</span>
<span class="c1">//El drawerLayout esn el que se desplega y</span>
<span class="c1">//contiene dentro el menú, normalmente un listview</span>
<span class="kd">private</span> <span class="n">DrawerLayout</span> <span class="n">mDrawerLayout</span><span class="o">;</span>
<span class="c1">//Declaremos el ListView</span>
<span class="kd">private</span> <span class="n">ListView</span> <span class="n">mDrawerList</span><span class="o">;</span>
<span class="c1">//ActionBarDrawerToggle es donde aparecerá el boton</span>
<span class="c1">//para desplegar el menú</span>
<span class="kd">private</span> <span class="n">ActionBarDrawerToggle</span> <span class="n">mDrawerToggle</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//relacionamos ocn el XML</span>
<span class="n">mDrawerLayout</span> <span class="o">=</span> <span class="o">(</span><span class="n">DrawerLayout</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">drawer_layout</span><span class="o">);</span>
<span class="n">mDrawerList</span> <span class="o">=</span> <span class="o">(</span><span class="n">ListView</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">left_drawer</span><span class="o">);</span>
<span class="c1">//Configuramos el Boton que desplegará el menú</span>
<span class="n">mDrawerToggle</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ActionBarDrawerToggle</span><span class="o">(</span>
<span class="k">this</span><span class="o">,</span> <span class="c1">//la actividad</span>
<span class="n">mDrawerLayout</span><span class="o">,</span> <span class="c1">//el drawerLayout que desplegará</span>
<span class="n">R</span><span class="o">.</span><span class="na">drawable</span><span class="o">.</span><span class="na">ic_launcher</span><span class="o">,</span> <span class="c1">//el icono que mostraremos</span>
<span class="n">R</span><span class="o">.</span><span class="na">string</span><span class="o">.</span><span class="na">app_name</span><span class="o">,</span> <span class="c1">//descripción al abrir</span>
<span class="n">R</span><span class="o">.</span><span class="na">string</span><span class="o">.</span><span class="na">app_name</span> <span class="c1">//descripción al cerrar</span>
<span class="o">)</span> <span class="o">{</span> <span class="o">};</span>
<span class="c1">//Creamos nuestro menú</span>
<span class="kd">final</span> <span class="n">String</span><span class="o">[]</span> <span class="n">opciones</span> <span class="o">=</span> <span class="o">{</span><span class="s">"Inicio"</span><span class="o">,</span> <span class="s">"Descargas"</span><span class="o">,</span> <span class="s">"Salir"</span><span class="o">};</span>
<span class="c1">//rellenamos la List view</span>
<span class="n">mDrawerList</span><span class="o">.</span><span class="na">setAdapter</span><span class="o">(</span><span class="k">new</span> <span class="n">ArrayAdapter</span><span class="o"><</span><span class="n">String</span><span class="o">>(</span><span class="k">this</span><span class="o">,</span>
<span class="n">android</span><span class="o">.</span><span class="na">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">simple_list_item_1</span><span class="o">,</span>
<span class="n">android</span><span class="o">.</span><span class="na">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">text1</span><span class="o">,</span> <span class="n">opciones</span><span class="o">));</span>
<span class="c1">//Añadimos la acción que haga en cada fila del</span>
<span class="c1">//list view. en este caso solo mostraremos un Toast con un mensaje</span>
<span class="n">mDrawerList</span><span class="o">.</span><span class="na">setOnItemClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">AdapterView</span><span class="o">.</span><span class="na">OnItemClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onItemClick</span><span class="o">(</span><span class="n">AdapterView</span><span class="o"><?></span> <span class="n">arg0</span><span class="o">,</span> <span class="n">View</span> <span class="n">arg1</span><span class="o">,</span>
<span class="kt">int</span> <span class="n">arg2</span><span class="o">,</span> <span class="kt">long</span> <span class="n">arg3</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">MainActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="s">"id: "</span> <span class="o">+</span> <span class="n">opciones</span><span class="o">[</span><span class="n">arg2</span><span class="o">],</span>
<span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_SHORT</span><span class="o">).</span><span class="na">show</span><span class="o">();</span>
<span class="c1">//Se cierra el menú</span>
<span class="n">mDrawerLayout</span><span class="o">.</span><span class="na">closeDrawers</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="c1">//Mostramos el botón en la barra de la aplicación</span>
<span class="n">getActionBar</span><span class="o">().</span><span class="na">setDisplayHomeAsUpEnabled</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="c1">//Activamso el click en el icono de la aplicación</span>
<span class="n">getActionBar</span><span class="o">().</span><span class="na">setHomeButtonEnabled</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="o">}</span>
<span class="c1">//Que el botón de desplegar siempre este sincronizado</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onPostCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">mDrawerToggle</span><span class="o">.</span><span class="na">syncState</span><span class="o">();</span>
<span class="o">}</span>
<span class="c1">//Igual con la configuración</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onConfigurationChanged</span><span class="o">(</span><span class="n">Configuration</span> <span class="n">newConfig</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onConfigurationChanged</span><span class="o">(</span><span class="n">newConfig</span><span class="o">);</span>
<span class="n">mDrawerToggle</span><span class="o">.</span><span class="na">onConfigurationChanged</span><span class="o">(</span><span class="n">newConfig</span><span class="o">);</span>
<span class="o">}</span>
<span class="c1">//Activamos el click paradesplegar</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">onOptionsItemSelected</span><span class="o">(</span><span class="n">MenuItem</span> <span class="n">item</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">mDrawerToggle</span><span class="o">.</span><span class="na">onOptionsItemSelected</span><span class="o">(</span><span class="n">item</span><span class="o">))</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="kd">super</span><span class="o">.</span><span class="na">onOptionsItemSelected</span><span class="o">(</span><span class="n">item</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Espero vuestros comentarios!!!</span></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Muchas Gracias!!!</span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com13tag:blogger.com,1999:blog-7865516939602924439.post-28284531646248067892014-06-11T08:59:00.000-07:002014-06-11T08:59:50.385-07:00Conexión segura entre cliente / servidor comprobar datos hash<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS1V3SxL06TZ5ut3Ef8kh-5vIp5T8GgG31OQMDlPUstfAKpCuQrQxT1Irj98zVQ_njVcJb5ieXNsc9_uSfYtMkLXbdAaPPmmIxh39UV2ysWi8bl1aYYpHBnqw_FvLd2n8sHDCEnwp7QyQ/s1600/detail.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS1V3SxL06TZ5ut3Ef8kh-5vIp5T8GgG31OQMDlPUstfAKpCuQrQxT1Irj98zVQ_njVcJb5ieXNsc9_uSfYtMkLXbdAaPPmmIxh39UV2ysWi8bl1aYYpHBnqw_FvLd2n8sHDCEnwp7QyQ/s1600/detail.jpg" height="145" width="200" /></a></div>
Buenas tardes!<br />
Hoy vamos a aprender como poder comprobar que los datos que salen de una aplicación o web no se modifican por el camino para intentar engañar al servidor. Es decir, aremos una comprobación para ver si el dato que salió de la aplicación es el mismo que llegó al servidor.<br />
<br />
Ejemplo: Imaginaros un man-in-middle, tenemos una aplicación con un ranking y un usuario mal intencionado intercepta su puntuación con algún programa proxy y la modifica por una superior. Llegaría al servidor y grabaría la puntuación aunque no fuera la real. Pues así lo vamos a evitar.<br />
<br />
<a name='more'></a><br />
Hay formas de evitarlo más profesionales como por ejemplo encriptando la conexión con https o temas similares, pero si no nos importa que se vean los datos que enviamos y simplemente queremos asegurarnos que no los editan de camino al servidor voy a explicar como hacerlo!<br />
<br />
El ejemplo que voy a hacer es entre Php (un formulario o algo) y el servidor. En este caso utilizaré parametros GET para hacer más sencillo el tutorial.<br />
<br />
NOTA: Se podría adaptar todo esto perfectamente a android solo buscando como pasar el valor a md5. Y viendo el tutorial de esta misma web 'enviar datos al servidor des de android'.<br />
<br />
<pre><span class="cp"><?php</span>
<span class="c1">////////////////////////////////////////////</span>
<span class="c1">////////Cliente ////////////////////////////</span>
<span class="c1">////////////////////////////////////////////</span>
<span class="c1">//Nos inventamos una clave privada</span>
<span class="nv">$clave</span> <span class="o">=</span> <span class="s1">'23a89u'</span><span class="p">;</span>
<span class="c1">//el dato que enviamos</span>
<span class="c1">//y comprobaremos en el server</span>
<span class="nv">$dato</span> <span class="o">=</span> <span class="s1">'354'</span><span class="p">;</span>
<span class="c1">//Lo encriptamos todo en md5</span>
<span class="nv">$hash</span> <span class="o">=</span> <span class="nb">md5</span><span class="p">(</span><span class="nv">$clave</span><span class="o">.</span><span class="nv">$dato</span><span class="p">);</span>
<span class="c1">////La dirección quedaría algo así</span>
<span class="c1">//alserver.com/envio.php?dato=345&hash=7474yr756yrr9a</span>
<span class="c1">/////////////////////////////////////////////</span>
<span class="c1">/////////Servidor ///////////////////////////</span>
<span class="c1">/////////////////////////////////////////////</span>
<span class="c1">//Hay que utilizar la misma clave en cliente/servidor</span>
<span class="nv">$clave</span> <span class="o">=</span> <span class="s1">'23a89u'</span><span class="p">;</span>
<span class="c1">//encriptamos la clave y el dato recibido y debe ser igual</span>
<span class="c1">//al hash que se creó en el cliente, si no es así</span>
<span class="c1">//significa que han modificado el dato por el camino</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">md5</span><span class="p">(</span><span class="nv">$clave</span><span class="o">.</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">'dato'</span><span class="p">])</span> <span class="o">==</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">'hash'</span><span class="p">])</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s1">'Dato valido recivido: '</span><span class="o">.</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">'dato'</span><span class="p">];</span>
<span class="p">}</span><span class="k">else</span><span class="p">{</span>
<span class="k">echo</span> <span class="s1">'error, se intentado hackear.'</span><span class="p">;</span>
<span class="p">}</span>
<span class="cp">?></span><span class="x"></span>
</pre>
<br />
El método es muy simple y muy efectivo! espero que os haya gustado.<br />
<br />
<div style="text-align: right;">
<i><span style="color: #999999; font-size: x-small;">No olvides comentar!!!</span></i></div>
<div style="text-align: right;">
<i><span style="color: #999999; font-size: x-small;">Muchas gracias!!!</span></i></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-43288517904242261162014-06-05T08:54:00.000-07:002014-06-05T08:54:31.097-07:00Mostrar la cámara en la aplicación android, Surfaceview<div class="separator" style="clear: both; text-align: center;">
<a href="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRs8o6f5w74xnufOlRwkwSZfLp27WG9bR6kQqpMnwVP70S6T-9C0w" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRs8o6f5w74xnufOlRwkwSZfLp27WG9bR6kQqpMnwVP70S6T-9C0w" width="170" /></a></div>
Buenos días a todos! Hoy os traigo un tutorial muy sencillo y muy práctico. Es para que podáis mostrar la preview de la cámara android en vuestra aplicación.<br />
El código que he escrito es muy sencillo para que todos lo podáis entender bien, no obstante podría ser mucho más extendido como por ejemplo poner autofocus o modificar el tamaño del SrufaceView según el hardware de la cámara.<br />
Para empezar solo decir que el SurfaceView se comporta igual que un layout solo que es bastante más complejo. Empecemos:<br />
Como siempre os traigo el código totalmente comentado para que sea mucho más simple.<br />
<br />
<a name='more'></a><br />
Primero creamos el layout que consta del SurfaceView y de un botón que ará la función de encender o apagar la cámara:<br />
<br />
<pre><span class="nt"><RelativeLayout</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="na">xmlns:tools=</span><span class="s">"http://schemas.android.com/tools"</span>
<span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span>
<span class="na">tools:context=</span><span class="s">".MainActivity"</span> <span class="nt">></span>
<span class="nt"><SurfaceView</span>
<span class="na">android:id=</span><span class="s">"@+id/view_camera"</span>
<span class="na">android:layout_width=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_height=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_alignParentBottom=</span><span class="s">"true"</span>
<span class="na">android:layout_alignParentLeft=</span><span class="s">"true"</span>
<span class="na">android:layout_alignParentRight=</span><span class="s">"true"</span>
<span class="na">android:layout_alignParentTop=</span><span class="s">"true"</span> <span class="nt">/></span>
<span class="nt"><Button</span>
<span class="na">android:id=</span><span class="s">"@+id/boton"</span>
<span class="na">android:layout_width=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_height=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_alignParentBottom=</span><span class="s">"true"</span>
<span class="na">android:layout_alignParentRight=</span><span class="s">"true"</span>
<span class="na">android:text=</span><span class="s">"start"</span> <span class="nt">/></span>
<span class="nt"></RelativeLayout></span>
</pre>
Ahora veremos el java, para entenderlo totalmente ará falta ver más de un tutorial de los que publiqué anteriormente.<br />
<pre><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">tywors</span><span class="o">.</span><span class="na">camara</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.hardware.Camera</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.SurfaceHolder</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.SurfaceView</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View.OnClickListener</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
<span class="c1">//Boton en encender/apagar</span>
<span class="kd">private</span> <span class="n">Button</span> <span class="n">boton</span><span class="o">;</span>
<span class="c1">//Layout donde se verá la imagen de la camara</span>
<span class="kd">private</span> <span class="n">SurfaceView</span> <span class="n">surfaceView</span><span class="o">;</span>
<span class="c1">//Es el modulo que comunica la camara con el layout</span>
<span class="kd">private</span> <span class="n">SurfaceHolder</span> <span class="n">surfaceHolder</span><span class="o">;</span>
<span class="c1">//Camara librería de Hardware</span>
<span class="kd">private</span> <span class="n">Camera</span> <span class="n">camara</span><span class="o">;</span>
<span class="c1">//Simplemente para controlar si esta on/off</span>
<span class="kd">private</span> <span class="kt">boolean</span> <span class="n">encendida</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//relacionamos con el xml</span>
<span class="n">boton</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span><span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">boton</span><span class="o">);</span>
<span class="n">surfaceView</span> <span class="o">=</span> <span class="o">(</span><span class="n">SurfaceView</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">view_camera</span><span class="o">);</span>
<span class="c1">//Le indicamos cual será el destino (surfaceview)</span>
<span class="n">surfaceHolder</span> <span class="o">=</span> <span class="n">surfaceView</span><span class="o">.</span><span class="na">getHolder</span><span class="o">();</span>
<span class="c1">//la pp se iniciara en off</span>
<span class="n">encendida</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="c1">//al presionar el boton</span>
<span class="n">boton</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="c1">//Lamamos a la funcion de la camara que hemos creado</span>
<span class="n">startCamara</span><span class="o">();</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// TODO Auto-generated catch block</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kt">void</span> <span class="nf">startCamara</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">IOException</span><span class="o">{</span>
<span class="c1">//Si la camara esta apagada</span>
<span class="k">if</span><span class="o">(!</span><span class="n">encendida</span><span class="o">){</span>
<span class="c1">//pillamos el control del hardware de la camara</span>
<span class="n">camara</span> <span class="o">=</span> <span class="n">Camera</span><span class="o">.</span><span class="na">open</span><span class="o">();</span>
<span class="c1">//Enlazamos el hardware con el surfaceHolder</span>
<span class="n">camara</span><span class="o">.</span><span class="na">setPreviewDisplay</span><span class="o">(</span><span class="n">surfaceHolder</span><span class="o">);</span>
<span class="c1">//Encendemos todo</span>
<span class="n">camara</span><span class="o">.</span><span class="na">startPreview</span><span class="o">();</span>
<span class="n">encendida</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span><span class="k">else</span><span class="o">{</span>
<span class="c1">//paramos la camara</span>
<span class="n">camara</span><span class="o">.</span><span class="na">stopPreview</span><span class="o">();</span>
<span class="c1">//liberamos el hardware</span>
<span class="n">camara</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
<span class="c1">//Sabemos que ya esta en off</span>
<span class="n">encendida</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
<br />
sobre todo no hay que olvidarse de poner el permiso para uilizar la cámara del teléfono, añadiremos esta línea en el manifes.xml encima del tag aplicacion:<br />
<pre><span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.CAMERA"</span> <span class="nt">/></span>
<span class="nt"><uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.camera"</span> <span class="nt">/></span>
</pre>
<pre><span class="nt">
</span></pre>
Espero que os sirva de ayuda y también añado el projecto para eclipse por si queréis descargarlo:<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/pJOmi">http://adf.ly/pJOmi</a></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: right;">
<i><span style="color: #999999; font-size: x-small;">Muchas grácias a todos!!!</span></i></div>
<div style="text-align: right;">
<i><span style="color: #999999; font-size: x-small;">Espero vuestros comentarios!!!</span></i></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com5tag:blogger.com,1999:blog-7865516939602924439.post-86549281801410434252014-06-03T09:23:00.001-07:002014-06-03T09:23:47.082-07:00Código QR creado a mano, para LoL Videos!<iframe allowfullscreen="" frameborder="0" height="270" src="//www.youtube.com/embed/YIL1DRvHwBY" width="480"></iframe>Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0tag:blogger.com,1999:blog-7865516939602924439.post-46497158329237722452013-12-04T08:40:00.000-08:002013-12-04T08:40:35.907-08:00Tutorial Android: Utilizar el Intent de cámara para guardar y mostrar imagen en nuestra aplicación<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNbF3w90ikLZIJmSBuZG01LuQv_adf5jEztiuCUFeTBBF1IHpAklIR0dVL-cX4c0DPnXo5EbThZfCKSRm3UogvIQSvxUQ-0SBP0XXI16vwOL8oDqUJCRZ8uuIvMrdZS-14Ws7nC6Ei6Q/s1600/camera_android.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNbF3w90ikLZIJmSBuZG01LuQv_adf5jEztiuCUFeTBBF1IHpAklIR0dVL-cX4c0DPnXo5EbThZfCKSRm3UogvIQSvxUQ-0SBP0XXI16vwOL8oDqUJCRZ8uuIvMrdZS-14Ws7nC6Ei6Q/s200/camera_android.jpg" width="200" /></a></div>
Buenas tardes!<br />
Hoy he hecho un tutorial para principiantes de cómo utilizar la cámara en nuestra aplicación android. La finalidad del tutorial es hacer la foto guardarla en la memoria del teléfono y a continuación mostrarla en la aplicación utilizando un ImageView.<br />
<br />
Para empezar tendremos nuestro .xml con un botón que será el encargado de acceder a la cámara y un ImageView que será el encargado de mostrar la imagen una vez grabada. Este mismo proceso se puede hacer de muchas maneras, yo e intentado coger la más simple para que se entienda bien y se pueda practicar con ella.<br />
<br />
<a name='more'></a><br />
Para empezar muestro como debe quedar el .xml:<br />
<pre><span class="nt"><RelativeLayout</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="na">xmlns:tools=</span><span class="s">"http://schemas.android.com/tools"</span>
<span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span>
<span class="na">tools:context=</span><span class="s">".MainActivity"</span> <span class="nt">></span>
<span class="nt"><Button</span>
<span class="na">android:id=</span><span class="s">"@+id/button1"</span>
<span class="na">android:layout_width=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_height=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_alignParentTop=</span><span class="s">"true"</span>
<span class="na">android:layout_centerHorizontal=</span><span class="s">"true"</span>
<span class="na">android:layout_marginTop=</span><span class="s">"26dp"</span>
<span class="na">android:text=</span><span class="s">"Hacer Foto"</span> <span class="nt">/></span>
<span class="nt"><ImageView</span>
<span class="na">android:id=</span><span class="s">"@+id/imageView1"</span>
<span class="na">android:layout_width=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_height=</span><span class="s">"wrap_content"</span>
<span class="na">android:layout_below=</span><span class="s">"@+id/button1"</span>
<span class="na">android:layout_centerHorizontal=</span><span class="s">"true"</span>
<span class="na">android:layout_marginTop=</span><span class="s">"20dp"</span><span class="nt">/></span>
<span class="nt"></RelativeLayout></span>
</pre>
con eso ya tendremos nuestra pantalla, ahora pasemos a ver nuestro .java totalmente comentado de una manera muy sencilla.<br />
<pre><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">tywors</span><span class="o">.</span><span class="na">photocolor</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.content.Intent</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.graphics.Bitmap</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.graphics.BitmapFactory</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.net.Uri</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Environment</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.provider.MediaStore</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.ImageView</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
<span class="c1">//Necesitamos un Boton y un imageView</span>
<span class="kd">private</span> <span class="n">Button</span> <span class="n">bt_hacerfoto</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">ImageView</span> <span class="n">img</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//Relacionamos con el XML</span>
<span class="n">img</span> <span class="o">=</span> <span class="o">(</span><span class="n">ImageView</span><span class="o">)</span><span class="k">this</span><span class="o">.</span><span class="na">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">imageView1</span><span class="o">);</span>
<span class="n">bt_hacerfoto</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span> <span class="k">this</span><span class="o">.</span><span class="na">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">button1</span><span class="o">);</span>
<span class="c1">//Añadimos el Listener Boton</span>
<span class="n">bt_hacerfoto</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">View</span><span class="o">.</span><span class="na">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Creamos el Intent para llamar a la Camara</span>
<span class="n">Intent</span> <span class="n">cameraIntent</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Intent</span><span class="o">(</span>
<span class="n">android</span><span class="o">.</span><span class="na">provider</span><span class="o">.</span><span class="na">MediaStore</span><span class="o">.</span><span class="na">ACTION_IMAGE_CAPTURE</span><span class="o">);</span>
<span class="c1">//Creamos una carpeta en la memeria del terminal</span>
<span class="n">File</span> <span class="n">imagesFolder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span>
<span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStorageDirectory</span><span class="o">(),</span> <span class="s">"Tutorialeshtml5"</span><span class="o">);</span>
<span class="n">imagesFolder</span><span class="o">.</span><span class="na">mkdirs</span><span class="o">();</span>
<span class="c1">//añadimos el nombre de la imagen</span>
<span class="n">File</span> <span class="n">image</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">imagesFolder</span><span class="o">,</span> <span class="s">"foto.jpg"</span><span class="o">);</span>
<span class="n">Uri</span> <span class="n">uriSavedImage</span> <span class="o">=</span> <span class="n">Uri</span><span class="o">.</span><span class="na">fromFile</span><span class="o">(</span><span class="n">image</span><span class="o">);</span>
<span class="c1">//Le decimos al Intent que queremos grabar la imagen</span>
<span class="n">cameraIntent</span><span class="o">.</span><span class="na">putExtra</span><span class="o">(</span><span class="n">MediaStore</span><span class="o">.</span><span class="na">EXTRA_OUTPUT</span><span class="o">,</span> <span class="n">uriSavedImage</span><span class="o">);</span>
<span class="c1">//Lanzamos la aplicacion de la camara con retorno (forResult)</span>
<span class="n">startActivityForResult</span><span class="o">(</span><span class="n">cameraIntent</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="o">}});</span>
<span class="o">}</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onActivityResult</span><span class="o">(</span><span class="kt">int</span> <span class="n">requestCode</span><span class="o">,</span> <span class="kt">int</span> <span class="n">resultCode</span><span class="o">,</span> <span class="n">Intent</span> <span class="n">data</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Comprovamos que la foto se a realizado</span>
<span class="k">if</span> <span class="o">(</span><span class="n">requestCode</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&&</span> <span class="n">resultCode</span> <span class="o">==</span> <span class="n">RESULT_OK</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Creamos un bitmap con la imagen recientemente </span>
<span class="c1">//almacenada en la memoria</span>
<span class="n">Bitmap</span> <span class="n">bMap</span> <span class="o">=</span> <span class="n">BitmapFactory</span><span class="o">.</span><span class="na">decodeFile</span><span class="o">(</span>
<span class="n">Environment</span><span class="o">.</span><span class="na">getExternalStorageDirectory</span><span class="o">()+</span>
<span class="s">"/Tutorialeshtml5/"</span><span class="o">+</span><span class="s">"foto.jpg"</span><span class="o">);</span>
<span class="c1">//Añadimos el bitmap al imageView para </span>
<span class="c1">//mostrarlo por pantalla</span>
<span class="n">img</span><span class="o">.</span><span class="na">setImageBitmap</span><span class="o">(</span><span class="n">bMap</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
Para finalizar no hay que olvidarse de añadir este permiso de escritura en la memoria en nuestro manifest.xml:<br />
<pre><span class="o"><</span><span class="n">uses</span><span class="o">-</span><span class="n">permission</span> <span class="nl">android:</span><span class="n">name</span><span class="o">=</span><span class="s">"android.permission.WRITE_EXTERNAL_STORAGE"</span> <span class="o">/></span>
</pre>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="color: red;">Adjunto el proyecto para descargar:</span></b></div>
<div style="text-align: center;">
<b><span style="color: red;"><a href="http://adf.ly/4920962/camera">http://adf.ly/4920962/camera</a></span></b></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: right;">
<span style="color: #999999;"><i>Muchas gracias a todos!</i></span></div>
<div style="text-align: right;">
<span style="color: #999999;"><i>Espero vuestras dudas y comentarios!</i></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com31tag:blogger.com,1999:blog-7865516939602924439.post-13610888988703131962013-11-25T10:02:00.000-08:002013-11-25T10:02:39.450-08:00Tutorial crear formulario HTML, guardar y mostrar datos/consultas SQL con PHP<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0zBDkYB7nTnQtK3IchOy0MdKs29mG82NP8O7adRN4G-jUBXEHMqSs3cJGvl1L0earBe4n1T0UKXX4uZ7Ssz2IiwSkC-zRDeAakxVT2k5rYyCI1GUvdWzRbuPl4GAoMuZuos8H_IAIF_E/s1600/bbbbbbbbbbbb.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0zBDkYB7nTnQtK3IchOy0MdKs29mG82NP8O7adRN4G-jUBXEHMqSs3cJGvl1L0earBe4n1T0UKXX4uZ7Ssz2IiwSkC-zRDeAakxVT2k5rYyCI1GUvdWzRbuPl4GAoMuZuos8H_IAIF_E/s200/bbbbbbbbbbbb.jpg" width="200" /></a></div>
<b>Buenas tardes!</b><br />
Hoy os traigo un tutorial muy útil y muy pedido por los usuarios. Se trata de como<i> crear un formulario en HTML</i> y al darle al botón de enviar se guarde<i> en una base de datos SQL utilizando la programación de PHP</i>.<br />
<br />
Este tutorial se puede dividir en varios archivos/páginas pero al tratarse de un ejemplo de un tutorial lo he creado todo en el mismo archivo index.php. El tutorial es bastante simple pero servirá para abrir los ojos aquellos que estén empezando en este mundo de las paginas webs y de las bases de datos.<br />
<br />
<a name='more'></a><br />
No he añadido como se crean las tablas en SQL porque creo que ya esta bastante extenso. Pero si lo necesitáis pedirlo que lo añadiré.<br />
Primero os mostraré el código completamente creado y comentado por mí y a continuación abrán dos links, uno para ver el ejemplo en vivo del funcionamiento del formulario y ver como muestra las consultas y el otro link será de descarga del archivo.<br />
<br />
Antes de empezar decir que el archivo index.php al ser .php solo funciona en la parte del servidor, es decir, que no se podrá ejecutar en el Pc a no ser que tengas instalado un servicio web. Yo recomiendo este hosting gratuito y simple para hacer las pruebas: <a href="http://adf.ly/4920962/hostingho">http://adf.ly/4920962/hostingho</a><br />
<br />
Empecemos por el código:<br />
<pre><span class="cp"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></span>
<span class="nt"><html</span> <span class="na">xmlns=</span><span class="s">"http://www.w3.org/1999/xhtml"</span><span class="nt">></span>
<span class="nt"></head></span>
<span class="cp"><?</span>
<span class="c1">//Creamos la conexión a nuestra base de datos</span>
<span class="c1">//Hay que sustituir el usuario contraseña</span>
<span class="nv">$conexion</span> <span class="o">=</span> <span class="nb">mysql_connect</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="s2">"(usuario)"</span><span class="p">,</span> <span class="s2">"(password)"</span><span class="p">);</span>
<span class="c1">//Aquí hay que sustituir la el nombre de la base de datos</span>
<span class="nb">mysql_select_db</span><span class="p">(</span><span class="s2">"(base de datos)"</span><span class="p">,</span> <span class="nv">$conexion</span><span class="p">);</span>
<span class="cp">?></span>
<span class="nt"><body></span>
<span class="nt"><p></span>Formulario para insertar datos en SQL<span class="nt"></p></span>
<span class="c"><!-- Ahora creamos el formulario que enviará los datos --></span>
<span class="c"><!-- En el apartado 'action' hay que poner a que página</span>
<span class="c">enviaremos los datos, en este caso y como ejemplo lo enviaremos</span>
<span class="c">a index.php, es decir, a esta misma web --></span>
<span class="nt"><form</span> <span class="na">id=</span><span class="s">"form1"</span> <span class="na">name=</span><span class="s">"form1"</span> <span class="na">method=</span><span class="s">"post"</span> <span class="na">action=</span><span class="s">"index.php"</span><span class="nt">></span>
<span class="nt"><table</span> <span class="na">width=</span><span class="s">"200"</span> <span class="na">border=</span><span class="s">"0"</span><span class="nt">></span>
<span class="nt"><tr></span>
<span class="nt"><td</span> <span class="na">width=</span><span class="s">"61"</span><span class="nt">></span>Nombre:<span class="nt"></td></span>
<span class="nt"><td</span> <span class="na">width=</span><span class="s">"123"</span><span class="nt">></span>
<span class="nt"><label</span> <span class="na">for=</span><span class="s">"nombre"</span><span class="nt">></label></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"nombre"</span> <span class="na">id=</span><span class="s">"nombre"</span> <span class="nt">/></span>
<span class="nt"></td></span>
<span class="nt"></tr></span>
<span class="nt"><tr></span>
<span class="nt"><td></span>Nick:<span class="nt"></td></span>
<span class="nt"><td><label</span> <span class="na">for=</span><span class="s">"nick"</span><span class="nt">></label></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"nick"</span> <span class="na">id=</span><span class="s">"nick"</span> <span class="nt">/></td></span>
<span class="nt"></tr></span>
<span class="nt"><tr></span>
<span class="nt"><td></span><span class="ni">&nbsp;</span><span class="nt"></td></span>
<span class="nt"><td</span> <span class="na">align=</span><span class="s">"right"</span><span class="nt">></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">name=</span><span class="s">"enviar"</span> <span class="na">id=</span><span class="s">"enviar"</span> <span class="na">value=</span><span class="s">"Enviar"</span> <span class="nt">/></span>
<span class="nt"></td></span>
<span class="nt"></tr></span>
<span class="nt"></table></span>
<span class="nt"></form></span>
<span class="cp"><?</span>
<span class="c1">//Comprovamos si se han recivido datos del formulario</span>
<span class="c1">//Como vemos se lo utilizando el campo nombre</span>
<span class="k">if</span><span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'nombre'</span><span class="p">])){</span>
<span class="c1">//Insertamos los datos en SQL en mi caso la tabla se </span>
<span class="c1">//llama personas y consta de dos celdas </span>
<span class="c1">//la de nombres y la de nick</span>
<span class="nv">$insertar</span> <span class="o">=</span> <span class="s2">"INSERT INTO personas (nombre, nick) </span>
<span class="s2"> VALUES ('"</span><span class="o">.</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'nombre'</span><span class="p">]</span><span class="o">.</span><span class="s2">"', '"</span><span class="o">.</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'nick'</span><span class="p">]</span><span class="o">.</span><span class="s2">"')"</span><span class="p">;</span>
<span class="nb">mysql_query</span><span class="p">(</span><span class="nv">$insertar</span><span class="p">,</span><span class="nv">$conexion</span><span class="p">);</span>
<span class="p">}</span>
<span class="cp">?></span>
Mostramos los resultados que hay en SQL <span class="nt"><br><br></span>
<span class="cp"><?</span>
<span class="c1">//Creamos el Select para decir que campos queremos mostrar</span>
<span class="c1">//en este caso de ejemplo mostraremos los dos que hay</span>
<span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"SELECT nombre,nick FROM personas"</span><span class="p">;</span>
<span class="nv">$retval</span> <span class="o">=</span> <span class="nb">mysql_query</span><span class="p">(</span> <span class="nv">$sql</span><span class="p">,</span> <span class="nv">$conexion</span><span class="p">);</span>
<span class="c1">//Creamos un Bucle que recorra toda la tabla de SQL</span>
<span class="k">while</span><span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nb">mysql_fetch_assoc</span><span class="p">(</span><span class="nv">$retval</span><span class="p">)){</span>
<span class="k">echo</span> <span class="s2">"Nombre: "</span><span class="o">.</span><span class="nv">$row</span><span class="p">[</span><span class="s1">'nombre'</span><span class="p">]</span><span class="o">.</span><span class="s2">", Nick: "</span><span class="o">.</span><span class="nv">$row</span><span class="p">[</span><span class="s1">'nick'</span><span class="p">]</span><span class="o">.</span><span class="s2">"<br>"</span><span class="p">;</span>
<span class="p">}</span>
<span class="cp">?></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</pre>
<br />
<div style="text-align: center;">
<span style="color: red;"><b>Para ver el ejemplo en vivo:</b></span></div>
<div style="text-align: center;">
<span style="color: red;"><b><a href="http://adf.ly/4920962/formulario-sql-ejemplo">http://adf.ly/4920962/formulario-sql-ejemplo</a></b></span></div>
<div style="text-align: center;">
<span style="color: red;"><b><br /></b></span></div>
<div style="text-align: center;">
<span style="color: red;"><b>Para descargar el proyecto:</b></span></div>
<div style="text-align: center;">
<span style="color: red;"><b><a href="http://adf.ly/4920962/formulario-sql">http://adf.ly/4920962/formulario-sql</a></b></span></div>
<div style="text-align: center;">
<span style="color: red; font-size: large;"><b><br /></b></span></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Muchas gracias! espero comebntarios!</i></span></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Recuerda el +1 nos ayuda a todos!</i></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com29tag:blogger.com,1999:blog-7865516939602924439.post-79739246142646698842013-10-17T03:52:00.002-07:002013-10-17T03:52:43.564-07:00Crear y escribir archivo de texto .txt con PHP<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheAPnLwdlEs-3_rjD9ZwCl7EpKnrcCeS4F3booNXAJbuLj3r57whZtB5nub70eL1nRWpcGyFM58OxP2skHNrE-GiG1uESsOqoaIZ4ikSCcHTQF-O8q3WjlOPUeOFJwylFrnn1_tHSO_yA/s1600/php.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheAPnLwdlEs-3_rjD9ZwCl7EpKnrcCeS4F3booNXAJbuLj3r57whZtB5nub70eL1nRWpcGyFM58OxP2skHNrE-GiG1uESsOqoaIZ4ikSCcHTQF-O8q3WjlOPUeOFJwylFrnn1_tHSO_yA/s200/php.jpg" width="200" /></a></div>
Buenos días!<br />
<br />
Hoy traigo un tutorial bien sencillo pero muy útil a la vez. Se trata de crear un archivo (en este ejemplo .txt) en la ruta que especifiquemos a través de un .php.<br />
<br />
Podemos añadir tantas líneas como queramos y es útil para almacenar información de las variables recibidas en caso de Debug o simplemente para guardar información escrita por el usuario.<br />
<br />
<a name='more'></a><br />
<br />
A continuación muestro el código para crear nuestro archivo totalmente comentado. Para acceder al archivo tendrá que ser por Ftp o algún sistema de ficheros.<br />
<pre><span class="cp"><?php</span>
<span class="c1">//Creamos el archivo datos.txt</span>
<span class="c1">//ponemos tipo 'a' para añadir lineas sin borrar</span>
<span class="nv">$file</span><span class="o">=</span><span class="nb">fopen</span><span class="p">(</span><span class="s2">"datos.txt"</span><span class="p">,</span><span class="s2">"a"</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s2">"Problemas"</span><span class="p">);</span>
<span class="c1">//vamos añadiendo el contenido</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"primera linea"</span><span class="p">);</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">);</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"segunda linea"</span><span class="p">);</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">);</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"tercera linea"</span><span class="p">);</span>
<span class="nb">fclose</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
<span class="cp">?></span><span class="x"></span>
</pre>
Y este será el resultado:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyyYLB8pDrHlsvO77ZKle4_I_ItxSIOi16wSvKxfWI06V66vqqcurjenduH_06FIMNwzn4elBzr5NrsCyaBQ9YNv6TEuGwDyy0HcEH6aZVCApJ9dzdQtR-pw7UQAr_9hoN25yWguBjQGk/s1600/Captura1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyyYLB8pDrHlsvO77ZKle4_I_ItxSIOi16wSvKxfWI06V66vqqcurjenduH_06FIMNwzn4elBzr5NrsCyaBQ9YNv6TEuGwDyy0HcEH6aZVCApJ9dzdQtR-pw7UQAr_9hoN25yWguBjQGk/s1600/Captura1.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
También podemos jugar un poco con el codigo:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<pre><span class="cp"><?php</span>
<span class="c1">//Creamos el archivo datos.txt</span>
<span class="c1">//ponemos tipo 'a' para añadir lineas sin borrar</span>
<span class="nv">$file</span><span class="o">=</span><span class="nb">fopen</span><span class="p">(</span><span class="s2">"datos2.txt"</span><span class="p">,</span><span class="s2">"a"</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s2">"Problemas"</span><span class="p">);</span>
<span class="c1">//vamos añadiendo el lineas con bucle</span>
<span class="k">for</span><span class="p">(</span><span class="nv">$a</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nv">$a</span><span class="o"><</span><span class="mi">20</span><span class="p">;</span><span class="nv">$a</span><span class="o">++</span><span class="p">){</span>
<span class="c1">//bucle para caracteres por linea</span>
<span class="k">for</span><span class="p">(</span><span class="nv">$b</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nv">$b</span><span class="o"><</span><span class="nv">$a</span><span class="p">;</span><span class="nv">$b</span><span class="o">++</span><span class="p">){</span>
<span class="nv">$tx</span> <span class="o">=</span> <span class="nv">$tx</span><span class="o">.</span><span class="s2">"-"</span><span class="p">;</span>
<span class="p">}</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="nv">$tx</span><span class="p">);</span>
<span class="nb">fputs</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="nb">fclose</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
<span class="cp">?></span><span class="x"></span>
</pre>
Y el resultado de jugar es:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-yPuwwDnvnkSE5NIIoEOSCCpZte6f9yL1rvEDBQPAO6WEzQ462_tMQ2oFnb_c7bwuX_aqxwF0AW_s5Rf8fQHilFZMmgXexKBv1bJSkyn94rth3-wi6WcqTqgBbwtqcrgH7LSvJoSyldU/s1600/Captura2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-yPuwwDnvnkSE5NIIoEOSCCpZte6f9yL1rvEDBQPAO6WEzQ462_tMQ2oFnb_c7bwuX_aqxwF0AW_s5Rf8fQHilFZMmgXexKBv1bJSkyn94rth3-wi6WcqTqgBbwtqcrgH7LSvJoSyldU/s640/Captura2.PNG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: right;">
<span style="color: #999999;"><i>Muchas gracias a todos! Espero vuestro comentarios!!!</i></span></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com22tag:blogger.com,1999:blog-7865516939602924439.post-73266730395030038492013-10-13T06:56:00.000-07:002013-10-22T09:22:10.512-07:00Tutorial simple de GCM a través de PHP ( Google Cloud Messaging ) nueva interface<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc4tZkjgtIioT7Dk0i_FUNj1xaXrYxR-9AZogG1KZLt65OiI58o_hHx1XivClFbATZO8Ns_TTfwXqRRYUX6y3UlKq6pTq4vnuFFSXkiJYncRRdeGyN3sZV9Lyb2FtjwO7bEEBZdaZ5C2A/s1600/gcm-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc4tZkjgtIioT7Dk0i_FUNj1xaXrYxR-9AZogG1KZLt65OiI58o_hHx1XivClFbATZO8Ns_TTfwXqRRYUX6y3UlKq6pTq4vnuFFSXkiJYncRRdeGyN3sZV9Lyb2FtjwO7bEEBZdaZ5C2A/s200/gcm-logo.png" width="200" /></a></div>
<b>Buenos días!</b><br />
Hoy traigo un super tutoríal muy útil. se trata del servicio gratuito de Google Cloud Messaging (GCM) en castellano sería algo así como mensajería instantánea en la nube.<br />
<br />
<b><span style="font-size: large;">¿Qué es?</span></b><br />
Si alguna vez habeis intentado hacer alguna aplicación que necesite recibir información (tipo chat) cada determinado tiempo os habréis topado con el problema de tener que definir X segundos para que se conecte al servidor y compruebe si hay algún mensaje pendiente de recibir. Esto supone muchos problemas el primero todo el trafico que se genera tontamente y el segundo y aún más importante es que se come la batería del teléfono en pocas horas.<br />
<br />
<a name='more'></a><br />
Google trae la solución! se trata de una Api que automatiza el proceso de recibida de información si necesidad de indicar cada cuanto tiempo tiene que revisar el servidor para comprobar si hay información nueva. Es algo costoso hacerla funcionar pero una vez la tenéis funcionando veréis lo bien que funciona.<br />
<br />
Normalmente GCM se utiliza para notificaciones de aplicaciones. Y eso vamos hacer en este tutorial sin embargo más adelante publicaré unos Post en los cuales intentaremos jugar y sacarle más partido a este sistema de mensajería instantánea.<br />
<br />
Empecemos, lo primero de todo es registrarse en los servicios Cloud de Google para ello entrar aquí:<br />
<br />
-<span style="font-size: large;"><a href="https://cloud.google.com/"> https://cloud.google.com</a></span><br />
<br />
Una vez entremos, nos registremos con nuestra cuenta de google y nos logueemos (posiblemente nos haga verificar nuestro numero de mobil, e-mail, etc...)<br />
Al entrar le damos a crear nuevo proyecto, de nombre yo voy a poner<u> tutorial_html5</u> la Id voy a dejar la que ponga.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYIlvUdIhXgKM3M1W5oPhOYMO2ijXY3aRoaf6Yne6yI4kwMmDqB6U8uOgc4HODge6fGfOMgX_MEh_8Rg6D0fS79QvF8kv4pRQkyusjdARLAd804fjpYjYWQpIsmPYXd4pSjPcAKZdWlOA/s1600/1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYIlvUdIhXgKM3M1W5oPhOYMO2ijXY3aRoaf6Yne6yI4kwMmDqB6U8uOgc4HODge6fGfOMgX_MEh_8Rg6D0fS79QvF8kv4pRQkyusjdARLAd804fjpYjYWQpIsmPYXd4pSjPcAKZdWlOA/s1600/1.PNG" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
Ahora en el menú de la izquierda entramos a Apis y Autentificación -> Apis, y buscamos la opción de Google cloud Messaging for android y lo activamos.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8kuZCeyz6sW6KTl_7X6iAcFBxX2MyB1dXGyKqRKrFEU9hLVCIp3BdJr2JlieWgc142czrKjKnIxT_XJ5HEVI6jyQ7a3XnZMpHZlpwENRz05c4bPC4ckzxQd2wQ_gnYQvcLiKUT-ysBRE/s1600/2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8kuZCeyz6sW6KTl_7X6iAcFBxX2MyB1dXGyKqRKrFEU9hLVCIp3BdJr2JlieWgc142czrKjKnIxT_XJ5HEVI6jyQ7a3XnZMpHZlpwENRz05c4bPC4ckzxQd2wQ_gnYQvcLiKUT-ysBRE/s1600/2.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Una vez activado nos vamos a la opción del Menú Aplicaciones registraras y rellenamos el pequeño formulario.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikh8-btGdc1sSbYltk6oImefMJrlkGh6wpXA5sZRWxZRcC0UV9EyAcdpaIuHVVkMGbF9E1GvIOvYkOTrp7sfnbi_YnOAW_CO0QuOU4L7EJwaBT1mEsOGD4wcvaXjlRB-E5yWiNWmD8M9g/s1600/3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikh8-btGdc1sSbYltk6oImefMJrlkGh6wpXA5sZRWxZRcC0UV9EyAcdpaIuHVVkMGbF9E1GvIOvYkOTrp7sfnbi_YnOAW_CO0QuOU4L7EJwaBT1mEsOGD4wcvaXjlRB-E5yWiNWmD8M9g/s1600/3.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Abrimos el Eclipse creamos nuevo proyecto Android, una vez creado el proyecto vamos a añadir la aplicación de Google Cloud Messaging a nuestro proyecto para ello entramos en SDK android la buscamos marcamos y damos a instalar. en mi caso ya está instalado:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp-JbGTOU7OIJeh28sDephXfSibPl_nFIELWDfbUux1DLxB-_iU2dJokzzXGO1FolSwVQfq7bqHbZMeu_UWeMOmybHFQOCclBrKC8t-T3yBV079fybzCVhBOenwbWsfj1VABVDFrEl1cU/s1600/4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp-JbGTOU7OIJeh28sDephXfSibPl_nFIELWDfbUux1DLxB-_iU2dJokzzXGO1FolSwVQfq7bqHbZMeu_UWeMOmybHFQOCclBrKC8t-T3yBV079fybzCVhBOenwbWsfj1VABVDFrEl1cU/s1600/4.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Una vez instalado vamos a nuestra carpeta del SDK del disco local y localizamos el siguiente archivo .jar</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixlXkEzxY8kDAfnSgAa67D6Y57t7VbYF62fh-kJztN_fs8Y6nCHOG5j1c8OEI8IMezMaZCoaM78I6uGi-AMEfqucTNjV-6SzGhmb8pRyOZg2kA6oTN_zA9tRvIIHEBoQuy7qNVDGf0_Pg/s1600/7.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixlXkEzxY8kDAfnSgAa67D6Y57t7VbYF62fh-kJztN_fs8Y6nCHOG5j1c8OEI8IMezMaZCoaM78I6uGi-AMEfqucTNjV-6SzGhmb8pRyOZg2kA6oTN_zA9tRvIIHEBoQuy7qNVDGf0_Pg/s1600/7.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Al tener localizado el archivo gcm.jar lo copiamos y pegamos dentro de la carpeta <b><u>libs</u></b> de nuestro proyecto, una vez dentro lo añadimos al proyecto de la siguiente manera:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNEEjNu_FoXEaCunsZ6kSZSLJCqcZPQ-wx6QcH1s2ve5Yx4aw5c7LvqEX4BU9oegBNa5dMLOAp2BRWzpycG8y9H6X6RJGmoqIAwsOOPp9xnZLSD4VcyImLVuvhoLTtCttqtZUgrf_o4I/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNEEjNu_FoXEaCunsZ6kSZSLJCqcZPQ-wx6QcH1s2ve5Yx4aw5c7LvqEX4BU9oegBNa5dMLOAp2BRWzpycG8y9H6X6RJGmoqIAwsOOPp9xnZLSD4VcyImLVuvhoLTtCttqtZUgrf_o4I/s1600/6.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Una vez añadido el el gcm al proyecto ya lo tenemos preparado ahora vamos a crear nuestro simple proyecto ya podemos empezar la pequeña aplicación.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Creamos el Cliente Android</b></div>
<div class="separator" style="clear: both; text-align: left;">
En nuestro caso se llama<b> MainActivity.java</b> este es el código totalmente comentado:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<pre><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">tywors</span><span class="o">.</span><span class="na">tutorialhtml5</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.app.Activity</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.os.Bundle</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.util.Log</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.view.View</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.widget.Button</span><span class="o">;</span>
<span class="c1">//Importamos la libreria de google</span>
<span class="kn">import</span> <span class="nn">com.google.android.gcm.GCMRegistrar</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MainActivity</span> <span class="kd">extends</span> <span class="n">Activity</span> <span class="o">{</span>
<span class="c1">//Creamos un TAG para la app</span>
<span class="n">String</span> <span class="n">TAG</span> <span class="o">=</span> <span class="s">"Tutorialeshtml5.com"</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//Comprovamos que todo funcione</span>
<span class="n">GCMRegistrar</span><span class="o">.</span><span class="na">checkDevice</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
<span class="n">GCMRegistrar</span><span class="o">.</span><span class="na">checkManifest</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
<span class="c1">// Register Device Button</span>
<span class="n">Button</span> <span class="n">regbtn</span> <span class="o">=</span> <span class="o">(</span><span class="n">Button</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">register</span><span class="o">);</span>
<span class="n">regbtn</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">View</span><span class="o">.</span><span class="na">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Log</span><span class="o">.</span><span class="na">i</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">"Registering device"</span><span class="o">);</span>
<span class="c1">// Registramos el mobil en GCM utilizando el GCMIntentService</span>
<span class="c1">//Marcará error porque ún no lo hemos creado</span>
<span class="n">GCMRegistrar</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="n">MainActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span>
<span class="n">GCMIntentService</span><span class="o">.</span><span class="na">SENDER_ID</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
Si os avéis fijado os dará un error al no encontrar el boton registrar en el layout, solo tenemos que ir al layout y crear un botón que se tenga de Id register.<br />
<br />
Ahora crearemos el <strong style="background-color: #fffefa; border: 0px; color: #353535; font-family: arial, sans-serif; font-size: 14px; line-height: 23px; margin: 0px; padding: 0px; vertical-align: baseline;">GCMIntentService</strong><strong style="background-color: #fffefa; border: 0px; color: #353535; font-family: arial, sans-serif; font-size: 14px; line-height: 23px; margin: 0px; padding: 0px; vertical-align: baseline;">.java</strong> que es el encargado de comunicarse con el Cloud y recibir los mensajes. Aquí el código totalmente comentado:<br />
<pre><span class="kn">import</span> <span class="nn">android.content.Context</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.content.Intent</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">android.util.Log</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.google.android.gcm.GCMBaseIntentService</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">GCMIntentService</span> <span class="kd">extends</span> <span class="n">GCMBaseIntentService</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">TAG</span> <span class="o">=</span> <span class="s">"tutorialeshtml5.com"</span><span class="o">;</span>
<span class="c1">// Aquí ponemos nuestro código de PROYECTO ID que nos dió android</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">SENDER_ID</span> <span class="o">=</span> <span class="s">"--ID--"</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">GCMIntentService</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">SENDER_ID</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onRegistered</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">,</span> <span class="n">String</span> <span class="n">registrationId</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Log</span><span class="o">.</span><span class="na">i</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">"onRegistered: registrationId="</span> <span class="o">+</span> <span class="n">registrationId</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onUnregistered</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">,</span> <span class="n">String</span> <span class="n">registrationId</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Log</span><span class="o">.</span><span class="na">i</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">"onUnregistered: registrationId="</span> <span class="o">+</span> <span class="n">registrationId</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onMessage</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">,</span> <span class="n">Intent</span> <span class="n">data</span><span class="o">)</span> <span class="o">{</span>
<span class="n">String</span> <span class="n">message</span><span class="o">;</span>
<span class="c1">///////////////////////////////////////</span>
<span class="c1">//Aquí recibimos el mensaje que nos llega del servidor</span>
<span class="c1">///////////////////////////////////////</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="na">getStringExtra</span><span class="o">(</span><span class="s">"message"</span><span class="o">);</span>
<span class="c1">//Lo mostramos en el CatLog:</span>
<span class="n">Log</span><span class="o">.</span><span class="na">d</span><span class="o">(</span><span class="s">"******"</span><span class="o">,</span> <span class="n">message</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onError</span><span class="o">(</span><span class="n">Context</span> <span class="n">arg0</span><span class="o">,</span> <span class="n">String</span> <span class="n">errorId</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Log</span><span class="o">.</span><span class="na">e</span><span class="o">(</span><span class="n">TAG</span><span class="o">,</span> <span class="s">"onError: errorId="</span> <span class="o">+</span> <span class="n">errorId</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
<u><b>Es importante poner nuestro ID en el código donde dice SENDER_ID</b></u><br />
<u><b>Para saber que código ID tenemos lo vemos en la web de google justo despues de crear la aplicación:</b></u><br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnUN6oVw1Fu4_W67YZyAS8UaHu9BAwQ3yr4oO3L-KiL-T4YGhNc57SQ_dojAvd0Gn1UsJow2Xhyphenhyphen8QgXf8Ql0X8brThHQduajlOtqQoiZmyqXH-3-acpqDVmBDXTl1u7ZjBUECSxmg9x4/s1600/9.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnUN6oVw1Fu4_W67YZyAS8UaHu9BAwQ3yr4oO3L-KiL-T4YGhNc57SQ_dojAvd0Gn1UsJow2Xhyphenhyphen8QgXf8Ql0X8brThHQduajlOtqQoiZmyqXH-3-acpqDVmBDXTl1u7ZjBUECSxmg9x4/s1600/9.PNG" /></a></div>
<br /></div>
<div style="text-align: center;">
<u><b><br /></b></u></div>
<div style="text-align: left;">
Ahora hay que introducir las clases y los<u> permisos en el Manifest.xml </u>de nuestro proyecto:<br />
<pre> <span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.INTERNET"</span> <span class="nt">/></span>
</pre>
</div>
<div style="text-align: left;">
<pre> <span class="nt"><permission</span> <span class="na">android:name=</span><span class="s">"com.tywors.tutorialhtml5.permission.C2D_MESSAGE"</span> <span class="na">android:protectionLevel=</span><span class="s">"signature"</span> <span class="nt">/></span>
<span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"com.tywors.tutorialhtml5.permission.C2D_MESSAGE"</span> <span class="nt">/></span>
<span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"com.google.android.c2dm.permission.RECEIVE"</span> <span class="nt">/></span>
<span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.WAKE_LOCK"</span> <span class="nt">/></span>
</pre>
</div>
También hay que añadir la clase que hemos creado en el Manifest.xml<br />
<pre><span class="nt"><activity</span> <span class="na">android:name=</span><span class="s">"com.tywors.tutorialhtml5.GCMIntentService"</span>
<span class="na">android:label=</span><span class="s">"@string/app_name"</span> <span class="nt">></activity></span>
</pre>
Tambien hay que añadir lo siguiente antes del < / aplication ><br />
<pre> <span class="nt"><service</span> <span class="na">android:name=</span><span class="s">".GCMIntentService"</span> <span class="nt">/></span>
</pre>
<pre> <span class="nt"><receiver</span> <span class="na">android:name=</span><span class="s">"com.google.android.gcm.GCMBroadcastReceiver"</span> <span class="na">android:permission=</span><span class="s">"com.google.android.c2dm.permission.SEND"</span><span class="nt">></span>
<span class="nt"><intent-filter></span>
<span class="nt"><action</span> <span class="na">android:name=</span><span class="s">"com.google.android.c2dm.intent.RECEIVE"</span><span class="nt">></span>
<span class="nt"><action</span> <span class="na">android:name=</span><span class="s">"com.google.android.c2dm.intent.REGISTRATION"</span><span class="nt">></span>
<span class="nt"><category</span> <span class="na">android:name=</span><span class="s">"com.androidbegin.gcmtutorial"</span><span class="nt">></span>
<span class="nt"></category></action></action></intent-filter></span>
<span class="nt"></receiver></service></span>
</pre>
Una vez todo listo ejecutamos la aplicación en el movil damos al botón que hemos creado antes en el layout y miramos el Logcat y aparecerá un RegisterId lo capiamos todo apartir del <u>RegisterID</u> eso será el código único para enviar mensages o información al terminal desde una web que mostraré a continuación. Este será el Id del LogCat:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbNjfztgqvZ1UGu7EZFdn4b00ctv0lAibIGBOGkWoxic6_qkaQa0FeGIMB-tEXpsEOFLpkP9MoCyni3H3uZ-x0mtYGs0ek9CZBvLKHttMZxl-R8hl9_zerfQCv5dT545XoGPIjp2w01HA/s1600/10.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbNjfztgqvZ1UGu7EZFdn4b00ctv0lAibIGBOGkWoxic6_qkaQa0FeGIMB-tEXpsEOFLpkP9MoCyni3H3uZ-x0mtYGs0ek9CZBvLKHttMZxl-R8hl9_zerfQCv5dT545XoGPIjp2w01HA/s1600/10.PNG" /></a></div>
Ya tenemos nuestro ID. Para comprobar que todo funciona bien Vamos al siguiente LINK:<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/XT8KZ">http://adf.ly/XT8KZ</a></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
En ese link nos pedirás el <b>Google API Key : lo miramos en el Cloud:</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjipiSttlI5GVjkmS2RryHY69KhoLrp8s834ETNHjEcSXYmJW_Jse1URbqv3_fJWIhKHu4NDG-18ZLXk9zSfCdrg3eNpWfhSzwPdu9c7B4prqbXhaSM9cZN_Qq2Uz5zW-IYOdGQTMEmILo/s1600/9.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjipiSttlI5GVjkmS2RryHY69KhoLrp8s834ETNHjEcSXYmJW_Jse1URbqv3_fJWIhKHu4NDG-18ZLXk9zSfCdrg3eNpWfhSzwPdu9c7B4prqbXhaSM9cZN_Qq2Uz5zW-IYOdGQTMEmILo/s1600/9.PNG" /></a></div>
<div style="text-align: left;">
Despues pedirá<b> Device Registration ID : lo miramos en el Cloud dentro de la aplicación creada:</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6_nRTNz919csAsZzAOBDFp3BGOsrcAWVkhWTYKcW6Qah3yZIJX30KmRPnH8k-PHzKzOPxEortENRWBwC6_0uuGJOmGmIf_Pi0DKdlAlVVMv5FxBnG4W2SOLkCSK1ASh7dSKGZe55FtTY/s1600/12.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6_nRTNz919csAsZzAOBDFp3BGOsrcAWVkhWTYKcW6Qah3yZIJX30KmRPnH8k-PHzKzOPxEortENRWBwC6_0uuGJOmGmIf_Pi0DKdlAlVVMv5FxBnG4W2SOLkCSK1ASh7dSKGZe55FtTY/s1600/12.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Después nos pedirá la ID propio del terminalm el que teniamos en el LogCat:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFBlgLNodxaOFaf7nfF3CFmMJbjsFvNBmaQ6mlKMV6P7a_d2SsesL_uI4CyWmz2t4EOIZ6ORhyC3VPDYCrl2n0hQeUCXITSApoWZmjBl7mlZXEMmvE5iqHKI8x1dUKKJV_2p4oFCXLRjY/s1600/10.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFBlgLNodxaOFaf7nfF3CFmMJbjsFvNBmaQ6mlKMV6P7a_d2SsesL_uI4CyWmz2t4EOIZ6ORhyC3VPDYCrl2n0hQeUCXITSApoWZmjBl7mlZXEMmvE5iqHKI8x1dUKKJV_2p4oFCXLRjY/s1600/10.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: left;">
Y finalmente en Mensage escribimos el mensajes que queramos que llegue, en mi caso: <b>Funciona! </b>y vemos através del LogCat que llega al terminal correctamente! :D</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipPSDH2AMoJPpZb9Y6pBKkualwTU0Xo_Ujgx6AlQWW9CglibbP4OwPtdBhF9z5Vqs8pAiEDmPlmf9uKBeU1dAXH5r42iQsu1S7VRR27BU9-2meYRB7y45AHGdawf_B-3k8fWtSCx9Fzrc/s1600/11.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipPSDH2AMoJPpZb9Y6pBKkualwTU0Xo_Ujgx6AlQWW9CglibbP4OwPtdBhF9z5Vqs8pAiEDmPlmf9uKBeU1dAXH5r42iQsu1S7VRR27BU9-2meYRB7y45AHGdawf_B-3k8fWtSCx9Fzrc/s1600/11.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Todo esto a sido creado por mí sacado de <a href="http://www.androidbegin.com/tutorial/android-google-cloud-messaging-gcm-tutorial/">http://www.androidbegin.com/tutorial/android-google-cloud-messaging-gcm-tutorial/</a> Está en ingles y la versión antigua de Google yo lo he adaptado.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Espero que os funcione perfecto ya que este tutorial tiene bastante complejidad. Os dejo el Projecto para descargar, simplemente tendréis que modificar el ID en el archivo <u><b>GCMIntentService.class</b></u></div>
<div class="separator" style="clear: both; text-align: center;">
<u><b><br /></b></u></div>
<div class="separator" style="clear: both; text-align: center;">
<u><b>Para descargar el Proyecto:</b></u></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/XT9Y3">http://adf.ly/XT9Y3</a></span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: right;">
Muchas gracias a todo, Espero comentarios!</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b><br /></b></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com9tag:blogger.com,1999:blog-7865516939602924439.post-28091821374367638022013-09-02T10:02:00.002-07:002013-09-02T10:02:50.994-07:00Tutorial Mostrar las ondas de audio des de el micrófono en RAW FFT en streaming en Android<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwodhBtjI01blYj_-TZqoASAqNoqXscE4uB20fBsUsWH-fXoFqHnMxW-vECXIs9HsyUI8RdCCAT-cdZs7GlK23tmiaAjVthGuDCqH2p73tlLhsyscSfv46TpkRk_BDJdo25qwYW4qMAy0/s1600/Screenshot_2013-09-02-19-00-39.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwodhBtjI01blYj_-TZqoASAqNoqXscE4uB20fBsUsWH-fXoFqHnMxW-vECXIs9HsyUI8RdCCAT-cdZs7GlK23tmiaAjVthGuDCqH2p73tlLhsyscSfv46TpkRk_BDJdo25qwYW4qMAy0/s200/Screenshot_2013-09-02-19-00-39.png" width="200" /></a></div>
Buenos días!<br />
Hoy os traigo un tutorial que me a costado bastante que funcionase ya que es algo complejo pero el resultado es fantástico! Se trata de dibujar en un canvas las ondas de sonido que recibe el micrófono de nuestro terminal Android.<br />
Los usos que se le pueden dar son muchos. Aquí solo mostraremos como hacerlo funcionar, la forma de utilizarlo dependerá de cada uno de vosotros. Para empezar necesitaremos descargar unas classes de Java (que no recuerdo de donde las descargué así que las subo a Mega) para descargar las clases hacer click en el link:<br />
<br />
<a name='more'></a><br /><br />
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/V1JUZ">http://adf.ly/V1JUZ</a></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Al descargaros el .zip tendréis que meter la carpeta dentro de vuestro proyecto en eclipse, os debería quedar así:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJDR5e1ipFANZpcICoJ8Qv5UGTkaBkYxpG4PhnwOcmrRzpECRn9zkdPvgqsTytns3pJuP_aO_LCfnUaHEgJLWhITJavdHC9VG2Yz-1Sa38D8SJjSn0PEg7QXE0Z6Z05ZyE95xKZorR4Nk/s1600/Sin+t%C3%ADtulo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJDR5e1ipFANZpcICoJ8Qv5UGTkaBkYxpG4PhnwOcmrRzpECRn9zkdPvgqsTytns3pJuP_aO_LCfnUaHEgJLWhITJavdHC9VG2Yz-1Sa38D8SJjSn0PEg7QXE0Z6Z05ZyE95xKZorR4Nk/s400/Sin+t%C3%ADtulo.png" width="323" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Una vez tengamos esto abrá que añadir los permisos necessarios al Manifest en este caso solo se necesitará el de grabar por micrófono:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<pre><span class="nt"><uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.RECORD_AUDIO"</span><span class="nt">></span>
</pre>
Perfecto, primero mostraremos el Layout que será simplemente de un ImageView que ocupará toda la pantalla:<br />
<pre><span class="o"><</span><span class="n">RelativeLayout</span> <span class="nl">xmlns:</span><span class="n">android</span><span class="o">=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="nl">xmlns:</span><span class="n">tools</span><span class="o">=</span><span class="s">"http://schemas.android.com/tools"</span>
<span class="nl">android:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"match_parent"</span>
<span class="nl">android:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"match_parent"</span>
<span class="nl">tools:</span><span class="n">context</span><span class="o">=</span><span class="s">".MainActivity"</span> <span class="o">></span>
<span class="o"><</span><span class="n">ImageView</span>
<span class="nl">android:</span><span class="n">id</span><span class="o">=</span><span class="s">"@+id/imageView1"</span>
<span class="nl">android:</span><span class="n">layout_width</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="nl">android:</span><span class="n">layout_height</span><span class="o">=</span><span class="s">"fill_parent"</span>
<span class="nl">android:</span><span class="n">layout_alignParentLeft</span><span class="o">=</span><span class="s">"true"</span>
<span class="nl">android:</span><span class="n">layout_alignParentRight</span><span class="o">=</span><span class="s">"true"</span>
<span class="nl">android:</span><span class="n">layout_alignParentTop</span><span class="o">=</span><span class="s">"true"</span>
<span class="nl">android:</span><span class="n">src</span><span class="o">=</span><span class="s">"@drawable/ic_launcher"</span> <span class="o">/></span>
<span class="o"></</span><span class="n">RelativeLayout</span><span class="o">></span>
</pre>
Perfecto a continuación os muestro el código Java totalmente comentado:<br />
<pre><span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//Creamos espacio en memoria para la clase FFT</span>
<span class="n">transformer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RealDoubleFFT</span><span class="o">(</span><span class="n">blockSize</span><span class="o">);</span>
<span class="c1">//Creamos el Bitmap para dibujar</span>
<span class="c1">//Recordar que los dos primero int són el tamaño</span>
<span class="n">bitmap</span> <span class="o">=</span> <span class="n">Bitmap</span><span class="o">.</span><span class="na">createBitmap</span><span class="o">(</span><span class="mi">256</span><span class="o">,</span> <span class="mi">450</span><span class="o">,</span> <span class="n">Bitmap</span><span class="o">.</span><span class="na">Config</span><span class="o">.</span><span class="na">ARGB_8888</span><span class="o">);</span>
<span class="c1">//Lo añadimos al canvas</span>
<span class="n">canvas</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Canvas</span><span class="o">(</span><span class="n">bitmap</span><span class="o">);</span>
<span class="c1">//Nuestro image view</span>
<span class="n">imageView</span> <span class="o">=</span> <span class="o">(</span><span class="n">ImageView</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">imageView1</span><span class="o">);</span>
<span class="c1">//Pintaremos de verde</span>
<span class="n">paint</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Paint</span><span class="o">();</span>
<span class="n">paint</span><span class="o">.</span><span class="na">setColor</span><span class="o">(</span><span class="n">Color</span><span class="o">.</span><span class="na">GREEN</span><span class="o">);</span>
<span class="n">imageView</span><span class="o">.</span><span class="na">setImageBitmap</span><span class="o">(</span><span class="n">bitmap</span><span class="o">);</span>
<span class="c1">//Ejecutamos microfono en segundo plano</span>
<span class="k">new</span> <span class="nf">RecordAudio</span><span class="o">().</span><span class="na">execute</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">class</span> <span class="nc">RecordAudio</span> <span class="kd">extends</span> <span class="n">AsyncTask</span><span class="o"><</span><span class="n">Void</span><span class="o">,</span> <span class="kt">double</span><span class="o">[],</span> <span class="n">Void</span><span class="o">></span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPreExecute</span><span class="o">()</span> <span class="o">{</span> <span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="n">Void</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">Void</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Creamos el buffer</span>
<span class="kt">int</span> <span class="n">bufferSize</span> <span class="o">=</span> <span class="n">AudioRecord</span><span class="o">.</span><span class="na">getMinBufferSize</span><span class="o">(</span><span class="n">frequency</span><span class="o">,</span>
<span class="n">channelConfiguration</span><span class="o">,</span> <span class="n">audioEncoding</span><span class="o">);</span>
<span class="c1">//Configurarmos el microfono</span>
<span class="n">AudioRecord</span> <span class="n">audioRecord</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AudioRecord</span><span class="o">(</span>
<span class="n">MediaRecorder</span><span class="o">.</span><span class="na">AudioSource</span><span class="o">.</span><span class="na">MIC</span><span class="o">,</span> <span class="n">frequency</span><span class="o">,</span>
<span class="n">channelConfiguration</span><span class="o">,</span> <span class="n">audioEncoding</span><span class="o">,</span> <span class="n">bufferSize</span><span class="o">);</span>
<span class="c1">//Array de buffer</span>
<span class="kt">short</span><span class="o">[]</span> <span class="n">buffer</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">short</span><span class="o">[</span><span class="n">blockSize</span><span class="o">];</span>
<span class="kt">double</span><span class="o">[]</span> <span class="n">toTransform</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="n">blockSize</span><span class="o">];</span>
<span class="c1">//Encendemos el microfono</span>
<span class="n">audioRecord</span><span class="o">.</span><span class="na">startRecording</span><span class="o">();</span>
<span class="c1">//Bucle infinito (para este tutorial)</span>
<span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//vamos recogiendo los resultados</span>
<span class="kt">int</span> <span class="n">bufferResult</span> <span class="o">=</span> <span class="n">audioRecord</span><span class="o">.</span><span class="na">read</span><span class="o">(</span><span class="n">buffer</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">blockSize</span><span class="o">);</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">bufferResult</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="c1">//Adaptamos los resultados a nuestro array</span>
<span class="n">toTransform</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span> <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">/</span> <span class="n">Short</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">//Le pasamos los resultados a la clase</span>
<span class="n">transformer</span><span class="o">.</span><span class="na">ft</span><span class="o">(</span><span class="n">toTransform</span><span class="o">);</span>
<span class="c1">//Actualizaoms la gráfica</span>
<span class="n">publishProgress</span><span class="o">(</span><span class="n">toTransform</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onProgressUpdate</span><span class="o">(</span><span class="kt">double</span><span class="o">[]...</span> <span class="n">values</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onProgressUpdate</span><span class="o">(</span><span class="n">values</span><span class="o">);</span>
<span class="c1">//Pintamos el fondo de negro</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">drawColor</span><span class="o">(</span><span class="n">Color</span><span class="o">.</span><span class="na">BLACK</span><span class="o">);</span>
<span class="c1">//Recogemos cada valor del array </span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">x</span><span class="o">=</span><span class="n">i</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">downy</span><span class="o">=(</span><span class="kt">int</span><span class="o">)(</span><span class="mi">100</span><span class="o">-(</span><span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="n">i</span><span class="o">])*</span><span class="mi">10</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">upy</span><span class="o">=</span><span class="mi">100</span><span class="o">;</span>
<span class="c1">//Pintamos todos los valores recogidos en nuestrocanvas</span>
<span class="n">canvas</span><span class="o">.</span><span class="na">drawLine</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">downy</span><span class="o">,</span> <span class="n">x</span><span class="o">,</span> <span class="n">upy</span><span class="o">,</span> <span class="n">paint</span><span class="o">);</span>
<span class="o">}</span>
<span class="c1">//Imprimimos</span>
<span class="n">imageView</span><span class="o">.</span><span class="na">invalidate</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
Para descargar el proyecto completo en eclipse hacer click al siguiente enlace:<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/V1LS6">http://adf.ly/V1LS6</a></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
Espero que os haya gustado este tutorial ya que es difícil de encontrar.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Espero vuestro comentarios!! +1</i></span></div>
<div style="text-align: center;">
<br /></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com3tag:blogger.com,1999:blog-7865516939602924439.post-61436386314178642102013-08-30T03:45:00.000-07:002013-08-30T03:45:07.511-07:00Tutorial: Android tareas en segundo plano con AsynkTask y barra de progreso<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguEt0OW6KnY1HY2odyf5FaGy4dyMXXtlH_bC383MxK42gA_tYJWcsORwsgvq3c4L4wjZJcYgmXrIlYyJI44kQq_TpVzu4aHQ8wQv32SMofYTgtaVJJNpQZEWhO6zcStbQn_6IishS-5Zk/s1600/cargando.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguEt0OW6KnY1HY2odyf5FaGy4dyMXXtlH_bC383MxK42gA_tYJWcsORwsgvq3c4L4wjZJcYgmXrIlYyJI44kQq_TpVzu4aHQ8wQv32SMofYTgtaVJJNpQZEWhO6zcStbQn_6IishS-5Zk/s200/cargando.png" width="200" /></a></div>
Buenos días!<br />
Hoy vamos a ver un tutorial muy interesante a la vez que practico para cualquier tipo de aplicación y más si requiere Internet o cálculos que pueden llevar un tiempo.<br />
Una tarea en segundo plano es aquella tarea que se a desprendido de la original para no bloquear esta mientras hace un proceso que puede llevar desde unos segundo a minutos enteros. En este tutorial explicaremos como funciona un Asynctask y pondremos el ejemplo con una barra de progreso que se verá en la aplicación original pero que el calculo de ésta esta en segundo plano, de esta manera la original no se bloquea y podemos seguir viendo movimiento, por ejemplo un ProgressBar. Espero que haya quedado más o menos claro.<br />
Vamos a pasar a ver el código como siempre totalmente explicado:<br />
<br />
<a name='more'></a><pre><span class="c1">//Creamos la clase AsyncTask como vemos contiene 3 parámetros</span>
<span class="c1">//en este caso <Void, Integer, Boolean> en cada caso según lo que</span>
<span class="c1">//queramos suelen cambiar, para que es cada uno de ellos?</span>
<span class="c1">//1º (ej.string) es el parámetro que enviamos al Asyn y es recogido por doInBackGround</span>
<span class="c1">//2º (ej.Inetger) es el parámetro que recibira onProgressUpdate</span>
<span class="c1">//3º (ej.Boolean) el el parámetro que para del doInBackGround a onPostExecute</span>
<span class="c1">//Todos pueden cambiar según nuestro objetivo pero el orden siempre va a ser así</span>
<span class="kd">private</span> <span class="kd">class</span> <span class="nc">Descargar</span> <span class="kd">extends</span> <span class="n">AsyncTask</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">,</span> <span class="n">Boolean</span><span class="o">></span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPreExecute</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//En este ejemplo el onPreExecute no lo utilizaremos</span>
<span class="c1">//Se utiliza en casos que por ejemplo queremos inicializar</span>
<span class="c1">//algunos valores que se utilizarán en este AsyncTask</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="n">Boolean</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">String</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Recibimos por ejempo un link de descargar</span>
<span class="n">String</span> <span class="n">link</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
<span class="c1">//Aquí es dónde ira todo el proceso en segundo plano</span>
<span class="c1">//es decir taréas que normalmente tardan unos segundos o </span>
<span class="c1">//minutos y si no fueran en segundo plano el terminal se </span>
<span class="c1">//bloquearía sobre ese tiempo</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">a</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">a</span><span class="o"><=</span><span class="mi">100</span><span class="o">;</span> <span class="n">a</span><span class="o">++)</span> <span class="o">{</span>
<span class="c1">//En este ejemplo pondremos un simple sleep </span>
<span class="c1">//para hacer ver que la taréa tarda</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">250</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="c1">//Vamos actualizando el onProgressUpdate a medida</span>
<span class="c1">//que hay cambios en el doInBackGround</span>
<span class="n">publishProgress</span><span class="o">(</span><span class="n">a</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onProgressUpdate</span><span class="o">(</span><span class="n">Integer</span><span class="o">...</span> <span class="n">values</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onProgressUpdate</span><span class="o">(</span><span class="n">values</span><span class="o">);</span>
<span class="c1">//vamos añadiendo los valores que recibimos a la barra</span>
<span class="c1">//de progreso</span>
<span class="n">barra_cargando</span><span class="o">.</span><span class="na">setProgress</span><span class="o">(</span><span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostExecute</span><span class="o">(</span><span class="n">Boolean</span> <span class="n">result</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Si al acabar el background recibimos un True</span>
<span class="c1">//mostraremos mensaje de proceso finalizado :D</span>
<span class="k">if</span><span class="o">(</span><span class="n">result</span><span class="o">){</span>
<span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">MainActivity</span><span class="o">.</span><span class="na">this</span><span class="o">,</span> <span class="s">"Listo!"</span>
<span class="o">,</span><span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_LONG</span><span class="o">).</span><span class="na">show</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</pre>
Para ejecutar todo ese Asynctask bastaría con un botón:<br />
<pre><span class="c1">//Al clicar el botón</span>
<span class="n">bt_descargar</span><span class="o">.</span><span class="na">setOnClickListener</span><span class="o">(</span><span class="k">new</span> <span class="n">OnClickListener</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">onClick</span><span class="o">(</span><span class="n">View</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">//Ejecutamos el synctask y en este caso le pasamos un link de descarga</span>
<span class="k">new</span> <span class="nf">Descargar</span><span class="o">().</span><span class="na">execute</span><span class="o">(</span><span class="s">"http://google.com/image.jpg"</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
</pre>
<br />
<div style="text-align: center;">
<u><b><i>Como siempre podéis descargar el proyecto entero en eclipse en el siguiente link: </i></b></u></div>
<div style="text-align: center;">
<u><b><i><br /></i></b></u></div>
<div style="text-align: center;">
<u><b><i><br /></i></b></u></div>
<div style="text-align: center;">
<a href="http://adf.ly/UqEPs"><span style="font-size: x-large;">http://adf.ly/UqEPs</span></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;"><i>Muchas gracias a todos!! Espero vuestras dudas y comentarios!! +1</i></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com3tag:blogger.com,1999:blog-7865516939602924439.post-21046161838181629582013-08-28T03:38:00.000-07:002013-08-28T03:38:44.611-07:00Android: Dibujar gráficas dinámicas con estilo<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqfvs6aqH-c3QZMKT4HCmnrO_FCsQiuL4oNPRfusCZDYWuvr-g1BRm4MKxvzkMMdn15aSZzQaQMYBlicXUWmtpvTWKbN0BDv43X4u2l7rKs-VkcFUrz8mrOo8gpFWfsa4LmbZst0IF84E/s1600/Screenshot_2013-08-28-11-57-20.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqfvs6aqH-c3QZMKT4HCmnrO_FCsQiuL4oNPRfusCZDYWuvr-g1BRm4MKxvzkMMdn15aSZzQaQMYBlicXUWmtpvTWKbN0BDv43X4u2l7rKs-VkcFUrz8mrOo8gpFWfsa4LmbZst0IF84E/s200/Screenshot_2013-08-28-11-57-20.png" width="111" /></a></div>
Buenos días!<br />
En este tutorial vamos a utilizar una librería que va muy bien para generar gráficas se llama androidPlot.<br />
<br />
Se pueden generar gráficas de todo tipo tanto de líneas como de barras, circulares, etc. Hoy vamos a ver como se haría una gráfica de líneas que además se actualizaría con nuevos valores casa 2 segundos (el tiempo lo podéis variar a vuestro gusto o necesidades.)<br />
<br />
Antes de empezar el tutorial hay que saber que cuando nos descargamos una librería en .jar hay que arrastrarla a eclipse metiendola en la carpeta 'libs' del proyecto a continuación hay que darle al botón derecho del mouse y clickar <u>Build Path > Add to Build Path </u>de ésta manera la librería quedaría importada a nuestro proyecto y ya la podríamos utilizar.<br />
<a name='more'></a><br />
Para empezar antes de nada descargarémos la librería AndroidPlot del siguiente link:<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/UjYIr">http://adf.ly/UjYIr</a></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Una vez descargada la añadiremos a la carpeta 'libs' y aremos los pasos explicados más arriba. Una vez importada nos dirigimos a nuestro layout principal (.xml) en mi caso y como ejemplo aré que ocupe toda la pantalla. Codigo:</div>
<div style="text-align: left;">
<pre><span class="nt"><RelativeLayout</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span>
<span class="na">xmlns:tools=</span><span class="s">"http://schemas.android.com/tools"</span>
<span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"match_parent"</span>
<span class="na">tools:context=</span><span class="s">".MainActivity"</span> <span class="nt">></span>
<span class="c"><!-- l --></span>
<span class="c"><!-- Aquí empieza la gráfica --></span>
<span class="c"><!-- l --></span>
<span class="nt"><com.androidplot.xy.XYPlot</span>
<span class="na">android:id=</span><span class="s">"@+id/pot"</span>
<span class="na">android:layout_width=</span><span class="s">"fill_parent"</span>
<span class="na">android:layout_height=</span><span class="s">"fill_parent"</span>
<span class="na">androidPlot.title=</span><span class="s">"A Simple XY Plot"</span>
<span class="na">androidPlot.domainLabel=</span><span class="s">"Domain"</span>
<span class="na">androidPlot.rangeLabel=</span><span class="s">"Range"</span>
<span class="na">androidPlot.graphWidget.marginTop=</span><span class="s">"20dp"</span>
<span class="na">androidPlot.graphWidget.marginLeft=</span><span class="s">"15dp"</span>
<span class="na">androidPlot.graphWidget.marginBottom=</span><span class="s">"25dp"</span>
<span class="na">androidPlot.graphWidget.marginRight=</span><span class="s">"10dp"</span>
<span class="na">androidPlot.legendWidget.iconSizeMetrics.heightMetric.value=</span><span class="s">"15dp"</span>
<span class="na">androidPlot.legendWidget.iconSizeMetrics.widthMetric.value=</span><span class="s">"15dp"</span>
<span class="na">androidPlot.legendWidget.heightMetric.value=</span><span class="s">"25dp"</span>
<span class="na">androidPlot.legendWidget.positionMetrics.anchor=</span><span class="s">"right_bottom"</span>
<span class="na">androidPlot.graphWidget.gridLinePaint.color=</span><span class="s">"#000000"</span><span class="nt">/></span>
<span class="c"><!-- l --></span>
<span class="c"><!-- Aquí finaliza la gráfica --></span>
<span class="c"><!-- l --></span>
<span class="nt"></RelativeLayout></span>
</pre>
</div>
<br />
En el .xml de la gráfica se pueden añadir más opciones como tamaño, color, etc. Que diré dónde encontrarlo al final del tutorial. Ahora pasemos a ver nuestra Classe java para cargar los datos cada dos 2 y actualizar la gráfica. El código está totalmente comentado:<br />
<pre><span class="kd">private</span> <span class="n">XYPlot</span> <span class="n">plot</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">Number</span><span class="o">[]</span> <span class="n">grafica</span> <span class="o">=</span> <span class="o">{</span><span class="mi">1</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">2</span><span class="o">};</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//Creamos nuestra grafica XYPlot recogiendola del XML</span>
<span class="n">plot</span> <span class="o">=</span> <span class="o">(</span><span class="n">XYPlot</span><span class="o">)</span> <span class="n">findViewById</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">id</span><span class="o">.</span><span class="na">pot</span><span class="o">);</span>
<span class="c1">//Creamos el Timer</span>
<span class="n">Timer</span> <span class="n">timer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Timer</span><span class="o">();</span>
<span class="c1">//Que actue cada 2000 milisegundos</span>
<span class="c1">//Empezando des de el segundo 0</span>
<span class="n">timer</span><span class="o">.</span><span class="na">scheduleAtFixedRate</span><span class="o">(</span><span class="k">new</span> <span class="n">TimerTask</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//La función que queremos ejecutar</span>
<span class="n">FuncionParaEsteHilo</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">},</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">2000</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kt">void</span> <span class="nf">FuncionParaEsteHilo</span><span class="o">(){</span>
<span class="c1">//Esta función es llamada des de dentro del Timer</span>
<span class="c1">//Para no provocar errores ejecutamos el Accion</span>
<span class="c1">//Dentro del mismo Hilo</span>
<span class="k">this</span><span class="o">.</span><span class="na">runOnUiThread</span><span class="o">(</span><span class="n">Accion</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">Runnable</span> <span class="n">Accion</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//Actualizamos los numeros del array</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">a</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span><span class="n">a</span><span class="o"><</span><span class="n">grafica</span><span class="o">.</span><span class="na">length</span><span class="o">-</span><span class="mi">1</span><span class="o">;</span><span class="n">a</span><span class="o">++){</span>
<span class="c1">//movemos todos los numeros una posicion a la izquierda</span>
<span class="n">grafica</span><span class="o">[</span><span class="n">a</span><span class="o">]</span> <span class="o">=</span> <span class="n">grafica</span><span class="o">[</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="o">];</span>
<span class="o">}</span>
<span class="c1">//El ultimo numero aremos que sea aleatorio</span>
<span class="n">grafica</span><span class="o">[</span><span class="n">grafica</span><span class="o">.</span><span class="na">length</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="na">floor</span><span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">random</span><span class="o">()*</span><span class="mi">10</span><span class="o">+</span><span class="mi">1</span><span class="o">);</span>
<span class="c1">//Cargamos el nuevo array en la clase XYSERIES</span>
<span class="n">XYSeries</span> <span class="n">series</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SimpleXYSeries</span><span class="o">(</span>
<span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">grafica</span><span class="o">),</span>
<span class="n">SimpleXYSeries</span><span class="o">.</span><span class="na">ArrayFormat</span><span class="o">.</span><span class="na">Y_VALS_ONLY</span><span class="o">,</span>
<span class="s">"Series"</span><span class="o">);</span>
<span class="c1">//Le damos formato de líneas</span>
<span class="n">LineAndPointFormatter</span> <span class="n">seriesFormat</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineAndPointFormatter</span><span class="o">();</span>
<span class="n">seriesFormat</span><span class="o">.</span><span class="na">setPointLabelFormatter</span><span class="o">(</span><span class="k">new</span> <span class="n">PointLabelFormatter</span><span class="o">());</span>
<span class="c1">//Limpiamos la gráfica</span>
<span class="n">plot</span><span class="o">.</span><span class="na">clear</span><span class="o">();</span>
<span class="c1">//Añadimos la nueva gráfica</span>
<span class="n">plot</span><span class="o">.</span><span class="na">addSeries</span><span class="o">(</span><span class="n">series</span><span class="o">,</span> <span class="n">seriesFormat</span><span class="o">);</span>
<span class="n">plot</span><span class="o">.</span><span class="na">redraw</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">};</span>
</pre>
<br />
Para poder personalizar más el gráfico a vuestro gusto recomiendo visitar la página del creador que cuenta con muchos ejemplo, visitar el link de aquí abajo:<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;"><a href="http://adf.ly/UjZqo">http://adf.ly/UjZqo</a></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Como siempre a partir de ahora <u><b>aquí os dejo el proyecto en eclipse</b></u>, visita el siguiente link:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<a href="http://adf.ly/UjaGW"><span style="font-size: large;">http://adf.ly/UjaGW</span></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: right;">
<span style="color: #999999;"><i>Muchas gracias a todos! espero vuestro comentarios!!!</i></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com3tag:blogger.com,1999:blog-7865516939602924439.post-26656470902274654632013-08-28T01:44:00.002-07:002013-08-28T01:44:10.178-07:00Android: Llamar a una función cada X segundos<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyP3urdoFIp9cKIY0PRpxFn-3npqBIMtN2UzG5oTW-Jp_6aFcOW9ssWv6H_Tr7oeItBqyWR4Yu9c-LpS7OWrxV7NnIxl8bB4lXKR_7tmKadA1uphY6Iy58BoZ4hzLe6v38yVEWtBm_w0w/s1600/unnamed.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyP3urdoFIp9cKIY0PRpxFn-3npqBIMtN2UzG5oTW-Jp_6aFcOW9ssWv6H_Tr7oeItBqyWR4Yu9c-LpS7OWrxV7NnIxl8bB4lXKR_7tmKadA1uphY6Iy58BoZ4hzLe6v38yVEWtBm_w0w/s200/unnamed.png" width="150" /></a></div>
Buenos días hoy vamos a ver de manera muy rápida un proceso con Timer para que llame a una función cada X segundos. Nota: la manera que se expone aquí es totalmente funcional aunque no es la manera más óptima, la mejor manera sería así <a href="http://adf.ly/UjFoz">http://adf.ly/UjFoz</a> aunque como veréis es bastante más compleja. Si no eres un experto recomiendo la de este post.<br />
<br />
Como siempre a partir de ahora al final del tutorial dejare el link de descarga del proyecto. Muchas gracias!<br />
Veamos el código como siempre totalmente comentado:<br />
<br />
<a name='more'></a><br />
<br />
<pre><span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="n">setContentView</span><span class="o">(</span><span class="n">R</span><span class="o">.</span><span class="na">layout</span><span class="o">.</span><span class="na">activity_main</span><span class="o">);</span>
<span class="c1">//Creamos el Timer</span>
<span class="n">Timer</span> <span class="n">timer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Timer</span><span class="o">();</span>
<span class="c1">//Que actue cada 3000 milisegundos</span>
<span class="c1">//Empezando des de el segundo 0</span>
<span class="n">timer</span><span class="o">.</span><span class="na">scheduleAtFixedRate</span><span class="o">(</span><span class="k">new</span> <span class="n">TimerTask</span><span class="o">()</span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//La función que queremos ejecutar</span>
<span class="n">FuncionParaEsteHilo</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">},</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">5000</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kt">void</span> <span class="nf">FuncionParaEsteHilo</span><span class="o">()</span>
<span class="o">{</span>
<span class="c1">//Esta función es llamada des de dentro del Timer</span>
<span class="c1">//Para no provocar errores ejecutamos el Accion</span>
<span class="c1">//Dentro del mismo Hilo</span>
<span class="k">this</span><span class="o">.</span><span class="na">runOnUiThread</span><span class="o">(</span><span class="n">Accion</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">Runnable</span> <span class="n">Accion</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//Aquí iría lo que queramos que haga,</span>
<span class="c1">//en este caso mostrar un mensaje.</span>
<span class="n">Toast</span><span class="o">.</span><span class="na">makeText</span><span class="o">(</span><span class="n">getApplicationContext</span><span class="o">(),</span> <span class="s">"Tiempo!"</span><span class="o">,</span> <span class="n">Toast</span><span class="o">.</span><span class="na">LENGTH_LONG</span><span class="o">).</span><span class="na">show</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">};</span>
</pre>
<br />
<u>Para descargar el proyecto hacer click en el siguiente link:</u><br />
<br />
<div style="text-align: center;">
<a href="http://adf.ly/UjImD"><span style="font-size: large;">http://adf.ly/UjImD</span></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: right;">
<span style="color: #666666;"><i>Muchas gracias! espero vuestros comentarios!!</i></span></div>
Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com5tag:blogger.com,1999:blog-7865516939602924439.post-51430942880104119832013-08-24T12:21:00.000-07:002013-08-24T12:21:11.370-07:00Cambios en Tutorialeshtml5.com<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM74GSfaMM5ZxRLPeGJT5vM5Ocw27ETmELdXoeX8GtX2hu4RRJM8rcd7J3ZNSkTibBnp0dGcN0TfBb0VdUrP3yEj5CDyIdpfF40nWrChVcFSPm4tcNsKwWg9gDnwjU9p2O2x2bJBAnyYc/s1600/miedo-al-cambio.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM74GSfaMM5ZxRLPeGJT5vM5Ocw27ETmELdXoeX8GtX2hu4RRJM8rcd7J3ZNSkTibBnp0dGcN0TfBb0VdUrP3yEj5CDyIdpfF40nWrChVcFSPm4tcNsKwWg9gDnwjU9p2O2x2bJBAnyYc/s200/miedo-al-cambio.jpg" width="200" /></a></div>
Primero de todo muchas gracias a todo el mundo por participar y por lograr que este blog siga adelante. Nuestra inspiración a sido siempre ayudar a la gente a iniciarse en el mundo de la programación de una manera fácil y sencilla, contando también con la oportunidad de realizar preguntas que contestamos lo mejor posible. Llevamos así des de Julio de 2007 donde se publico el primer POST, y hemos pensado darle unos cambios al blog para mejorarlo y darle un empujón:<br />
<br />
<br />
- <b>Pedimos más colaboración</b>: ya que mucha es la gente que cada día se inicia en el mundo de la programación nos gustaría que<u> alguien como tú</u> pudiera <u>publicar también algún tutorial</u> para ayudar a la gente a entender situaciones y posibilidades de la programación. Intentando seguir con la estética que se intenta seguir en todos los tutoriales. Para más información: <u><i><span style="color: #666666;">vma.htc@gmail.com</span></i></u><br />
<u><i><br /></i></u>
-<b>Aparte de tutoriales añadiremos Posts con los errores más comunes</b> que nos encontramos mientras programamos. Y explicaremos de manera sencilla como solucionarlo y/o a que es debido.<br />
<br />
-<b>Cambio en el sistema de financiación, </b>mucha es la gente que en los tutoriales nos pide el proyecto en eclipse para poder entenderlo mejor. Lástima que no contamos con los proyectos anteriores pero apartir de ahora en los próximos tutoriales se añadirá el proyecto para descargar en .zip.<br />
La descarga se realizará apartir de adf.ly solo abra que hacer click en el link, esperar 5 segundos y darle a saltar publicidad de esta manera financiamos este blog y no ará falta meterle tanta publicidad.<br />
<br />
<div style="text-align: center;">
<u><b><i>Noticia para Webmasters</i></b></u></div>
<div style="text-align: center;">
Utiliza tu tambien adf.ly en tus links para ir ganando dinero poco a poco se puede retirar cada 5€ cosa que esta muy bien, haz click en este banner de abajo para registrarte y ver su funcionamiento:<br />
<br /></div>
<div style="text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://adf.ly/?id=4920962"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIlqMHSgRJ_4oIQlDkk9qp5HbBhhChPPNPVsLLp_s_bYteZo6CC4nqFOxHrE4ddHnxct0YeD1MYniMHZjZded07ClPwfqDeIvQToEXb0c9BYucy96OYIuJ9GRWcxtBWDphc4FOtqhO5Os/s200/adf.ly.jpg" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Esperamos vuestra colaboración y vuestros comentarios sobre las nuevas reformas. Muchas gracias por los <b>+1 de google</b> obtenidos en los tutoriales.<b> Nosotros te ayudamos, vosotros nos ayudáis. Gracias</b></div>
<br />Víctor Maldonadohttp://www.blogger.com/profile/11932458560996800817noreply@blogger.com0