tag:blogger.com,1999:blog-83667573275301205902024-03-20T04:26:59.020-07:00Android a mueteUnknownnoreply@blogger.comBlogger25125tag:blogger.com,1999:blog-8366757327530120590.post-2949927229059941682023-10-23T01:09:00.000-07:002023-10-23T01:09:39.340-07:00Error: SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable...<p style="text-align: justify;">He actualizado Android Studio a la versión 2022.3.1 Patch 2 en un ordenador que utilizo para pruebas y he copiado un proyecto realizado en el ordenador principal antes de actualizar la versión en éste y se ha producido un error al reconstruir el proyecto (Rebuild Project).</p><p style="text-align: justify;"><span style="color: #cc0000;">SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file at 'C:\Proyectos Android Studio\xxxxxxxxx\local.properties'.</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7lX1ABignuRKOAASOoebgDDKXx56NeP8iFerhonjuiHyfB6w5jPf9gpH0F9xuRyXv2g7qduZCJc4EUtaBSE57YorBmqiHH3xcD4c4aqu8bwW9IYaxUJ0nWjaHrjfV1XldYa_q8A5NE86zH6zEi7pTM3rmoME_rWwJNzPtLV_3KYcJqopTKWc7R7m285U/s483/error_001.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="276" data-original-width="483" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7lX1ABignuRKOAASOoebgDDKXx56NeP8iFerhonjuiHyfB6w5jPf9gpH0F9xuRyXv2g7qduZCJc4EUtaBSE57YorBmqiHH3xcD4c4aqu8bwW9IYaxUJ0nWjaHrjfV1XldYa_q8A5NE86zH6zEi7pTM3rmoME_rWwJNzPtLV_3KYcJqopTKWc7R7m285U/s16000/error_001.JPG" /></a></div><br /><p><span></span></p><a name='more'></a>En el fichero <b><span style="color: #666666;">local.properties</span></b> la ruta del SDK es la siguiente:<br /><span style="color: #ffa400;">sdk.dir</span><span style="color: #38761d;">=C\:\\Users\\madia\\AppData\\Local\\Android\\Sdk</span><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmgYMfbmnOKOMHfDhuLgXJ7JPk1uTx48Svz1JZHmf96jwPF3IDdfbYI5j6e4fT3Cx4No2wnsaVhyphenhyphennlLtOUu8XH6prc7T1d9x7Kzqnfga_9OSsc0k-22myJ0B_JYu_1UQ1WWf4ZkeQvnOu1EoLgsLMCd-f-C2FxkCSCSAxUbAbDltTyzziTBHjWYZUAbUc/s870/error_002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="274" data-original-width="870" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmgYMfbmnOKOMHfDhuLgXJ7JPk1uTx48Svz1JZHmf96jwPF3IDdfbYI5j6e4fT3Cx4No2wnsaVhyphenhyphennlLtOUu8XH6prc7T1d9x7Kzqnfga_9OSsc0k-22myJ0B_JYu_1UQ1WWf4ZkeQvnOu1EoLgsLMCd-f-C2FxkCSCSAxUbAbDltTyzziTBHjWYZUAbUc/w640-h202/error_002.JPG" width="640" /></a></div><p style="text-align: justify;">Básicamente, el SDK de ambos ordenadores no está instalado en el mismo directorio. Para solucionarlo, simplemente hay que sincronizar el proyecto seleccionando <b><span style="color: #666666;">File</span></b> - <b><span style="color: #666666;">Sync Project with Gradle Files</span></b> o <b><span style="color: #666666;">Ctrl+Mayús+O</span></b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebU9Z4RvelC83-p4mU4iFqoP9Yk2pOFwJRmNOdHn6sYZPdtD8vGSUnRfnQ0KV_5KvWnL88oOtTZmNqK0ycfEknCmI13YxnyTXXsaZ4uPfKStBdGof72sEPlPRd3CgFccF1Pg0wHRE9Aft7nxiizUiuOsc1y7uetFYwrYhaLit0TOZ3iJc9tiUPtvXwl0/s342/error_003.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="294" data-original-width="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebU9Z4RvelC83-p4mU4iFqoP9Yk2pOFwJRmNOdHn6sYZPdtD8vGSUnRfnQ0KV_5KvWnL88oOtTZmNqK0ycfEknCmI13YxnyTXXsaZ4uPfKStBdGof72sEPlPRd3CgFccF1Pg0wHRE9Aft7nxiizUiuOsc1y7uetFYwrYhaLit0TOZ3iJc9tiUPtvXwl0/s16000/error_003.JPG" /></a></div><p style="text-align: left;">Nos mostrará una nueva ventana indicándonos que usará la ruta del SDK correcta.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWdK_Qpy8-yjilw1X58n5WF-_bsn02lAliZ8YGzkFfUGhsQOO3MwzeM_lThlAjoIBCW7tJLwoHm7HcSXeg2rA1_peq7G9cBQKhjHBGalnL_bvgsv8KEBI9Rk9omGtIM4NqKclGvvVI2imJrvnTP47gV8ThWUoD7RMqLITTz5k-mjTIvYFvzldb85TntKs/s439/error_004.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="222" data-original-width="439" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWdK_Qpy8-yjilw1X58n5WF-_bsn02lAliZ8YGzkFfUGhsQOO3MwzeM_lThlAjoIBCW7tJLwoHm7HcSXeg2rA1_peq7G9cBQKhjHBGalnL_bvgsv8KEBI9Rk9omGtIM4NqKclGvvVI2imJrvnTP47gV8ThWUoD7RMqLITTz5k-mjTIvYFvzldb85TntKs/s16000/error_004.JPG" /></a></div><p style="text-align: left;">Seleccionamos <b><span style="color: #666666;">OK </span></b>y comprobamos en <b><span style="color: #666666;">local.properties</span></b> que ha cambiado la ruta.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_X5ZuEroh4Be7GeFXeLSkFqzKWwXd37s9ln0aLjEWECBBA9IsAYEztmzs51gVeHks48Ymyugux4wgq0x5QnmaCLowAtJvoq8mQkxB2PSIq40zRpmKbfaf7SSTrz-50lHViHJP5Pl7PDXT8K650lorxUglzY1HUQgzZEoJaKn0FinIAd1NC11gGQ7C5NU/s874/error_005.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="242" data-original-width="874" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_X5ZuEroh4Be7GeFXeLSkFqzKWwXd37s9ln0aLjEWECBBA9IsAYEztmzs51gVeHks48Ymyugux4wgq0x5QnmaCLowAtJvoq8mQkxB2PSIq40zRpmKbfaf7SSTrz-50lHViHJP5Pl7PDXT8K650lorxUglzY1HUQgzZEoJaKn0FinIAd1NC11gGQ7C5NU/w640-h178/error_005.JPG" width="640" /></a></div><p style="text-align: left;">Con esta acción ya podemos reconstruir el proyecto correctamente.</p><p style="text-align: left;"><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-21447245422973711812023-10-06T11:10:00.004-07:002023-10-06T11:10:32.791-07:00Error con crashlytics<p style="text-align: justify;">He añadido <a href="https://firebase.google.com/docs/crashlytics?hl=es-419" rel="nofollow" target="_blank">Firebase Crashlytics</a> a una de mis aplicaciones y cuando he subido la app a Google Play me ha indicado el siguiente error:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwmqF_GzOvgdnT7V7M4jRLe45Y_hJCE7W4hdKeLn8ppE251uo5ng7vDD6NX7krAelLFuAufxSgKlQzrQmhByAxGSOBGHT7z8OM6WiJmAoDhTiRLMPuYJp2fVAGm1YjESHa0oUzzDbZ5cTtFRP_L4QoNlzRGpa6vis16c3IFW5u1RKx-bQDZ-ajKihgG70/s793/error_001.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="239" data-original-width="793" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwmqF_GzOvgdnT7V7M4jRLe45Y_hJCE7W4hdKeLn8ppE251uo5ng7vDD6NX7krAelLFuAufxSgKlQzrQmhByAxGSOBGHT7z8OM6WiJmAoDhTiRLMPuYJp2fVAGm1YjESHa0oUzzDbZ5cTtFRP_L4QoNlzRGpa6vis16c3IFW5u1RKx-bQDZ-ajKihgG70/w640-h193/error_001.JPG" width="640" /></a></div><br /><span><a name='more'></a></span><h3 style="text-align: left;">Solución</h3><p></p><p style="text-align: justify;">Para solucionarlo hay que modificar el archivo <b><span style="color: #666666;">manifest.xml</span></b>.</p><div style="background-color: #2b2b2b; color: #a9b7c6; font-family: "JetBrains Mono", monospace; font-size: 9,8pt;"><pre><span style="color: grey;"><!-- crashlytics --><br /></span><span style="color: #e8bf6a;"><meta-data </span><span style="color: #9876aa;">android</span><span style="color: #bababa;">:name</span><span style="color: #6a8759;">="google_analytics_adid_collection_enabled"
</span><span style="color: #9876aa;"> android</span><span style="color: #bababa;">:value</span><span style="color: #6a8759;">="false" </span><span style="color: #e8bf6a;">/><br /></span><span style="color: #e8bf6a;"><uses-permission </span><span style="color: #9876aa;">android</span><span style="color: #bababa;">:name</span><span style="color: #6a8759;">="com.google.android.gms.permission.AD_ID"
</span><span style="color: #9876aa;"> tools</span><span style="color: #bababa;">:node</span><span style="color: #6a8759;">="remove" </span><span style="color: #e8bf6a;">/></span></pre></div><p style="text-align: justify;">Lo que hace básicamente es deshabilitar la recopilación del ID de los anuncios.</p><p><b>Fuente</b>: </p><p><a href="https://stackoverflow.com/questions/76110417/firebase-analytics-declared-com-google-android-gms-permission-ad-id-permission-d">https://stackoverflow.com/questions/76110417/firebase-analytics-declared-com-google-android-gms-permission-ad-id-permission-d</a></p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-78910745159907919642023-10-06T11:06:00.001-07:002023-10-06T11:06:35.603-07:00Firebase Crashlytics<p style="text-align: justify;"><b>Firebase Crashlytics</b> en un servicio que obtiene estadísticas e información sobre los problemas de las apps que originan el cuelgue de las mismas. Informa de fallos en tiempo real y te ayuda a hacer un seguimiento de los problemas de estabilidad que afectan la calidad de tu app, a priorizarlos y a corregirlos.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkHvxFJmFZ1tT7crV5EgP0Rkz_dy2tdtrXsewK5o4mG37E648lFUuMvXl0HUk1pjlj24fSBdDTNI-JpmHrVtVl15ljn8I4EwPcnETVbOcOQLlnOf_rBQ0hbUjbt1sFyWg_hVVTRXfOwl-osfSM-_XpaXIHuc64qkI2wrNmbHlJsZRRTzVPVYQAfE6kmwg/s793/crash_01.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="546" data-original-width="793" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkHvxFJmFZ1tT7crV5EgP0Rkz_dy2tdtrXsewK5o4mG37E648lFUuMvXl0HUk1pjlj24fSBdDTNI-JpmHrVtVl15ljn8I4EwPcnETVbOcOQLlnOf_rBQ0hbUjbt1sFyWg_hVVTRXfOwl-osfSM-_XpaXIHuc64qkI2wrNmbHlJsZRRTzVPVYQAfE6kmwg/w640-h441/crash_01.JPG" width="640" /></a></div><p style="text-align: justify;"><span></span></p><a name='more'></a>Para añadir Crashlytics a tu app has de seguir los siguientes pasos:<p></p><p style="text-align: justify;">En <b><span style="color: #666666;">buid.gradle(Project)</span></b></p><div style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'JetBrains Mono',monospace; font-size: 9,8pt;"><pre>dependencies <span style="font-weight: bold;">{</span><span style="font-weight: bold;"> </span><span style="color: grey;"><br /></span><span style="color: grey;"> ......<br /></span><span style="color: grey;"><br /></span><span style="color: grey;"> // Add the dependency for the Crashlytics Gradle plugin<br /></span><span style="color: grey;"> </span>classpath <span style="color: #6a8759;">'com.google.firebase:firebase-crashlytics-gradle:2.9.9'<br /></span><span style="font-weight: bold;">}</span></pre></div><p style="text-align: justify;">En <b><span style="color: #666666;">buid.gradle(app)</span></b></p><div style="text-align: justify;"><div style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'JetBrains Mono',monospace; font-size: 9,8pt;"><pre>plugins <span style="font-weight: bold;">{<br /></span><span style="font-weight: bold;"> .....</span><span style="color: #6a8759;"><br /></span><span style="color: #6a8759;"> </span><span style="color: grey;">// Add the Crashlytics Gradle plugin<br /></span><span style="color: grey;"> </span>id <span style="color: #6a8759;">'com.google.firebase.crashlytics'<br /></span><span style="font-weight: bold;">}</span></pre></div></div><div style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'JetBrains Mono',monospace; font-size: 9,8pt;"><pre>dependencies <span style="font-weight: bold;">{<br /></span><span style="font-weight: bold;"> </span><span style="color: grey;">.....</span><span style="color: #6a8759;"><br /></span><span style="color: #6a8759;"><br /></span><span style="color: #6a8759;"> </span><span style="color: grey;">// Crashlytics<br /></span><span style="color: grey;"> </span>implementation <span style="color: #6a8759;">'com.google.firebase:firebase-crashlytics:18.4.3'<br /></span><span style="color: #6a8759;"> </span>implementation <span style="color: #6a8759;">'com.google.firebase:firebase-analytics:21.3.0'<br /></span><span style="color: #6a8759;"><br /></span><span style="font-weight: bold;">}</span></pre></div><p style="text-align: justify;">Para ver los resultados entras en <b><span style="color: #666666;">Firebase</span></b>, seleccionas la app y en el menú lateral selecciona <b><span style="color: #666666;">Crashlytics</span></b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpS_uBfFOOYZn1ILiul2AlOqyxmrw992n0dCZXGu3fKkfHATv_m0PSX5jqrYTj7Z0g1MkBvEChc4nNdL_bJ-n5Rx3fJiXoWNDbevp5Y7SS2o8cE0L54nIFcvPKHyQqcBskEogZyQBiVQBSEKPCN4jXtRlMD1-ZOk0lzk4RmFfNcZi8Qk4B1_xshrUMHyw/s709/crash_02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="462" data-original-width="709" height="417" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpS_uBfFOOYZn1ILiul2AlOqyxmrw992n0dCZXGu3fKkfHATv_m0PSX5jqrYTj7Z0g1MkBvEChc4nNdL_bJ-n5Rx3fJiXoWNDbevp5Y7SS2o8cE0L54nIFcvPKHyQqcBskEogZyQBiVQBSEKPCN4jXtRlMD1-ZOk0lzk4RmFfNcZi8Qk4B1_xshrUMHyw/w640-h417/crash_02.JPG" width="640" /></a></div><br /><p style="text-align: justify;"><b>Fuentes</b>:</p><p style="text-align: justify;"></p><ul><li><a href="https://firebase.google.com/docs/crashlytics?hl=es-419" rel="nofollow" target="_blank">https://firebase.google.com/docs/crashlytics?hl=es-419</a></li><li><a href="https://firebase.google.com/docs/crashlytics/get-started?platform=android&hl=es-419#java" rel="nofollow" target="_blank">https://firebase.google.com/docs/crashlytics/get-started?platform=android&hl=es-419#java</a></li></ul><p></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-21551929515206850002023-04-09T11:19:00.006-07:002023-04-09T11:19:55.040-07:00El corrector ortográfico en Android Studio<p style="text-align: justify;">Una de las características que tiene Android Studio es que, por defecto, realiza una correccikón ortográfica de nuestro código. Esta corrección se realiza por defecto en el idioma ingles por lo que es una pesadez que te esté advirtiendo de un error constantemente.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Ka_qP46uLhwiXY46p2ABkpBja5vxV_Gxf_eCOnAuWSyhJughm4KOf5PTAM3uVpQgV10tPYdZRUjzd_12FwG10nG53ak8BGBXfFkEbSZd8HFnrS7HlHfj2ArXeSUtQpXhhr4q6bbL86EYCxjGhlW0odmyj46avDps6Zftku4OEoSYrNYxj0bIf9LP/s1280/corrector_ortografico.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="714" data-original-width="1280" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Ka_qP46uLhwiXY46p2ABkpBja5vxV_Gxf_eCOnAuWSyhJughm4KOf5PTAM3uVpQgV10tPYdZRUjzd_12FwG10nG53ak8BGBXfFkEbSZd8HFnrS7HlHfj2ArXeSUtQpXhhr4q6bbL86EYCxjGhlW0odmyj46avDps6Zftku4OEoSYrNYxj0bIf9LP/w640-h358/corrector_ortografico.jpg" width="640" /></a></div><p style="clear: both; text-align: justify;">Tenemos dos opciones:</p><p style="clear: both; text-align: justify;"></p><ol><li>Añadir un diccionario en español.</li><li>Deshabilitar el corrector ortográfico.</li></ol><p></p><span><a name='more'></a></span><h3 style="clear: both; text-align: justify;">Añadir un diccionario en español</h3><p style="text-align: justify;">Puede descargar el diccionario ASCII en español (o cualquier otro idioma) desde <a href="https://www.winedt.org/dictASCII.html" rel="nofollow" target="_blank">winedt.org</a> y luego agregarlo a Android Studio:</p><p></p><ol style="text-align: left;"><li>Selecciona <b><span style="color: #666666;">File </span></b>- <b><span style="color: #666666;">Settings </span></b>- <b><span style="color: #666666;">Editor </span></b>- <b><span style="color: #666666;">Spelling</span></b>.</li><li>Click <b><span style="color: #666666;">+</span></b>.</li><li>Seleccione la ruta a su carpeta de diccionarios (dentro debe tener listas de palabras de texto sin formato con extensión .dic).</li><li>Reiniciar Android Studio.</li></ol><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOwUuxYK7hsWP2iU4y1k9Oh5DW3C0Fcsevq5gV2oRICl3xydYw_F2hPB8mPWYZr0hllwjVcW0a5M_vxK2_Q6Buuvam02cGlF7jx7tEzrsFmvYdoPjdPcz4ecsWc0MubaSl_u6d1__MgBoxwwBaGlY-s-NerFieXdM9K7irKb1nWnQXw__tHHOUw5Xu/s984/dictionary_01.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="713" data-original-width="984" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOwUuxYK7hsWP2iU4y1k9Oh5DW3C0Fcsevq5gV2oRICl3xydYw_F2hPB8mPWYZr0hllwjVcW0a5M_vxK2_Q6Buuvam02cGlF7jx7tEzrsFmvYdoPjdPcz4ecsWc0MubaSl_u6d1__MgBoxwwBaGlY-s-NerFieXdM9K7irKb1nWnQXw__tHHOUw5Xu/w640-h464/dictionary_01.PNG" width="640" /></a></div><br /><p>Nota: Esta opción tiene problemas con los acentos</p><h3 style="text-align: left;">Deshabilitar el corrector ortográfico</h3><p>Debido a los problemas con los acentos he optado por esta segunda opción. Para ello:</p><ol><li>Selecciona <b><span style="color: #666666;">File </span></b>- <b><span style="color: #666666;">Settings </span></b>- <b><span style="color: #666666;">Editor </span></b>- <b><span style="color: #666666;">Inspecctions</span></b>.</li><li>En <b><span style="color: #666666;">Options</span></b>, desmarque aquellas opciones que no queremos que corrija automáticamente (yo he desmarcado todos).</li></ol><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbaXL25NSgNI2ztbBl3OR4nKV50akiHiB1vMnlEYNW9Cb3vYPAEXMvtoDqSP8PjRhpyMPRFw15ht_2SB2EmVNyOziSRjr7ZlOLjjNKYnvDm-C6Rf5nNtI215oPc2OySkQNaD-UpSirCl_rwe8fY38kJ43TudzHGegIKxQOrwBdoHeWe-HKpXTmLFS/s984/dictionary_02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="713" data-original-width="984" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbaXL25NSgNI2ztbBl3OR4nKV50akiHiB1vMnlEYNW9Cb3vYPAEXMvtoDqSP8PjRhpyMPRFw15ht_2SB2EmVNyOziSRjr7ZlOLjjNKYnvDm-C6Rf5nNtI215oPc2OySkQNaD-UpSirCl_rwe8fY38kJ43TudzHGegIKxQOrwBdoHeWe-HKpXTmLFS/w640-h464/dictionary_02.JPG" width="640" /></a></div><br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-25855886511364365612022-12-05T06:27:00.003-08:002022-12-05T06:27:29.766-08:00Windows 10: Reparación suave del sistema<p style="text-align: justify;">Después de una actualización de Windows (creo que ese fue el motivo) empecé a tener problemas con la barra de tareas de Windows. Básicamente, los iconos parpadeaban y no era posible ejecutar ningún programa. Me puse a investigar en internet y después de probar muchas cosas diferentes, lo que me funcionó a mi es realizar una recuperación suave del sistema.</p><p style="text-align: justify;">Puedes ejecutar una reparación suave del sistema con estos comandos en PowerShell como administrador. Para abrir PowerShell como administrador, escribes en la barra de búsqueda del menú inicio PowerShell, le das clic derecho al ícono y seleccionas ejecutar como administrador.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUWxu-xOgEGI6nwvuaxPwctWgwK_dB-AI8weC9rTJDQSYOA88YWqffoiXPqbULPvSOXcNpYYHv0G2mTkc0VQ3KjmWwDTTe2WBBwIZ_4SbgWXtQnYr82R_xsy8dhgtEnx0osTCkiz8TS4I98EQZEyFgo1jNUfmU6XFvSBvOUc_StRjSYyJhztqEPK0N/s952/powershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="952" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUWxu-xOgEGI6nwvuaxPwctWgwK_dB-AI8weC9rTJDQSYOA88YWqffoiXPqbULPvSOXcNpYYHv0G2mTkc0VQ3KjmWwDTTe2WBBwIZ_4SbgWXtQnYr82R_xsy8dhgtEnx0osTCkiz8TS4I98EQZEyFgo1jNUfmU6XFvSBvOUc_StRjSYyJhztqEPK0N/w640-h214/powershell.png" width="640" /></a></div><br /><p style="text-align: justify;"><span></span></p><a name='more'></a>En el PowerShell vas a copiar y pegar uno por uno los siguientes comandos por separado. Luego de copiar uno de los comandos, presionas ENTER, esperas a que finalice y continúas con el otro.<p></p><p style="text-align: justify;"></p><ul><li><span style="font-family: courier;">DISM.exe /Online /Cleanup-image /Scanhealth</span></li><li><span style="font-family: courier;">DISM.exe /Online /Cleanup-image /Restorehealth</span></li><li><span style="font-family: courier;">sfc /scannow</span></li></ul><p></p><p style="text-align: justify;">Realiza un reinicio de Windows y continúas con los otros dos comandos.</p><p style="text-align: justify;"></p><ul><li><span style="font-family: courier;">chkdsk /scan</span></li><li><span style="font-family: courier;">chkdsk c: /f /r</span></li></ul><p></p><p style="text-align: justify;">Después de esperar un buen rato, se reinició el sistema y volvió a funcionar todo correctamente. Espero que a ti también te sirva de ayuda.</p><p style="text-align: justify;">Fuente:<br /><a href="https://answers.microsoft.com/es-es/windows/forum/all/barra-de-window-10-y-de-tareas-parpadea-y-no-puedo/8d96f176-c239-4bc0-8970-da0a36e607f8" rel="nofollow" target="_blank">https://answers.microsoft.com/es-es/windows/forum/all/barra-de-window-10-y-de-tareas-parpadea-y-no-puedo/8d96f176-c239-4bc0-8970-da0a36e607f8</a></p><p style="text-align: justify;"><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-85933969301412414382022-11-27T10:39:00.002-08:002022-11-27T10:47:01.316-08:00Error: com/android/tools/idea/gradle/run/OutputBuildAction has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0<p>En la última actualización de Android Studio (Android Studio Dolphin 2021.3.1 Patch 1), al ejecutar la app me aparece el siguiente error:</p><p><span style="color: #990000;">Cause: com/android/tools/idea/gradle/run/OutputBuildAction has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0</span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUeW4ZEiaS55fLqXKRtsODs5x8TaqK1aLbdxLnpfJCpece2jcslUS5C86vnokCixJwMS7PyPNW8Pjf0yaejoV4bndvpkrtiWn0cdTTgQRCirwzsWEDjviwRgcV0fwfl7l8WSAOEkmmg5miFaujZoe50gRvS1-aTK0Jsv-7qQMFfB2qC7ONxeiWjtV/s1280/error.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUeW4ZEiaS55fLqXKRtsODs5x8TaqK1aLbdxLnpfJCpece2jcslUS5C86vnokCixJwMS7PyPNW8Pjf0yaejoV4bndvpkrtiWn0cdTTgQRCirwzsWEDjviwRgcV0fwfl7l8WSAOEkmmg5miFaujZoe50gRvS1-aTK0Jsv-7qQMFfB2qC7ONxeiWjtV/w640-h360/error.jpg" width="640" /></a></div><br />Para solucionarlo tiene que realizar la siguiente modificación:<p></p><p><span></span></p><a name='more'></a>Selecciona <b><span style="color: #666666;">File</span></b> - <b><span style="color: #666666;">Settings</span></b> - <b><span style="color: #666666;">Build, Execution, Deplyment</span></b> - <b><span style="color: #666666;">Build Tools</span></b> - <b><span style="color: #666666;">Gradle</span></b> o selecciona <b><span style="color: #666666;">Gradle Settings</span></b><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcCIuyCC8IGyqKzkBUHRLJrSXRHTUuB9bHSUnDDqoSaeOeOhZixDHahkD25wLdnhhyolsNUzU12jQTxdXmNY2G8XWL6rsm_xnrDvxVzlOlF3c-I6sZ6Z0MRU6DbEL6aDxaOyO3Y9iSfK3UaGREQjzM0sOzvjT8eaPbjl1urCShHDlabBzfXMRsdSQ6/s643/img_sdk11_02.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="125" data-original-width="643" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcCIuyCC8IGyqKzkBUHRLJrSXRHTUuB9bHSUnDDqoSaeOeOhZixDHahkD25wLdnhhyolsNUzU12jQTxdXmNY2G8XWL6rsm_xnrDvxVzlOlF3c-I6sZ6Z0MRU6DbEL6aDxaOyO3Y9iSfK3UaGREQjzM0sOzvjT8eaPbjl1urCShHDlabBzfXMRsdSQ6/s16000/img_sdk11_02.JPG" /></a></div><p>En mi caso, tenía seleccionado el siguiente Gradle JDK 1.8 </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJOeWI_wtdVEuyQ9qEXxdfLgg_sVwcYltPCikJgB6kXgLC0KZCD5plN6J7EMxzZ_SydcLXyPqrk7YMwgGZ9Rea4WkvR4Dmr_X2o_CPQAiaR7Aq0jeNVsXgrzgPzKlGsxnZBuuUK48sf3rLfVRWsHlc3xMN9qDjqtGxNrF9Lg4g7k-wsesjeSfRzmt9/s982/img_sdk11_01.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="710" data-original-width="982" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJOeWI_wtdVEuyQ9qEXxdfLgg_sVwcYltPCikJgB6kXgLC0KZCD5plN6J7EMxzZ_SydcLXyPqrk7YMwgGZ9Rea4WkvR4Dmr_X2o_CPQAiaR7Aq0jeNVsXgrzgPzKlGsxnZBuuUK48sf3rLfVRWsHlc3xMN9qDjqtGxNrF9Lg4g7k-wsesjeSfRzmt9/w640-h462/img_sdk11_01.JPG" width="640" /></a></div><p>Cambia la versión del JDK por la 11.0.13:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_aMB9YjPtWVTEFKT_Y9vM3B_HX2RFO_LQM0ceDxln9jA5Vi8sp06LhEwo4gTzzUCDWTJZX3IyLF_tyqMRxfLsZFtTVQztrc5es01ZvI71X8CAF6N6DfMBadg3iBD5inaiRefoHspjlKZlwYC5GD9lttDDXr2V2n1Mh-sAxtbgaVy7wZxEfzkA5C_V/s975/img_sdk11_03.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="710" data-original-width="975" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_aMB9YjPtWVTEFKT_Y9vM3B_HX2RFO_LQM0ceDxln9jA5Vi8sp06LhEwo4gTzzUCDWTJZX3IyLF_tyqMRxfLsZFtTVQztrc5es01ZvI71X8CAF6N6DfMBadg3iBD5inaiRefoHspjlKZlwYC5GD9lttDDXr2V2n1Mh-sAxtbgaVy7wZxEfzkA5C_V/w640-h466/img_sdk11_03.JPG" width="640" /></a></div><p>A partir de este momento la aplicación vuelve a ejecutarse correctamente.</p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-29053040886250493202022-09-30T04:13:00.002-07:002022-09-30T04:13:34.499-07:00Error: Cannot fit requested classes in a single dex file (# methods: 68148 > 65536)<p style="text-align: justify;">Al actualizar mi proyecto y más concretamente la librería android material a la versión 1.6.1 me ha aparecido el siguiente error: <span style="color: #990000;">Cannot fit requested classes in a single dex file (# methods: 68148 > 65536)</span>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuHbYsfKGX5fWPy8k3vfixqR7vUU2CL16mDl5LqvUtne6c6aoPCx5MPEIylMZmDC9EgeRz9FNSVZgUYKdcMPfZFs50oBazvGKtP9JC-Px-wRaBJiUDYDMert3nJ54HGRXCL_RbzWPQkb83zBW-tezPuM1z7YKz4yUAWaqZUm-SrYNicOgy4AjTC6na/s618/error_dex_file.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="24" data-original-width="618" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuHbYsfKGX5fWPy8k3vfixqR7vUU2CL16mDl5LqvUtne6c6aoPCx5MPEIylMZmDC9EgeRz9FNSVZgUYKdcMPfZFs50oBazvGKtP9JC-Px-wRaBJiUDYDMert3nJ54HGRXCL_RbzWPQkb83zBW-tezPuM1z7YKz4yUAWaqZUm-SrYNicOgy4AjTC6na/s16000/error_dex_file.JPG" /></a></div><br /><p style="text-align: justify;"><span></span></p><a name='more'></a><div style="text-align: justify;">El error se produce porque los métodos rebasan cierto límite (65.536). Para solucionarlo hemos de añadir en build:gradle(:app) lo siguiente. android {... defaultConfig { ... } ... } la línea <b><span style="color: #666666;">multiDexEnabled true</span></b></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZPUpZBTfiYPc4tLGAv9Bzi6dXRAxXivlcjHrSNze1k3zYHK_ChywTEDOOy8ymwPV1eSNBdhq8ZJBwuXvWSkMUjbYto7pvemm9S5QzWEWp-1OLe0zW3JsVLipD3Iu-YuL92aVyp9uN5vtuaOhvs_r-eXqqoicECwUY6Q31tyHkLzMakKFMk1QCaGAO/s340/error_dex_file_02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZPUpZBTfiYPc4tLGAv9Bzi6dXRAxXivlcjHrSNze1k3zYHK_ChywTEDOOy8ymwPV1eSNBdhq8ZJBwuXvWSkMUjbYto7pvemm9S5QzWEWp-1OLe0zW3JsVLipD3Iu-YuL92aVyp9uN5vtuaOhvs_r-eXqqoicECwUY6Q31tyHkLzMakKFMk1QCaGAO/s16000/error_dex_file_02.JPG" /></a></div><br /><p style="clear: both; text-align: justify;">Por último, añadimos la librería <b><span style="color: #666666;">com.android.support:multidex:1.0.3</span></b>:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5b5zaeqnTvnZAlAsbVyiBw5juArpSUKfr5W3o1O5HwKRGB3ILs1_gYW4trqPIzfuFfiY2Z6oZE-IVCA6g4WoQC69syWT67hailOjx7sIOmsnFgLOY_1jfxf9uTBIIFMWw0gxTNHP-NKIijnhfeErX0F_WgxguSiijUlvJ_xn_pUuWJlsmOHvLGpgh/s422/error_dex_file_03.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="36" data-original-width="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5b5zaeqnTvnZAlAsbVyiBw5juArpSUKfr5W3o1O5HwKRGB3ILs1_gYW4trqPIzfuFfiY2Z6oZE-IVCA6g4WoQC69syWT67hailOjx7sIOmsnFgLOY_1jfxf9uTBIIFMWw0gxTNHP-NKIijnhfeErX0F_WgxguSiijUlvJ_xn_pUuWJlsmOHvLGpgh/s16000/error_dex_file_03.JPG" /></a></div><br /><p style="clear: both; text-align: justify;">Sincronizamos el proyecto y este tipo de error debería desaparecer.</p><p style="clear: both; text-align: justify;">Fuente: <a href="https://www.youtube.com/watch?v=4CT4ZlRg2Dc" rel="nofollow" target="_blank">Solución a Cannot fit requested classes in a single dex file</a></p><div style="text-align: justify;"><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-47954740754844167842022-01-18T04:49:00.002-08:002022-03-11T03:33:13.259-08:00Cómo utilizar ADB WiFi en Android Studio<p style="text-align: justify;"><b><span style="color: #666666;">ADB </span></b>es el acrónimo de “Android Debug Bridge” y es una herramienta que se instala junto con el SDK de Android y nos permite acceder y controlar un dispositivo Android desde el ordenador. De esta forma podemos realizar pruebas de nuestro código directamente sobre un dispositivo móvil real.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwCPv365GEHy5nBAWtUna1Dx-5j7MtO7oeeKCw-lqMbSKRkAa9XB9cLS_b05NhVJNGYrmOuBqCL5uHSiHgoRAHOxrd_mZtPSrTN5tKKfjNHxMSLznPy5GX8mLP_TDM9X4RmTH2VNTi6Pwtwmg3tOiLLv2m6_2ss4SBD_6y6eIFE2i4xV317dL-Ccax=s1200" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="666" data-original-width="1200" height="356" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwCPv365GEHy5nBAWtUna1Dx-5j7MtO7oeeKCw-lqMbSKRkAa9XB9cLS_b05NhVJNGYrmOuBqCL5uHSiHgoRAHOxrd_mZtPSrTN5tKKfjNHxMSLznPy5GX8mLP_TDM9X4RmTH2VNTi6Pwtwmg3tOiLLv2m6_2ss4SBD_6y6eIFE2i4xV317dL-Ccax=w640-h356" width="640" /></a></div><br /><span><a name='more'></a></span><div style="text-align: justify;">Para ello, el dispositivo móvil tiene que tener habilitado el <b><span style="color: #666666;">Modo desarrollador</span></b> con la opción <b><span style="color: #666666;">Depuración por USB</span></b> habilitada. Si no sabes como activar el modo desarrollador tendrás que realizar los siguientes pasos:</div><p></p><ul style="text-align: left;"><li style="text-align: justify;">Dirígete a <b><span style="color: #666666;">Ajustes</span></b> - <b><span style="color: #666666;">Acerca del dispositivo</span></b>.</li><li style="text-align: justify;">Busca <span style="color: #666666; font-weight: bold;">Número de compilación </span><span>y tócalo </span><b><span style="color: #666666;">siete veces</span></b>.</li><li style="text-align: justify;">Regresa a <b><span style="color: #666666;">Configuración</span></b>, donde encontrarás un nuevo menú denominado <b><span style="color: #666666;">Opciones de desarrollador.</span></b></li><li style="text-align: justify;">Activa la opción <b style="color: #666666;">Depuración por USB.</b></li></ul><p></p><p style="text-align: justify;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhKbJNI9V4s69RblSoAB-dYe3yP6Dt0ZLi2xTR9jo6pP8c0RcB9ZVEj7phF0LhR2CF52Qb3yZXfK3QxU_KLb7B5KWPPajYyTDrRdzUpfGltkAiU5oCWfR8Gj2M-43hAup8sXjrV8Nhtsbg9KdP_mVYV3OuvHs5Mwea0hyOkS6yISqMAcHV_63CvWhdE=s965" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="965" height="331" src="https://blogger.googleusercontent.com/img/a/AVvXsEhKbJNI9V4s69RblSoAB-dYe3yP6Dt0ZLi2xTR9jo6pP8c0RcB9ZVEj7phF0LhR2CF52Qb3yZXfK3QxU_KLb7B5KWPPajYyTDrRdzUpfGltkAiU5oCWfR8Gj2M-43hAup8sXjrV8Nhtsbg9KdP_mVYV3OuvHs5Mwea0hyOkS6yISqMAcHV_63CvWhdE=w400-h331" width="400" /></a></div><br /><div style="text-align: justify;"><b><span style="color: #666666;">Notas</span></b>: </div><div style="text-align: justify;"><ul><li>Estos pasos pueden variar un poco dependiendo de la marca del móvil y la capa de personalización del fabricante.</li><li>Para que se muestre los mensajes de <b><span style="color: #666666;">Log</span></b> en pantalla también se debe habilitar la opción <b><span style="color: #666666;">Depuración inalámbrica</span></b> (en caso de que exista esta opción ya que depende de la versión de Android).</li></ul></div><p></p><p style="text-align: justify;">Hasta ahora, para realizar esta ejecución de código, necesitaba tener el móvil conectado por USB a nuestro PC y es un poco incordio sobre todo si estás probando el código en más de un móvil (se te llena la mesa de cables USB).</p><p style="text-align: justify;">Para poder realizar esta depuración de código vía WiFi debemos ir al menú de Android Studio <b><span style="color: #666666;">File </span></b>- <b><span style="color: #666666;">Settings </span></b>- <b><span style="color: #666666;">Pluggins</span></b>. Seleccionamos <b><span style="color: #666666;">Marketplace </span></b>y buscamos <b><span style="color: #666666;">ADB Wi-Fi</span></b>. Lo seleccionamos e <b><span style="color: #666666;">Install </span></b>- <b><span style="color: #666666;">Accept</span></b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhrl8c_kmMmf0tV6KxfaZA3o9VOgmB9R7Rqb-Ja1S0BTK-hKJaACxSFQkKh4Ur_0QXeLH-6Ywdz_eI1HobBmYI8hzVKlieWzQekCs-STlnCkN4JIiuUEkwRmaGsCUy8x03GSixGYOzAqSWheZVyo-lziALGgSnViTRk7sX2N-XUxxjHfKKKpNqxslnc=s984" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="703" data-original-width="984" height="458" src="https://blogger.googleusercontent.com/img/a/AVvXsEhrl8c_kmMmf0tV6KxfaZA3o9VOgmB9R7Rqb-Ja1S0BTK-hKJaACxSFQkKh4Ur_0QXeLH-6Ywdz_eI1HobBmYI8hzVKlieWzQekCs-STlnCkN4JIiuUEkwRmaGsCUy8x03GSixGYOzAqSWheZVyo-lziALGgSnViTRk7sX2N-XUxxjHfKKKpNqxslnc=w640-h458" width="640" /></a></div><p style="text-align: justify;">Una vez instalado nos aparece en la esquina inferior derecha de Android Studio una nueva pestaña denominada <b><span style="color: #666666;">ADB Wi-Fi</span></b>. La seleccionas y conectas el dispositivo móvil por USB para realizar el emparejamiento inicial. Evidentemente, tanto el PC como el dispositivo móvil han de estar conectado a la misma red local y han de tener conectividad IP entre si.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjw52IcCQCdY_QAdjaT3lq8Gf5lFtbVDyluCLUMFCfGqaGKfXWsjheP2pdZWoeIVpQ2vin9Vm2Zrse25m4icA0s-tHIDC7AdYRgO3_5Ddr-hPs4kmHYPC7NhGBd1CWfwzUE7rRxcFl8lGCF3r-2aaOV96blkwbjtqxXii6NSnfH56WrVybZUzdrAPJi=s622" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="128" data-original-width="622" src="https://blogger.googleusercontent.com/img/a/AVvXsEjw52IcCQCdY_QAdjaT3lq8Gf5lFtbVDyluCLUMFCfGqaGKfXWsjheP2pdZWoeIVpQ2vin9Vm2Zrse25m4icA0s-tHIDC7AdYRgO3_5Ddr-hPs4kmHYPC7NhGBd1CWfwzUE7rRxcFl8lGCF3r-2aaOV96blkwbjtqxXii6NSnfH56WrVybZUzdrAPJi=s16000" /></a></div><p style="text-align: justify;">Haces click en <b><span style="color: #666666;">Conect </span></b>y en unos segundos ya tenemos nuestro dispositivo conectado por Wi-Fi.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjMV2XjPoDBaqkvt3tPcpOJn035QLLKpaa33H7nwzBxH-59HZsjM7y__EbiCYOBZDoSAlJ3vOcRDboiipt0JCOhRlNlPZNBoqlOYX07GU3HZrNPOku5YP6nfGCaT1jpqzQwnBfUHca54x8YaHTn64PvyYxef8slVQuwRuAYXG1WnYGZOSMAm6sagT2a=s625" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="126" data-original-width="625" src="https://blogger.googleusercontent.com/img/a/AVvXsEjMV2XjPoDBaqkvt3tPcpOJn035QLLKpaa33H7nwzBxH-59HZsjM7y__EbiCYOBZDoSAlJ3vOcRDboiipt0JCOhRlNlPZNBoqlOYX07GU3HZrNPOku5YP6nfGCaT1jpqzQwnBfUHca54x8YaHTn64PvyYxef8slVQuwRuAYXG1WnYGZOSMAm6sagT2a=s16000" /></a></div><p style="text-align: justify;">En la imagen puedes observar que la conexión se realiza sobre la IP del móvil por el puerto 5555. Entiendo que si el móvil cambia de IP (por utilizar DHCP para obtener la IP del dispositivo) deberás realizar nuevamente el emparejamiento explicado anteriormente.</p><p style="text-align: justify;">Si cierras Android Studio y lo vuelves a ejecutar podrás conectar con el móvil vía ADB Wi-Fi siempre y cuando el móvil no cambie de IP. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiKf9yB9mA1jT_UhmOvoPcMWNj6zPW7n3LRNaSiOyzx8MNncX1FiOXpsYhuS08sbyFVal3gzRJ4JLrbvD8NG8VCrkoUjPMBkaQP_dWzL032-LGAwCeR-LLYJmpltt9_aZzJw3LytLDfg67eeBslUp8TcSPOrnjFwPa6RwIQVHsF-TUpmdtzHAQuaH3i=s640" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="158" data-original-width="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEiKf9yB9mA1jT_UhmOvoPcMWNj6zPW7n3LRNaSiOyzx8MNncX1FiOXpsYhuS08sbyFVal3gzRJ4JLrbvD8NG8VCrkoUjPMBkaQP_dWzL032-LGAwCeR-LLYJmpltt9_aZzJw3LytLDfg67eeBslUp8TcSPOrnjFwPa6RwIQVHsF-TUpmdtzHAQuaH3i=s16000" /></a></div><p style="text-align: justify;">Puedes hacer que el router de tu casa siempre asigne la misma IP a tu dispositivo. En otro blog que tengo explico como hacer esta configuración en mi router de la compañía Movistar en el siguiente <a href="https://arduinoamuete.blogspot.com/2022/01/hogar-conectado-asignar-una-ip-fija-un.html" rel="nofollow" target="_blank">enlace</a>.</p><p style="text-align: justify;">Nota: </p><p style="text-align: justify;"><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-47955824860647496412022-01-12T13:14:00.000-08:002022-01-12T13:14:15.051-08:00Error: Este archivo no se puede instalar en Android 12 o versiones posteriores<p style="text-align: justify;">En este artículo voy a explicar cómo solucionar el error al subir una nueva versión de mi aplicación a Google Play Console.</p><p style="text-align: justify;">Al subir el fichero apk me indica el siguiente error: Has subido un APK o Android App Bundle que tiene una actividad, un alias de actividad, un servicio o un receptor de emisión con filtro de intents, pero sin establecer la propiedad android:exported. Este archivo no se puede instalar en Android 12 o versiones posteriores. Consulta <a href="http://developer.android.com/about/versions/12/behavior-changes-12#exported">developer.android.com/about/versions/12/behavior-changes-12#exported</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgeaZV7ZaItAggQ3mzvdF7UUrm6HKtk60hcx3htmRn7jmCiC4JvYy7bJm3mbPtuzMeM_Sd9NDFmYwzG5OHqItwlkbwLVmlwE7Ak-0NAkPuaT9jfoSiWGN07wlc744KPWs2BS9iPc3Q95M7alB2xSmSXSj9VQ3Izjj28XR3wxnsf_Fq5NnqGSlv4Li7P=s838" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="119" data-original-width="838" height="90" src="https://blogger.googleusercontent.com/img/a/AVvXsEgeaZV7ZaItAggQ3mzvdF7UUrm6HKtk60hcx3htmRn7jmCiC4JvYy7bJm3mbPtuzMeM_Sd9NDFmYwzG5OHqItwlkbwLVmlwE7Ak-0NAkPuaT9jfoSiWGN07wlc744KPWs2BS9iPc3Q95M7alB2xSmSXSj9VQ3Izjj28XR3wxnsf_Fq5NnqGSlv4Li7P=w640-h90" width="640" /></a></div><p style="text-align: left;"><span></span></p><a name='more'></a><div style="text-align: justify;">En la página web nos indica lo siguiente:</div><p></p><p style="text-align: justify;">Si el componente de la app incluye la categoría LAUNCHER, establece <b><span style="color: #666666;">android:exported</span></b> en <b><span style="color: #666666;">true</span></b>. En la mayoría de los casos, establece <b><span style="color: #666666;">android:exported</span></b> en <b><span style="color: #666666;">false</span></b>.</p><p style="text-align: justify;">En mi caso, mi app incluye una Activity con la categoría de Launcher. Es más, si abro el archivo manifest aparece un mensaje de error:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgV5mAxaXoMAY8Pj_JoE5ayf3ww4861cbHPOUeQNDnzUz__W2flECknYlBRhkVcytAgbsd_bjoQxGKAUmpWoGNM8_KdChWDq7d7KddFqw0du3g1u5yN5InJxA6rO_B2UpmWcMNlq1aMOQLX4I9PzyTk4cdXkoC0DlHeRww-uUzpWpItNK6Q5RYan5Zs=s721" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="120" data-original-width="721" height="106" src="https://blogger.googleusercontent.com/img/a/AVvXsEgV5mAxaXoMAY8Pj_JoE5ayf3ww4861cbHPOUeQNDnzUz__W2flECknYlBRhkVcytAgbsd_bjoQxGKAUmpWoGNM8_KdChWDq7d7KddFqw0du3g1u5yN5InJxA6rO_B2UpmWcMNlq1aMOQLX4I9PzyTk4cdXkoC0DlHeRww-uUzpWpItNK6Q5RYan5Zs=w640-h106" width="640" /></a></div><br /><p style="text-align: justify;">Por tanto, he de añadir <span style="color: #9876aa; font-family: "JetBrains Mono", monospace;"><b>android</b></span><b><span style="color: #bababa; font-family: "JetBrains Mono", monospace;">:exported</span><span style="color: #6a8759; font-family: "JetBrains Mono", monospace;">="true"</span></b></p><p style="text-align: justify;">Este error me aparece en dos de las declaraciones de activity por lo que corrijo el error en ambas declaraciones.</p><p style="text-align: justify;">De esta forma he solucionado el problema y ya he podido publicar una nueva versión de la aplicación.</p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-82752684976177959732021-11-07T01:56:00.005-08:002021-11-07T01:57:26.228-08:00Error: Android Gradle plugin requires Java 11 to run<p style="text-align: justify;">A partir del <b>1 de noviembre del 2021</b>, las actualizaciones de aplicaciones y juegos en Google Play tendrán que orientarse a <b>Android 11</b> (nivel 30 de la API) o versiones posteriores. Después de esta fecha, no podrás subir nuevos app bundles ni APKs con una versión de targetSdkVersion inferior a la 30.</p><p style="text-align: justify;">En este artículo voy a explicar como solucionar el problema <b>Android Gradle plugin requires Java 11 to run</b>. <b>You are currently using Java 1.8</b>. Este error me ha aparecido después de cambiar el sdk de mi aplicación a la versión 30, que es obligatoria a partir del 1 de noviembre de 2021 tal y como indiqué anteriormente.</p><div style="text-align: justify;"><span style="font-family: courier;">android {</span></div><div style="text-align: justify;"><span style="font-family: courier;"> compileSdkVersion 30</span></div><div style="text-align: justify;"><span style="font-family: courier;"> defaultConfig {</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;"> targetSdkVersion 30</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;"> }</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;">}</span></div><p style="clear: both; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkWXZG-XiEb0MA_WKl-2fN4CcCZL9-tk_bjaA9EiTaSH3vPzpxttua702IQjlpl0sMNKHkVpUFCQk3cLF2J3YhFp7sWwnf9MhROVepbO2MmuJNj4YQRoMcXdZjnv9L58PFAj_Ecuwva0U/s716/captura01.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="163" data-original-width="716" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkWXZG-XiEb0MA_WKl-2fN4CcCZL9-tk_bjaA9EiTaSH3vPzpxttua702IQjlpl0sMNKHkVpUFCQk3cLF2J3YhFp7sWwnf9MhROVepbO2MmuJNj4YQRoMcXdZjnv9L58PFAj_Ecuwva0U/w640-h146/captura01.JPG" width="640" /></a></p><p style="clear: both; text-align: justify;"><span></span></p><a name='more'></a>Estoy utilizando <b>Android Studio Artic Fox / 2020.3.1 Patch 3</b>. <p></p><p style="text-align: justify;">El mensaje nos indica que la máquina virtual de java se encuentra en la versión 1.8 y tenemos que sustituirla por la versión 11. Para solucionarlo tienes que ir a <b><span style="color: #666666;">File</span></b> - <b><span style="color: #666666;">Settings </span></b>- <b><span style="color: #666666;">Build</span></b>, <b><span style="color: #666666;">Execution, Deployment </span></b>- <b><span style="color: #666666;">Build Tools</span></b> - <b><span style="color: #666666;">Gradle </span></b>- <b><span style="color: #666666;">Gradle JDK</span></b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYQBk7DLtscest3Ukx_O3Kqc651Qcj1myTV26XfxMS-9iQ7giC0IyruiYRRGVfFb9qWCIoKmfF4BANrR3UVfLXguX9tP_rAGuNEnC3dlNyDMXqyvVZ-CdDfyJDPOGMIzECyyL5kuzosWE/s984/captura02.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="703" data-original-width="984" height="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYQBk7DLtscest3Ukx_O3Kqc651Qcj1myTV26XfxMS-9iQ7giC0IyruiYRRGVfFb9qWCIoKmfF4BANrR3UVfLXguX9tP_rAGuNEnC3dlNyDMXqyvVZ-CdDfyJDPOGMIzECyyL5kuzosWE/w640-h458/captura02.JPG" width="640" /></a></div><br /><div style="text-align: justify;">Ahora selecciona la opción:</div><div style="text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLc1y8HA6_ZMJgyNuRmln92ozw8wLT-svyi4winmN9dEYJdF_dBcWEg1I55PJWznTuTvYLGKZear64hDrNJNh1Gzy1IXn-HPL-dLsBk7TOAsc7IubSzuocjWKm6_k_CtWCquELOEPLq8/s611/captura03.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="58" data-original-width="611" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLc1y8HA6_ZMJgyNuRmln92ozw8wLT-svyi4winmN9dEYJdF_dBcWEg1I55PJWznTuTvYLGKZear64hDrNJNh1Gzy1IXn-HPL-dLsBk7TOAsc7IubSzuocjWKm6_k_CtWCquELOEPLq8/s16000/captura03.JPG" /></a></div><div style="text-align: justify;"><br /></div><p style="text-align: left;"><span style="text-align: justify;">Ahora vamos a comprobar si tenemos instalado el SDK de Android 11:</span></p><div style="text-align: left;"><div><p></p><ul><li style="text-align: justify;">Haz clic en <b><span style="color: #666666;">Tools </span></b>- <b><span style="color: #666666;">SDK Manager</span></b>.</li><li style="text-align: justify;">En la pestaña <b><span style="color: #666666;">SDK Platforms</span></b>, selecciona <b><span style="color: #666666;">Android 11</span></b>.</li><li style="text-align: justify;">En la pestaña <b><span style="color: #666666;">SDK Tools</span></b>, selecciona <b><span style="color: #666666;">Android SDK Build-Tools 30</span></b> (o una versión posterior).</li><li style="text-align: justify;">Haz clic en <b><span style="color: #666666;">OK </span></b>para comenzar la instalación.</li></ul><div><div class="separator" style="clear: both; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTvIKyi7fdex6ZO45dYN_hlnsiFlE9w-2kbr-8BBxL2Kvcm_t3ACYyVia9yhsXD-_ZMzBHmCUTyr-IVE6BSW-YIhVSiD0PYB_5WtHSikJHmCj9fc6li-ipvamlK5QX-c0xwkJo6w20iig/s984/captura05.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="703" data-original-width="984" height="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTvIKyi7fdex6ZO45dYN_hlnsiFlE9w-2kbr-8BBxL2Kvcm_t3ACYyVia9yhsXD-_ZMzBHmCUTyr-IVE6BSW-YIhVSiD0PYB_5WtHSikJHmCj9fc6li-ipvamlK5QX-c0xwkJo6w20iig/w640-h458/captura05.JPG" width="640" /></a></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Ejecuta <b><span style="color: #666666;">Clean Project</span></b> y <b><span style="color: #666666;">Rebuild Proyect</span></b> en el menú <b><span style="color: #666666;">Build. </span></b>Si aparece el <span style="color: #990000;">Invoke-customs are only supported starting with Android O (--min-api 26) </span>tienes que añadir a <b><span style="color: #666666;">app/build.gradle</span></b>:</div></div><div style="text-align: justify;"><span style="font-family: courier;"><br /></span></div><div style="text-align: justify;"><span style="font-family: courier;">android {<br /> compileOptions {<br /> sourceCompatibility JavaVersion.VERSION_1_8<br /> targetCompatibility JavaVersion.VERSION_1_8<br /> }</span></div><div style="text-align: justify;"><span style="font-family: courier;">...<br />}</span></div><p style="text-align: justify;">Ahora vuelve a ejecutar <b><span style="color: #666666;">Clean Project</span></b> y <b><span style="color: #666666;">Rebuild Proyect</span></b> en el menú <b><span style="color: #666666;">Build</span></b></p><p style="text-align: justify;">En una de mis app se produjo el siguiente error: <span style="color: #990000;">AAPT: error: resource android:attr/lStar not found</span></p><p style="text-align: justify;">La única solución que encontré fue actualizar el SDK a la versión <b>31</b>:</p><div style="text-align: justify;"><span style="font-family: courier;">android {</span></div><div style="text-align: justify;"><span style="font-family: courier;"> compileSdkVersion 31</span></div><div style="text-align: justify;"><span style="font-family: courier;"> defaultConfig {</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;"> targetSdkVersion 31</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;"> }</span></div><div style="text-align: justify;"><span style="font-family: courier;"> ...</span></div><div style="text-align: justify;"><span style="font-family: courier;">}</span></div><div style="text-align: justify;"><span style="font-family: courier;"><br /></span></div><b>Información oficial para la migración:</b><br /><a href="https://developer.android.com/distribute/best-practices/develop/target-sdk">https://developer.android.com/distribute/best-practices/develop/target-sdk</a></div><div><br /></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-87598665497408385692021-10-17T10:54:00.004-07:002021-10-17T10:54:43.375-07:00Configuración del antivirus Windows Defender<p style="text-align: justify;">Cuando ejecutas Android Studio es posible que te aparezca este mensaje de advertencia o alguno parecido:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvzI95UtUF70J5gtLa-1xLMrD1WjkyMNh_3ku0E6H5LrwDa0oQhvvCQquqDhuIKq5bPKUNIe4tK1sV8c5BMzvL_MtmauBd3AK65aSnWU1glZIqW_u4DuqKLC3jXAI9g_UST3o30dneMOc/s335/antivirus_01.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="117" data-original-width="335" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvzI95UtUF70J5gtLa-1xLMrD1WjkyMNh_3ku0E6H5LrwDa0oQhvvCQquqDhuIKq5bPKUNIe4tK1sV8c5BMzvL_MtmauBd3AK65aSnWU1glZIqW_u4DuqKLC3jXAI9g_UST3o30dneMOc/s320/antivirus_01.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: justify;"><span><a name='more'></a></span>Si haces click sobre <b><span style="color: #0b5394;">Actions</span></b> te mostrará una página web donde te explican que <span style="color: #666666;"><i>cuando ejecutas una compilación en Android Studio, Gradle compila los recursos y el código fuente de tu app y, luego, los empaqueta en un APK. Durante este proceso, se crean muchos archivos en tu computadora. Si tu software antivirus tiene habilitado el escaneo en tiempo real, puede hacer que el proceso de compilación se detenga cada vez que se crea un archivo durante el escaneo de ese archivo</i></span>.</div><p style="text-align: justify;">Te recomienda que <i><span style="color: #666666;">para evitar este problema, puedes excluir ciertos directorios del escaneo en tiempo real en tu software antivirus</span></i>. Además te indica una serie de carpetas que debes excluir del escaneo en tiempo real de tu antivirus.</p><div class="separator" style="clear: both; text-align: justify;">En mi caso, el mensaje me indica una carpeta en concreto porque acabo de actualizar la aplicación de Android Studio y yo ya tenía configurado la exclusión de las carpetas de la versión anterior así que tendré que añadir esta nueva carpeta y eliminar la antigua. </div><p style="text-align: justify;">En este artículo voy a describir cómo configurar Windows Defender para excluir los directorios recomendados del escaneo en tiempo real. </p><p style="text-align: justify;">Para ello tienes que ir a la barra de notificaciones y hacer click en <b><span style="color: #666666;">Seguridad de Windows</span></b>:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3bdMYxKwFntjpwKU6ymMde42OTy7jDOWzeLWfo7Uqve-DjiP7c2ia1grhxHOEJt7P8EZgIlLKgrgIiJ41yBKyBG68IWCYR2zmGcrTUkb3yPQhtq1OIjuEJKLYmeaHrltec4YtAT2ZM1o/s300/antivirus_02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="95" data-original-width="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3bdMYxKwFntjpwKU6ymMde42OTy7jDOWzeLWfo7Uqve-DjiP7c2ia1grhxHOEJt7P8EZgIlLKgrgIiJ41yBKyBG68IWCYR2zmGcrTUkb3yPQhtq1OIjuEJKLYmeaHrltec4YtAT2ZM1o/s16000/antivirus_02.JPG" /></a></div><br /><p style="text-align: justify;">Hacemos click en <b><span style="color: #666666;">Protección antivirus y contra amenazas</span></b>:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLILP2hrfAPCyh_1tGq2Ifzwj44k8OHYxt6He_uknQv3dHDtY1AUGZz8I4Uba2FOe7LjJ2glnua0eLhB5E2w8BjY_CWQ65aT7El4CBMY-FRV5RmFJw7AYWwek_TuwlInROEbNo3mpaWqg/s253/antivirus_03.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLILP2hrfAPCyh_1tGq2Ifzwj44k8OHYxt6He_uknQv3dHDtY1AUGZz8I4Uba2FOe7LjJ2glnua0eLhB5E2w8BjY_CWQ65aT7El4CBMY-FRV5RmFJw7AYWwek_TuwlInROEbNo3mpaWqg/s16000/antivirus_03.JPG" /></a></div><div style="text-align: justify;">Hacemos click en <b><span style="color: #666666;">Configuración de antivirus y protección contra amenazas</span></b> - <b><span style="color: #0b5394;">Administrar la configuración</span></b>:</div><div style="text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmJ1OyUPBezCnAe2laU1WIjRVTAmLYg2CZSMyoo0B6ctF-YuE_7k7cpLvGs-49JWUA0r2kuNDLPWRmrwjRgbtetxlEB7V_N1N1Md3iaA_w4JhQHwWetdA8fHgVaPZoWFzdjCmtRysNA6k/s478/antivirus_04.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="144" data-original-width="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmJ1OyUPBezCnAe2laU1WIjRVTAmLYg2CZSMyoo0B6ctF-YuE_7k7cpLvGs-49JWUA0r2kuNDLPWRmrwjRgbtetxlEB7V_N1N1Md3iaA_w4JhQHwWetdA8fHgVaPZoWFzdjCmtRysNA6k/s16000/antivirus_04.JPG" /></a></div>A continuación, en el apartado <b><span style="color: #666666;">Exclusiones </span></b>- <b><span style="color: #0b5394;">Agregar o quitar exclusiones</span></b>:<div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3OO_s97johHCHveq6fIPVyYxAs7RVBUioX0BOQQMerkR_QP5Pz-m1Z38l_WmG2pmx_TbaIYDHtNDFxAxPASFFMy0twPh9mgdkxvvFQ4ZgHQfJFEVleCT_K7Rl-i_OOcPOmbdO1XGD084/s473/antivirus_05.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="150" data-original-width="473" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3OO_s97johHCHveq6fIPVyYxAs7RVBUioX0BOQQMerkR_QP5Pz-m1Z38l_WmG2pmx_TbaIYDHtNDFxAxPASFFMy0twPh9mgdkxvvFQ4ZgHQfJFEVleCT_K7Rl-i_OOcPOmbdO1XGD084/s16000/antivirus_05.JPG" /></a></div><div><br /></div></div><div class="separator" style="clear: both;"><div style="text-align: justify;">Haciendo click en el botón <b><span style="color: #666666;">+ Agregar exclusiones</span></b> añadimos la lista de directorios que nos recomendó la página web de Introducción a Android Studio o, en mi caso, el directorio que me indica el mensaje de aviso.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Al final de este proceso, debes de tener configurado todas las carpetas recomendadas. En mi caso:</div><div style="margin-left: 1em; margin-right: 1em; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1_kCW66gdJTg_PfxXStVv-WnSCA58nqJJe1NaRgVBdSL8wTzeMBdeO1nrlW7QeBd-TN20a3L3A7TJ6A8bJEOy4r1OAPsFnC_H1yEwPQ7Az_0GxFgeLJr-fK60csTqSq6ctklm79N5nUY/s488/antivirus_06.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1_kCW66gdJTg_PfxXStVv-WnSCA58nqJJe1NaRgVBdSL8wTzeMBdeO1nrlW7QeBd-TN20a3L3A7TJ6A8bJEOy4r1OAPsFnC_H1yEwPQ7Az_0GxFgeLJr-fK60csTqSq6ctklm79N5nUY/s488/antivirus_06.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="331" data-original-width="488" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1_kCW66gdJTg_PfxXStVv-WnSCA58nqJJe1NaRgVBdSL8wTzeMBdeO1nrlW7QeBd-TN20a3L3A7TJ6A8bJEOy4r1OAPsFnC_H1yEwPQ7Az_0GxFgeLJr-fK60csTqSq6ctklm79N5nUY/s16000/antivirus_06.JPG" /></a></div></div><p style="text-align: left;"><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-54151537081704857642021-01-12T04:12:00.003-08:002021-01-12T04:12:41.220-08:00Error Android Studio: File xxx.png does not exist<p style="text-align: justify;">Me ha surgido un error en Android Studio que hasta ahora no me había pasado nunca. He ido a añadir una nueva imagen a una de mis aplicaciones utilizando <b><span style="color: #666666;">Image Asset</span></b> y me ha aparecido el siguiente error:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxKpR0JEONDnbjwNGYOS_j-j8jqjaIGwCkjQfBgzD4gcsZCdchuF8h2-GivKjHDiKqUwzHmNYncroUeaDpLVFCHXEnLFvR9R6PiAL1khTL0bKHs69xvmFp7oKglRYad-kiU2_eLbyU9_Q/s1022/01.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="681" data-original-width="1022" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxKpR0JEONDnbjwNGYOS_j-j8jqjaIGwCkjQfBgzD4gcsZCdchuF8h2-GivKjHDiKqUwzHmNYncroUeaDpLVFCHXEnLFvR9R6PiAL1khTL0bKHs69xvmFp7oKglRYad-kiU2_eLbyU9_Q/w640-h426/01.JPG" width="640" /></a></div><br /><p><span style="color: red; font-weight: bold;"></span></p><a name='more'></a><div style="text-align: justify;"><span style="color: red; font-weight: bold;"><b>File ic_launcher.png does not exit</b></span><span style="color: red; font-weight: bold;">. </span>Como puedes ver en la imagen superior, no me permitía generar una nueva imagen para mi proyecto.</div><p></p><p style="text-align: justify;">Investigando un poco he dado con el origen del problema y su solución. Dentro del proyecto en Android Studio, pulsar las teclas <b><span style="color: #666666;">CTRL + SHIFT + N</span></b> y nos aparecerá un cuadro de diálogos:</p><div class="separator" style="clear: both; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuCxl4Ql9s-m40-5I1w6bBHGxU59x-W8Vt70Ljtk6SyBHwkSam5ALGyCgeGJETsaKbQ9wKeVVq7l1IOn2rRHx9EgmnJPX8A0HHyp5h1wMybnY7pCrCnqh6UZvK3n0ivT-PdExeXqUBdOs/s691/02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="79" data-original-width="691" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuCxl4Ql9s-m40-5I1w6bBHGxU59x-W8Vt70Ljtk6SyBHwkSam5ALGyCgeGJETsaKbQ9wKeVVq7l1IOn2rRHx9EgmnJPX8A0HHyp5h1wMybnY7pCrCnqh6UZvK3n0ivT-PdExeXqUBdOs/w640-h73/02.JPG" width="640" /></a></div><p style="text-align: justify;">Introducimos <b><span style="color: #666666;">assetWizardSettings.xml</span></b> y <b><span style="color: #666666;">Enter</span></b>. Se nos abrirá el fichero y con <b><span style="color: #666666;">CTRL + F</span></b> buscaremos el nombre del fichero que no encuentra el programa, en mi caso <b><span style="color: #666666;">ic_launcher.png</span></b></p><p style="text-align: justify;">Una vez localizado me doy cuenta que la ruta a ese fichero no es correcta ya que la carpeta original la moví a otro disco duro en mi ordenador ya que me estaba quedando sin espacio en el original. Así que sustituí la ruta a ese fichero por la actual y con eso he solucionado el problema.</p><p style="text-align: justify;">La verdad es que la carpeta que moví era una carpeta con diferentes recursos de imágenes, etc que utilizo de forma auxiliar al Android Studio y pensé que no afectaría en nada pero se ve que no es así. Supongo que este mismo error me aparecerá en otros proyectos a medida que los edite.</p><p style="text-align: justify;"><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-71758753805984524672021-01-11T05:49:00.001-08:002021-01-11T05:49:31.793-08:00Utilizar Google Sheet como base de datos<p style="text-align: justify;">En este artículo voy a tratar de explicar de forma detallada cómo utilizar <b><span style="color: #666666;">Google Sheet</span></b>, que es la hoja de cálculo online de Google, como base de datos para nuestra aplicación. Por ahora, los datos se introducirán directamente en Google Sheet y la app los descargará en formato <b><span style="color: #666666;">JSON</span></b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8YJoSfJjRsCHtRFsAuMDA0nTG2PUtvUtNhsLXXEtCvgVdKcLZK7i6hQCp5Kw1iRcpRO86kMQ8ryQHVfrtETRlltDiBkRMFxFJqLaUy5sbV28zNlcWFAOCtWs923mSZjLHNZwobOOHUg/s500/01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="250" data-original-width="500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8YJoSfJjRsCHtRFsAuMDA0nTG2PUtvUtNhsLXXEtCvgVdKcLZK7i6hQCp5Kw1iRcpRO86kMQ8ryQHVfrtETRlltDiBkRMFxFJqLaUy5sbV28zNlcWFAOCtWs923mSZjLHNZwobOOHUg/s16000/01.png" /></a></div><span><a name='more'></a></span><div style="text-align: justify;">En el ejemplo que voy a realizar, voy a añadir a mi app <a href="https://play.google.com/store/apps/details?id=com.janubio.goproqrcontrol" target="_blank">QR Commands</a> una nueva funcionalidad que consiste en consultar una FAQ que he obtenido de la comunidad de <a href="https://community.gopro.com/t5/GoPro-Labs/bd-p/GoProLabs" target="_blank">GoPro Labs</a>. La hoja de cálculo se denomina <b><span style="color: #666666;">tips </span></b>y consta de varias campos (columnas): <b style="color: #666666;">date, title, description, link, keyword,type </b>y<b style="color: #666666;"> version</b>.</div><div><div class="separator" style="clear: both; text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9C1XHn2Z3UvcYqufbgD3yUDnEVAcTaw0_MMT51kC6JbdSHY1v46QUAMXM6dYhkfmRhDM_oofsPwk48HSFcVGvaqrhgGMLIglDEBbfrJJ_G6Eu7zdJeyFjnY8oDaRARjGdz99IduWCeys/s1112/02.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="247" data-original-width="1112" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9C1XHn2Z3UvcYqufbgD3yUDnEVAcTaw0_MMT51kC6JbdSHY1v46QUAMXM6dYhkfmRhDM_oofsPwk48HSFcVGvaqrhgGMLIglDEBbfrJJ_G6Eu7zdJeyFjnY8oDaRARjGdz99IduWCeys/w640-h142/02.JPG" width="640" /></a></div><div style="text-align: justify;"><br /></div><h3 style="text-align: justify;">Google Apps Script</h3><div style="text-align: justify;">Para que esta hoja de cálculo sea accesible desde internet y que nos devuelva el resultado en formato JSON, he de utilizar <b><span style="color: #666666;">Google Apps Script </span></b>(GAS), que es una plataforma para el desarrollo de aplicaciones web con acceso a casi todas las librerías de G Suite. Algunas de estas incluyen Gmail, Drive, Google Sheets, Google Docs, entre otras.</div><div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Lo único que tienes que hacer es escribir javascript. No hay nada que instalar. GAS te provee de un editor de código online que se ejecuta en los servidores de Google.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><h3>Tipos de script</h3><div>En GAS existen tres tipos de script: standalone, container-bound y web apps. Los <b><span style="color: #666666;">standalone </span></b>scripts son recomendados para tareas de utilidad, por ejemplo, obtener el número de eventos registrados en Google Calendar para la siguiente semana y enviarte un email con los resultados. Este tipo de scripts pueden ser ejecutados de manera manual o automáticamente cada cierto tiempo.</div><div><br /></div><div>Los <b><span style="color: #666666;">container-bound</span></b> scripts son accesibles desde Google Sheets, Docs, Slides y Forms. Son utilizados para extender la funcionalidad de estas aplicaciones. El comportamiento de este tipo de script es muy similar al de las macros.</div><div><br /></div><div>Los scripts de tipo <b><span style="color: #666666;">web apps </span></b>permiten exponer en la red la funcionalidad que hayas implementado. Para utilizarla, basta con hacer peticiones <b><span style="color: #666666;">http </span></b>a una url que nos entrega GAS. Este tipo de script debe contener una función <b><span style="color: #666666;">doGet</span></b>(e)o <b><span style="color: #666666;">doPost</span></b>(e)y retornar un objeto de tipo <b><span style="color: #666666;">HtmlOutputo TextOutput.</span></b></div><div><b><span style="color: #666666;"><br /></span></b></div><h3>Creación del script</h3><div><div>Vas a crear un script de tipo web app para que el contenido de la primera hoja de Google Sheet sea entregado al usuario que hace la petición en formato JSON. Para ello, visita la página principal de <a href="https://script.google.com/" target="_blank">GAS</a> y haz clic en <b><span style="color: #666666;">Nuevo Proyecto</span></b> en el menú lateral. Esto te llevará a la consola de proyectos, donde crearemos nuestro script.</div></div><div><br /></div><div>El código que has de introducir es el siguiente:</div><div><br /><div><span style="color: #0b5394; font-family: courier;">function getData(id) {</span></div><div><span style="color: #0b5394; font-family: courier;"> var spreadsheet = SpreadsheetApp.openById(id);</span></div><div><span style="color: #0b5394; font-family: courier;"> var sheet = spreadsheet.getSheets()[0];</span></div><div><span style="color: #0b5394; font-family: courier;"> var values = sheet.getDataRange().getValues();</span></div><div><span style="color: #0b5394;"><span style="font-family: courier;"> </span><span style="font-family: courier;">var headers = values.shift();</span></span></div><div><span style="color: #0b5394;"><span style="font-family: courier;"> </span><span style="font-family: courier;">var data = { data: [] };</span></span></div><div><span style="color: #0b5394; font-family: courier;"> </span></div><div><span style="color: #0b5394; font-family: courier;"> for (var i = 0; i < values.length; i++) {</span></div><div><span style="color: #0b5394; font-family: courier;"> var row = values[i];</span></div><div><span style="color: #0b5394; font-family: courier;"> var register = {};</span></div><div><span style="color: #0b5394; font-family: courier;"> for (var j = 0; j < row.length; j++) {</span></div><div><span style="color: #0b5394; font-family: courier;"> register[headers[j]] = row[j]</span></div><div><span style="color: #0b5394; font-family: courier;"> }</span></div><div><span style="color: #0b5394; font-family: courier;"> data.data.push(register);</span></div><div><span style="color: #0b5394; font-family: courier;"> }</span></div><div><span style="color: #0b5394; font-family: courier;"> </span></div><div><span style="color: #0b5394; font-family: courier;"> var json = JSON.stringify(data);</span></div><div><span style="color: #0b5394; font-family: courier;"> </span></div><div><span style="color: #0b5394; font-family: courier;">return ContentService.createTextOutput(json).setMimeType(ContentService.MimeType.JSON);</span></div><div><span style="color: #0b5394; font-family: courier;">}</span></div><div><span style="color: #0b5394;"><br /></span></div><div><span style="color: #0b5394; font-family: courier;">function doGet(request) {</span></div><div><span style="color: #0b5394; font-family: courier;"> if (request.parameter.id !== undefined){</span></div><div><span style="color: #0b5394; font-family: courier;"> return getData(request.parameter.id); </span></div><div><span style="color: #0b5394; font-family: courier;"> }else{</span></div><div><span style="color: #0b5394; font-family: courier;"> return ContentService.createTextOutput(JSON.stringify({error:"ERROR"}));</span></div><div><span style="color: #0b5394; font-family: courier;"> }</span></div><div><span style="color: #0b5394; font-family: courier;">}</span></div></div><div><br /></div><div>Aunque no es motivo de este artículo, voy a tratar de resumir el funcionamiento de este código. Consta de dos funciones, <b><span style="color: #666666;">doGet</span></b>() y <b><span style="color: #666666;">getData</span></b>()</div><div><br /></div><div>Cuando llamamos al script lo hacemos utilizando <b><span style="color: #666666;">doGet</span></b>() y le enviamos como parámetro el <b><span style="color: #666666;">id </span></b>de la hoja de cálculo. El <b><span style="color: #666666;">id </span></b>es el código que aparece en la url después de <i><u><span style="color: #2b00fe;">https://docs.google.com/spreadsheets/d/</span></u></i> hasta <i><u><span style="color: #2b00fe;">/edit#gid=0</span></u></i> cuando abrimos una hoja de cálculo en Google Sheet. Si este código está presente en la petición <b><span style="color: #666666;">https </span></b>devolverá el resultado de ejecutar la función <b><span style="color: #666666;">getData</span></b>().</div><div><br /></div><div><b><span style="color: #666666;">getData</span></b>() se encarga de abrir la hoja de cálculo y devolver un objeto que contine un array en formato JSON con el contenido de la primera hoja (0).</div></div><p style="text-align: justify;">A continuación debemos publicar el script en formato web app. Para ello, en el menú superior seleccionamos <b><span style="color: #666666;">Publicar </span></b>- <b><span style="color: #666666;">Implementar como aplicación web</span></b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihB285orzP47950kL2VUkpgRKN59tavnjjgorElGDgEtaNCd9hmFClWpa5aom7YPOOD50PLnsIXZTz0YZoT0xFZlyY5m_JWdrs5-d8DuhbS36UMrG_2dVzPCWZNVEVCJsZJIBf7HNRUJo/s920/05.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="920" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihB285orzP47950kL2VUkpgRKN59tavnjjgorElGDgEtaNCd9hmFClWpa5aom7YPOOD50PLnsIXZTz0YZoT0xFZlyY5m_JWdrs5-d8DuhbS36UMrG_2dVzPCWZNVEVCJsZJIBf7HNRUJo/w640-h286/05.jpg" width="640" /></a></div><br /><p style="text-align: justify;">En el campo <b>Who has access to the app</b> debemos seleccionar entre la diferentes opciones. Si deseas que cualquiera pueda ejecutar el script has de seleccionar <b>Anyone, even anonymous</b>.</p><p style="text-align: justify;">Durante la fase de publicación debemos autorizar la ejecución del script:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAolHppy8Msp9KPwRkOJSSwCOAZ53r4JmmeAzBnYi2f4ZBVuHppurbke_4FbcWGJEYF_xXbu2WMq6yCd1A2D200cWSUlb0ozFpq_aF5FiSg2-2Khg7YHxdxn4ZqyXQRfPC-JRR3gsNdKE/s489/06.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="396" data-original-width="489" height="324" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAolHppy8Msp9KPwRkOJSSwCOAZ53r4JmmeAzBnYi2f4ZBVuHppurbke_4FbcWGJEYF_xXbu2WMq6yCd1A2D200cWSUlb0ozFpq_aF5FiSg2-2Khg7YHxdxn4ZqyXQRfPC-JRR3gsNdKE/w400-h324/06.JPG" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn0Uc7oggWZxnEpgI78moV3rzFT6PT3Tk8ApPWlWUGEhJ0eQBLaq5_HMLYmOPMG1k5JDLL2Y6pW_pGzovlDlLBUoDbUi4B96grN4GfM6Pi7JbuPKiB_1-qukEqjyknVGq4GSV6ZH1yBOo/s1210/09.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="663" data-original-width="1210" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn0Uc7oggWZxnEpgI78moV3rzFT6PT3Tk8ApPWlWUGEhJ0eQBLaq5_HMLYmOPMG1k5JDLL2Y6pW_pGzovlDlLBUoDbUi4B96grN4GfM6Pi7JbuPKiB_1-qukEqjyknVGq4GSV6ZH1yBOo/w640-h350/09.jpg" width="640" /></a></div><br /><p style="text-align: justify;">Una vez haz hecho click en <b><span style="color: #0b5394;">Desploy</span></b>, nos aparecerá la url que debemos llamar desde nuestra web añadiendo el id de la hoja de cálculo. Por ejemplo, en mi caso sería (he ocultado parte de la url]:</p><p style="text-align: justify;"><span style="color: #0b5394;"><u>https://script.google.com/macros/s/AKfycbz********Jnw4pUUIDUU-VjrViXH7ahgqN1********EX/exec?id=[id de la hoja de cálculo]</u></span></p><div>El resultado obtenido sería:</div><div><span class="b" style="-webkit-font-smoothing: antialiased; color: #444444; font-family: monospace; font-size: 13px; font-weight: bold; white-space: pre-wrap;">{</span><span class="ell" style="-webkit-font-smoothing: antialiased; color: #444444; font-family: monospace; font-size: 13px; white-space: pre-wrap;"></span><span class="blockInner" style="-webkit-font-smoothing: antialiased; border-left: 1px dotted rgb(187, 187, 187); color: #444444; display: block; font-family: monospace; font-size: 13px; margin-left: 2px; padding-left: 24px; white-space: pre-wrap;"><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span class="e" style="-webkit-font-smoothing: antialiased; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYGBgOADE%2F3Hgw0DM4IRHgSsDFOzFInmMAQnY49ONzZRjDFiADT7dMLALiE8y4AGW6LoBAgwAuIkf%2F%2FB7O9sAAAAASUVORK5CYII%3D"); background-position: 50% 50%; background-repeat: no-repeat; display: block; height: 18px; left: -2px; opacity: 0.15; position: absolute; top: 1px; width: 20px; z-index: 5;"></span>"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">data</span>": <span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">[</span><span class="ell" style="-webkit-font-smoothing: antialiased;"></span><span class="blockInner" style="-webkit-font-smoothing: antialiased; border-left: 1px dotted rgb(187, 187, 187); display: block; margin-left: 2px; padding-left: 24px;"><span class="kvov arrElem" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span class="e" style="-webkit-font-smoothing: antialiased; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYGBgOADE%2F3Hgw0DM4IRHgSsDFOzFInmMAQnY49ONzZRjDFiADT7dMLALiE8y4AGW6LoBAgwAuIkf%2F%2FB7O9sAAAAASUVORK5CYII%3D"); background-position: 50% 50%; background-repeat: no-repeat; display: block; height: 18px; left: -2px; opacity: 0.15; position: absolute; top: 1px; width: 20px; z-index: 5;"></span><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">{</span><span class="ell" style="-webkit-font-smoothing: antialiased;"></span><span class="blockInner" style="-webkit-font-smoothing: antialiased; border-left: 1px dotted rgb(187, 187, 187); display: block; margin-left: 2px; padding-left: 24px;"><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">date</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">2021-01-07T00:00:00.000Z</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">title</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Sleep and WiFi</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">description</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">You can't use the WiFi during a Labs induced sleep. The camera is completely off to extend battery, WiFi is a significant battery drain.</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">link</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;"><a href="https://community.gopro.com/t5/GoPro-Labs/QR-codes-and-camera-disappearing-camera-not-found/m-p/922370" style="-webkit-font-smoothing: antialiased; text-decoration-line: none;">https://community.gopro.com/t5/GoPro-Labs/QR-codes-and-camera-disappearing-camera-not-found/m-p/922370</a></span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">keyword</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">WiFi</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">type</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Information</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">version</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">1.70.75</span>"</span></span></span><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">}</span>,</span><span class="kvov arrElem" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span class="e" style="-webkit-font-smoothing: antialiased; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYGBgOADE%2F3Hgw0DM4IRHgSsDFOzFInmMAQnY49ONzZRjDFiADT7dMLALiE8y4AGW6LoBAgwAuIkf%2F%2FB7O9sAAAAASUVORK5CYII%3D"); background-position: 50% 50%; background-repeat: no-repeat; display: block; height: 18px; left: -2px; opacity: 0.15; position: absolute; top: 1px; width: 20px; z-index: 5;"></span><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">{</span><span class="ell" style="-webkit-font-smoothing: antialiased;"></span><span class="blockInner" style="-webkit-font-smoothing: antialiased; border-left: 1px dotted rgb(187, 187, 187); display: block; margin-left: 2px; padding-left: 24px;"><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">date</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">2020-12-21T00:00:00.000Z</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">title</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Delayed Capture</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">description</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Is it possible to start filming for example 4 times a day for 10 minuttes? At 09:00, 12:00, 15:00 and 18:00? And the camera shut down in between? Yes. This command would do that, and repeat each day.!09:00S!600E!12:00S!600E!15:00S!600E!18:00S!600E!R</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">link</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;"><a href="https://community.gopro.com/t5/GoPro-Labs/Delayed-capture/m-p/892133" style="-webkit-font-smoothing: antialiased; text-decoration-line: none;">https://community.gopro.com/t5/GoPro-Labs/Delayed-capture/m-p/892133</a></span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">keyword</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Others</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">type</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">Information</span>"</span>,</span><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;">"<span class="k" style="-webkit-font-smoothing: antialiased; color: black;">version</span>": <span class="s" style="-webkit-font-smoothing: antialiased; color: #0b7500; overflow-wrap: break-word;">"<span style="-webkit-font-smoothing: antialiased;">1.70.75</span>"</span></span></span><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">}</span></span><span class="kvov arrElem" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">...</span></span><span class="kvov arrElem" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span style="font-weight: bold;">}</span></span></span></span></span></div><p style="text-align: justify;"><span class="blockInner" style="-webkit-font-smoothing: antialiased; border-left: 1px dotted rgb(187, 187, 187); color: #444444; display: block; font-family: monospace; font-size: 13px; margin-left: 2px; padding-left: 24px; text-align: start; white-space: pre-wrap;"><span class="kvov objProp" style="-webkit-font-smoothing: antialiased; display: block; margin-left: -20px; padding-left: 20px; position: relative;"><span class="b" style="-webkit-font-smoothing: antialiased; font-weight: bold;">]</span></span></span><span class="b" style="-webkit-font-smoothing: antialiased; color: #444444; font-family: monospace; font-size: 13px; font-weight: bold; text-align: start; white-space: pre-wrap;">}</span></p><h3 style="text-align: justify;">Código en Android</h3><p style="text-align: justify;">En android, debemos crear una estructura de datos como la de la hoja de cálculo. Para ello, creamos una nueva clase denominada TipsObjectModel:</p><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #cc7832;">public class </span>TipsObjectModel {<br /> <span style="color: #cc7832;">private </span>String <span style="color: #9876aa;">date</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">title</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">description</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">link</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">keyword</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">type</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> private </span>String <span style="color: #9876aa;">version</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"><br /></span><span style="color: #cc7832;"> public </span><span style="color: #ffc66d;">TipsObjectModel</span>(String date<span style="color: #cc7832;">, </span>String title<span style="color: #cc7832;">, </span>String description<span style="color: #cc7832;">,
</span><pre style="font-family: Consolas, monospace;"> String link<span style="color: #cc7832;">, </span>String keyword<span style="color: #cc7832;">, </span>String type<span style="color: #cc7832;">, </span>String version) {</pre> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">date </span>= date<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">title </span>= title<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">description </span>= description<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">link </span>= link<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">keyword </span>= keyword<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">type </span>= type<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> this</span>.<span style="color: #9876aa;">version </span>= version<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getDate</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">date</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setDate</span>(String date) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">date </span>= date<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getTitle</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">title</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setTitle</span>(String title) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">title </span>= title<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getDescription</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">description</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setDescription</span>(String description) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">description </span>= description<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getLink</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">link</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setLink</span>(String link) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">link </span>= link<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getKeyword</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">keyword</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setKeyword</span>(String keyword) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">keyword </span>= keyword<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getType</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">type</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setType</span>(String type) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">type </span>= type<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">getVersion</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">version</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setVersion</span>(String version) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">version </span>= version<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br />}</pre><div>A continuación, creamos la clase que contendrá el array de datos y que denominaremos <b><span style="color: #666666;">TipsDataModel</span></b>:</div><div><br /></div><div><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #cc7832;">import </span>java.util.ArrayList<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"><br /></span><span style="color: #cc7832;">public class </span>TipsDataModel {<br /><br /> ArrayList< TipsObjectModel > <span style="color: #9876aa;">data </span>= <span style="color: #cc7832;">new </span>ArrayList < TipsObjectModel > ()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"><br /></span><span style="color: #cc7832;"> public </span><span style="color: #ffc66d;">TipsDataModel</span>(ArrayList<TipsObjectModel> data) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">data </span>= data<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public </span>ArrayList<TipsObjectModel> <span style="color: #ffc66d;">getData</span>() {<br /> <span style="color: #cc7832;">return </span><span style="color: #9876aa;">data</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /><br /> <span style="color: #cc7832;">public void </span><span style="color: #ffc66d;">setData</span>(ArrayList<TipsObjectModel> data) {<br /> <span style="color: #cc7832;">this</span>.<span style="color: #9876aa;">data </span>= data<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br />}</pre></div><p style="text-align: justify;">Para deserializar el formato JSON en un objeto Java utilizaremos la biblioteca de código abierto <a href="https://github.com/google/gson" target="_blank">gson</a>. Para ello importamos dicha biblioteca:</p><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;">implementation <span style="color: #6a8759;">'com.google.code.gson:gson:2.8.6'</span><span style="color: grey;"><br /></span></pre><p style="text-align: justify;">La aplicación debe de tener acceso a internet por lo que debemos dar los permisos adecuados:<br /><br /></p><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #e8bf6a;"><uses-permission </span><span style="color: #9876aa;">android</span><span style="color: #bababa;">:name</span><span style="color: #6a8759;">="android.permission.INTERNET" </span><span style="color: #e8bf6a;">/></span><span style="color: #e8bf6a;"><br /></span></pre><p style="text-align: justify;">A continuación puedes descargar la base de datos en formato JSON. Para ello voy a utilizar el siguiente código utilizando <b style="color: #666666;">HttpURLConnection</b> que es es el cliente HTTP estándar para Android, utilizado para enviar y recibir datos a través de la web. Es una implementación concreta de URLConnection para HTTP (RFC 2616).</p><p style="text-align: justify;">Declaro el objeto <b><span style="color: #666666;">tips</span></b>:</p><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #cc7832;">private </span>TipsDataModel <span style="color: #9876aa;">tips</span><span style="color: #cc7832;">;</span></pre><p style="text-align: justify;">Llamo a la función <b><span style="color: #666666;">loadTips()</span></b></p><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #cc7832;">private void </span><span style="color: #ffc66d;">loadTips</span>() {<br /> String url = <span style="color: #6a8759;">"https://script.google.com/macros/s/.../exec?id=..."</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> new </span>DownloadJSONTips().execute(url)<span style="color: #cc7832;">;<br /></span>}<br /></pre><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: #cc7832;">private class </span>DownloadJSONTips <span style="color: #cc7832;">extends </span>AsyncTask<String<span style="color: #cc7832;">, </span>Void<span style="color: #cc7832;">, </span>String> {<br /> Exception <span style="color: #9876aa;">error</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"><br /></span><span style="color: #cc7832;"> </span><span style="color: #bbb529;">@Override<br /></span><span style="color: #bbb529;"> </span><span style="color: #cc7832;">protected </span>String <span style="color: #ffc66d;">doInBackground</span>(String... urls) {<br /> <span style="color: #cc7832;">try </span>{<br /> <span style="color: #cc7832;">return </span>downloadUrl(urls[<span style="color: #6897bb;">0</span>]<span style="color: #cc7832;">,</span><span style="color: #6a8759;">"UTF-8"</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>} <span style="color: #cc7832;">catch </span>(IOException e) {<br /> <span style="color: #9876aa;">error </span>= e<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> return </span><span style="color: #6a8759;">"ERROR"</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /> }<br /><br /> <span style="color: #bbb529;">@Override<br /></span><span style="color: #bbb529;"> </span><span style="color: #cc7832;">protected void </span><span style="color: #ffc66d;">onPostExecute</span>(String result) {<br /> <span style="color: #cc7832;">if </span>(result.equals(<span style="color: #6a8759;">"ERROR"</span>)) {<br /> Toast.<span style="font-style: italic;">makeText</span>(TipsActivity.<span style="color: #cc7832;">this,
</span><span style="color: #6a8759;"> "ERROR downloading Tips"</span><span style="color: #cc7832;">,</span>Toast.<span style="color: #9876aa; font-style: italic;">LENGTH_SHORT</span>).show()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>} <span style="color: #cc7832;">else </span>{<br /> Gson gson = <span style="color: #cc7832;">new </span>GsonBuilder().create()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> try </span>{<br /> <span style="color: #9876aa;">tips </span>= gson.fromJson(result<span style="color: #cc7832;">, </span>TipsDataModel.<span style="color: #cc7832;">class</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>showTips()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>} <span style="color: #cc7832;">catch </span>(IllegalStateException | JsonSyntaxException exception)
{<br /> Toast.<span style="font-style: italic;">makeText</span>(TipsActivity.<span style="color: #cc7832;">this,
</span><span style="color: #6a8759;"> "ERROR downloading Tips"</span><span style="color: #cc7832;">,</span>Toast.<span style="color: #9876aa; font-style: italic;">LENGTH_SHORT</span>).show()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /> }<br /> }<br />}</pre><pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: Consolas, monospace; font-size: 9,8pt;"><span style="color: grey;">//Conecta y descarga<br /></span><span style="color: #cc7832;">public </span>String <span style="color: #ffc66d;">downloadUrl</span>(String myurl<span style="color: #cc7832;">, </span>String charset) <span style="color: #cc7832;">throws </span>IOException {<br /> InputStream is = <span style="color: #cc7832;">null;<br /></span><span style="color: #cc7832;"> try </span>{<br /> URL url = <span style="color: #cc7832;">new </span>URL(myurl)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>HttpURLConnection conn = (HttpURLConnection) url.openConnection()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>conn.setReadTimeout(<span style="color: #6897bb;">20000 </span><span style="color: grey;">/* milisegundos */</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>conn.setConnectTimeout(<span style="color: #6897bb;">45000 </span><span style="color: grey;">/* milisegundos */</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>conn.setRequestMethod(<span style="color: #6a8759;">"GET"</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>conn.setDoInput(<span style="color: #cc7832;">true</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span><span style="color: grey;">// Inicia la consulta<br /></span><span style="color: grey;"> </span>conn.connect()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> int </span>response = conn.getResponseCode()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> if </span>(response != <span style="color: #6897bb;">200</span>) {<br /> <span style="color: #cc7832;">return </span><span style="color: #6a8759;">"ERROR"</span><span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>} <span style="color: #cc7832;">else </span>{<br /> is = conn.getInputStream()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span><span style="color: grey;">//Para descargar la página web completa<br /></span><span style="color: grey;"> </span>BufferedReader reader<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> if </span>(charset.equals(<span style="color: #6a8759;">"ISO-8859-1"</span>)) reader = <span style="color: #cc7832;">new
</span> BufferedReader(<span style="color: #cc7832;">new </span>InputStreamReader
(is<span style="color: #cc7832;">, </span>StandardCharsets.<span style="color: #9876aa; font-style: italic;">ISO_8859_1</span>))<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> else </span>reader = <span style="color: #cc7832;">new </span>BufferedReader
(<span style="color: #cc7832;">new </span>InputStreamReader(is<span style="color: #cc7832;">, </span>StandardCharsets.<span style="color: #9876aa; font-style: italic;">UTF_8</span>))<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>StringBuilder webPage = <span style="color: #cc7832;">new </span>StringBuilder()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>String data<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> while </span>((data = reader.readLine()) != <span style="color: #cc7832;">null</span>) {<br /> webPage.append(data).append(<span style="color: #6a8759;">"</span><span style="color: #cc7832;">\n</span><span style="color: #6a8759;">"</span>)<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /> <span style="color: #cc7832;">return </span>webPage.toString()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>} <span style="color: grey;"><br /></span><span style="color: grey;"> </span>} <span style="color: #cc7832;">finally </span>{<br /> <span style="color: #cc7832;">if </span>(is != <span style="color: #cc7832;">null</span>) {<br /> is.close()<span style="color: #cc7832;">;<br /></span><span style="color: #cc7832;"> </span>}<br /> }<br />}</pre></div></div>
<div style="text-align: justify;">Por último, en showTips() mostramos el resultado de la forma que deseemos como ListViews o RecyclerViews.</div><div><pre style="background-color: #2b2b2b; font-family: Consolas, monospace;"><span style="color: #cc7832;">private void </span><span style="color: #ffc66d;">showTips</span><span style="color: #a9b7c6;">() {<br /> Log.</span><span style="color: #a9b7c6; font-style: italic;">d</span><span style="color: #a9b7c6;">(</span><span style="color: #6a8759;">"TIPS_LOG"</span><span style="color: #cc7832;">, </span><span style="color: #a9b7c6;">String.</span><span style="color: #a9b7c6; font-style: italic;">valueOf</span><span style="color: #a9b7c6;">(</span><span style="color: #9876aa;">tips</span><span style="color: #a9b7c6;">.getData().size()))</span><span style="color: #cc7832;">;
</span><span style="color: #999999;">.....</span><span style="color: #cc7832;"><br /></span><span style="color: #a9b7c6;">}</span></pre></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-42946486090881791382020-11-07T06:00:00.004-08:002021-06-07T23:08:48.112-07:00Bajar la versión de Gradle<p style="text-align: justify;">Después de la actualización de Android Studio a versión 4.1, cada vez que abría uno de mis proyectos me recomendaba que actualizara Plugin. Yo muy obediente los actualizaba y a partir de ahí empezaban los problemas.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIGpZu4oi-X7ZJhkytiBIO_pUM9wRUOqPfvBbrj3iJVTt3lBAmyVV63grFZF58iL0YDt-gxDvjtveY4OqeL6sgwVmVCjByx_L807Myjg3SqPce1FgTOG8pQ-hLU6pUQRHpYh7jBkcblME/s338/error_07.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="60" data-original-width="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIGpZu4oi-X7ZJhkytiBIO_pUM9wRUOqPfvBbrj3iJVTt3lBAmyVV63grFZF58iL0YDt-gxDvjtveY4OqeL6sgwVmVCjByx_L807Myjg3SqPce1FgTOG8pQ-hLU6pUQRHpYh7jBkcblME/s16000/error_07.JPG" /></a></div><p style="text-align: justify;">Cada vez que ejecutaba el proyecto, aparecía el siguiente error:</p><p><span style="color: red; font-family: courier;">A problem was found with the configuration of task ':app:processDebugManifest' (type 'ProcessMultiApkApplicationManifest').</span></p><p><span style="color: red; font-family: courier;">> File 'D:\ProyectosAndroidStudio\CanariasVistaApp\app\build\intermediates\merged_manifest\debug\out\AndroidManifest.xml' specified for property 'mainMergedManifest' does not exist.</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZSTmIKDh04L1MqDMC43_F8UPUmnqgg78f7O2UIxxzOMvkfsHV87w3FQZCB8CE0dO5saEyHfwOP9q14hK4Qfh440XgfShqUrYUBa-eSZ3gDYm_7GZVrDnl4qPktGWFQ9iV5L0ivW68Gzg/s1293/error_03.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="47" data-original-width="1293" height="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZSTmIKDh04L1MqDMC43_F8UPUmnqgg78f7O2UIxxzOMvkfsHV87w3FQZCB8CE0dO5saEyHfwOP9q14hK4Qfh440XgfShqUrYUBa-eSZ3gDYm_7GZVrDnl4qPktGWFQ9iV5L0ivW68Gzg/w640-h24/error_03.JPG" width="640" /></a></div><p style="text-align: justify;"><span></span></p><a name='more'></a>Después de mucho buscar y dejar pasar una semana, he encontrado la solución en <a href="https://stackoverflow.com/questions/64333649/what-is-navigation-json-in-android-studio-4-1" rel="nofollow" target="_blank">stackoverflow</a> como no. Básicamente consiste en bajar la versión de <b>Android Gradle Plugin</b> desde la 4.1.0 a la <b>4.0.2</b> y la versión de <b>Gradle </b>desde la 6.5 a la <b>6.4.1</b><p></p><p style="text-align: justify;">Para ello, en Android Studio y para cada proyecto donde haya actualizado el Plugin, has de ir a <b>File</b> - <b>Project Structure - Project </b>y seleccionar las versiones indicadas.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtH_uqNKRwoiBaeCjvc5O1nKMlBIlewTbg30oAgOLHNIvMft1HBZpZFJ0RmJhj-9gdHlljahEXzFjDpuRi8vhdir3COPYgWQlKfPARsOU6_du2otzLKAWzvluRdPauAnQoRjlYy6L5fdg/s459/error_04.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="207" data-original-width="459" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtH_uqNKRwoiBaeCjvc5O1nKMlBIlewTbg30oAgOLHNIvMft1HBZpZFJ0RmJhj-9gdHlljahEXzFjDpuRi8vhdir3COPYgWQlKfPARsOU6_du2otzLKAWzvluRdPauAnQoRjlYy6L5fdg/s16000/error_04.JPG" /></a></div><br /><p style="text-align: justify;">Las versiones por defecto serían las siguientes:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAuzkHwOt8auOHUGiSLrF59X3KFXtcQtJv0VaVTi5vnrpCb-bHdAcO8xyA6x7gsTmRGfTfKcjfKmvh4NC8XaN4D7gEwQyC8cMJY6RhUYvIDCv1mTdzBOo15Lr0WMgNaUEz6spI6-HUGTM/s958/error_05.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="958" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAuzkHwOt8auOHUGiSLrF59X3KFXtcQtJv0VaVTi5vnrpCb-bHdAcO8xyA6x7gsTmRGfTfKcjfKmvh4NC8XaN4D7gEwQyC8cMJY6RhUYvIDCv1mTdzBOo15Lr0WMgNaUEz6spI6-HUGTM/w640-h334/error_05.JPG" width="640" /></a></div><p style="text-align: justify;">La nueva configuración sería:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPGHbJ8agJYqKdsUvqnbVzP0DupyqIECUhtrM1xtm5hJ_ET25Ap9GK4E9dyX4yI9vlzvww1s3grWrj3KlG8qeDECRLmJRO221zLHp-M7DnRhi8sM0Jz80S8WJ_3__njhiLL3xIVi9BuQ/s955/error_06.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="955" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPGHbJ8agJYqKdsUvqnbVzP0DupyqIECUhtrM1xtm5hJ_ET25Ap9GK4E9dyX4yI9vlzvww1s3grWrj3KlG8qeDECRLmJRO221zLHp-M7DnRhi8sM0Jz80S8WJ_3__njhiLL3xIVi9BuQ/w640-h334/error_06.JPG" width="640" /></a></div><p style="text-align: justify;">Hacemos click en <b><span style="color: #0b5394;">OK</span></b> y todo y despu.es de un rato todo vuelve a funcionar correctamente. Está claro que hay algún error o incompatibilidad con las nuevas versiones por lo que espero que se solucione pronto.</p><p style="text-align: justify;"><br /></p>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-8366757327530120590.post-68356348844213837642020-03-02T22:50:00.000-08:002023-12-15T13:09:23.748-08:00Publicar una app en Google Play<div style="text-align: justify;">
En este artículo voy a detallar los pasos necesarios para publicar una nueva app que hayamos desarrollado en Google Play. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhnP-Wap3XGMOyGwQx4CdH1yjgSA7EOxZ5gGdcp8RMy3BTBfBl4iuaw9pIEYOcl3XY6y6oL6jzbYNfK_vai50AH7iZxqYYCJdB0MSprmK7K_RDzSt8MoOTjn1ScM80ke4dH4RTouhvqg0/s1600/Google-Play-2-1024x530.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="530" data-original-width="1024" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhnP-Wap3XGMOyGwQx4CdH1yjgSA7EOxZ5gGdcp8RMy3BTBfBl4iuaw9pIEYOcl3XY6y6oL6jzbYNfK_vai50AH7iZxqYYCJdB0MSprmK7K_RDzSt8MoOTjn1ScM80ke4dH4RTouhvqg0/s400/Google-Play-2-1024x530.png" width="400" /></a></div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Una vez hayamos generado nuestro archivo <b><span style="color: #666666;">APK </span></b>y estemos dado de alta en Google Play, el siguiente paso es publicar la app. Este proceso puede ser un poco largo pero tienes que tomarte tiempo para realizar todos los pasos de forma adecuada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En <a href="https://developer.android.com/distribute/console?hl=es" target="_blank">Google Play Console</a> has click en <b><span style="color: #0b5394;">CREAR UNA APLICACIÓN</span></b></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLURhFsu0fwIF69xLHls_FrzVtnYWNDc0dj_U1CJKfcEALr4TzDXkal-1t1Zv-hmolGC147Us9KroWgTJZvNf6jHeIcvhcnSSotNY9nkK-wNBuaZ2z0p2YGoy9BLuNGiFuh7M7MVky_O4/s1600/publicar03.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="52" data-original-width="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLURhFsu0fwIF69xLHls_FrzVtnYWNDc0dj_U1CJKfcEALr4TzDXkal-1t1Zv-hmolGC147Us9KroWgTJZvNf6jHeIcvhcnSSotNY9nkK-wNBuaZ2z0p2YGoy9BLuNGiFuh7M7MVky_O4/s1600/publicar03.JPG" /></a></div>
<br />
<div style="text-align: justify;">
Te pedirá el <span style="color: #666666;"><b>Idioma predeterminado</b></span>, el <b><span style="color: #666666;">Título de la app</span></b> y debes seleccionar si en una aplicación o un juego y si es gratis o de pago. También debes aceptar algunos términos y condiciones:</div><div style="text-align: justify;"><ul><li>Políticas del Programa para Desarrolladores</li><li>Firma de aplicaciones de Play</li><li>Leyes de exportación de EE.UU.</li></ul></div><div style="text-align: justify;">Por último, haces click en <b><span style="color: #0b5394;">Crear Aplicación</span></b>.</div><div style="text-align: justify;">
<br />
A continuación deberás cumplimentar varios cuestionarios. Empezamos por la <b><span style="color: #666666;">Ficha de Play Store</span></b> rellenando todos los campos que solicitan como una descripción breve de tu aplicación y una descripción completa, añadir los recursos gráficos como el icono de tu aplicación, capturas de pantalla, etc y, por último, debes categorizar tu aplicación (en cada una de estas secciones podrás consultar una ayuda con la información necesaria)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es importante añadir capturas de pantalla de todas los dispositivos en el que tu app es compatible como teléfonos, tablets de 7 y 10 pulgadas, etc. De esta forma, tu app se mostrará en más dispositivos cuando el usuario la busque en Google Play.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Znr4RT0Kdj84CNJxB-dq0wC0k4Emnu9oCoiYl-pgLgU9B0_o-6bfeBLIkloclcYWwTmca7hcAoF6k4rtJmHZlTfJft-aeFF6RK4Fuq-D_FSOBlaMLOtTcWMS2Ld0ajyB3pepEIvxJXM/s1600/publicar04.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="319" data-original-width="940" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Znr4RT0Kdj84CNJxB-dq0wC0k4Emnu9oCoiYl-pgLgU9B0_o-6bfeBLIkloclcYWwTmca7hcAoF6k4rtJmHZlTfJft-aeFF6RK4Fuq-D_FSOBlaMLOtTcWMS2Ld0ajyB3pepEIvxJXM/s640/publicar04.JPG" width="640" /></a></div>
<div style="text-align: justify;">
<br />
Si utilizamos algunos permisos en nuestra App como el de <b><span style="color: #666666;">CAMERA</span></b>, debemos indicar una página Web donde se muestra nuestra política de privacidad y en tu app mostrar un enlace a dicha página. Si quieres ver un ejemplo puedes ver está <a href="https://janubio.com/bitcointools/privacy.html" target="_blank">página</a>.<br />
<br />
Luego debemos clasificar nuestra App. Para ello, nos vamos al menú lateral <b><span style="color: #666666;">Clasificación de Contenido</span></b> y respondemos a todas las preguntas que Google nos hace para clasificar nuestra App. Hacemos click en <b><span style="color: #0b5394;">CALCULAR CLASIFICACIÓN</span></b> y nos muestra la clasificación realizada por Google. Por último, haces click en <b><span style="color: #0b5394;">APLICAR CLASIFICACIÓN</span></b>.<br />
<br />
También tenemos que indicar un precio a nuestra App. Para ello, seleccionamos en el menú lateral <b><span style="color: #666666;">Precio y distribución</span></b>. Tenemos que indicar si nuestra app va a ser de pago o gratis. Para publicar aplicaciones de pago, debes configurar una <a href="javascript:" target="_blank">cuenta de vendedor</a>. Más información en este <a href="https://support.google.com/googleplay/android-developer/#topic=3452890" target="_blank">enlace</a>. También puedes seleccionar aquellos países para los que tu app estará disponible y por último indicamos si contiene o no anuncios.<br />
<br />
Es obligatorio indicar que cumple las <b><span style="color: #666666;">Directrices de contenido de Android</span></b> y aceptar las <b><span style="color: #666666;">Leyes de exportación de EEUU</span></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7a5qqxEDcqAUDOoiyxSM9DV1BQnV9C4swgyJqcjaBmb5FP0dnqPeO9Pfs1PsfCD1EwTbKKPyrAC5yw7YwUxXFDr7t41c0C2x5EBpdwdeoPd7pHn1c5wZIbHwn_tMWaV9MyKiw7slxc9Q/s1600/publicar19.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="941" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7a5qqxEDcqAUDOoiyxSM9DV1BQnV9C4swgyJqcjaBmb5FP0dnqPeO9Pfs1PsfCD1EwTbKKPyrAC5yw7YwUxXFDr7t41c0C2x5EBpdwdeoPd7pHn1c5wZIbHwn_tMWaV9MyKiw7slxc9Q/s640/publicar19.JPG" width="640" /></a></div>
<br />
<br />
Otra ficha que hay que rellenar está relacionada con la audiencia objetivo de tu app. Para ello, haces click en el menú lateral <b><span style="color: #666666;">Contenido de la aplicación -</span></b> <span style="color: #0b5394;"><b>EMPEZAR</b></span>. Cuanto menos restrictivo es tu audiencia objetiva más controles tendrás que pasar y más normas tendrás que cumplir.<br />
<br /></div>
<div style="text-align: justify;">
Una vez hayamos cumplimentado estas fichas y cuestionarios, debemos ir al menú <b><span style="color: #666666;">Versiones de la aplicación</span></b> - <b><span style="color: #666666;">Segmento de pruebas internas</span></b> - <b><span style="color: #0b5394;">GESTIONAR</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<br />
Yo normalmente primero publico la aplicación en la sección de <b><span style="color: #666666;">Pruebas Internas</span></b> del menú <span style="color: #666666; font-weight: bold;">Versiones de la aplicación </span>en <b><span style="color: #666666;">Gestión de Versiones</span></b>.<br />
<br />
Lo siguiente es crear un grupo de amigos que te ayuden a depurar la app. Para ello, en la sección <b><span style="color: #666666;">Gestionar testers </span></b>haces click en <b><span style="color: #0b5394;">CREAR LISTA</span></b> o seleccionas una ya creada anteriormente para otra app. Tendrás que añadir las direcciones de correo electrónico de los usuarios que te ayudarán a probar la app (debe ser el correo con el que registraron su dispositivo en google). A continuación haces click en <b><span style="color: #0b5394;">GUARDAR</span></b>.<br />
<br /></div>
<div style="text-align: justify;">
Google Play Console te da la oportunidad de realizar una prueba de tu app antes de publicarla. con ello, consigues que la app pase un filtro de Google en busca de errores antes de hacerla pública. Haz click en <b><span style="color: #0b5394;">CREAR VERSIÓN</span></b>.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW-6-5wawlIwQGR8BDPgPSTYOUdCOv6IdurCXbzPYdQWivTRbUhCRRkZ7OFuDoVfmIwPGaRwS2ktFquH9oEopp6MItBjn-XtwiVR4nl2hgi6Yk4K8k-kLWvU5FLLdAKUz7PF1uvavfFJI/s1600/publicar05.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="550" data-original-width="983" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW-6-5wawlIwQGR8BDPgPSTYOUdCOv6IdurCXbzPYdQWivTRbUhCRRkZ7OFuDoVfmIwPGaRwS2ktFquH9oEopp6MItBjn-XtwiVR4nl2hgi6Yk4K8k-kLWvU5FLLdAKUz7PF1uvavfFJI/s640/publicar05.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se nos muestra una pantalla que nos posibilita que Google gestione la clave de firma de la app. Esto es necesario cuando has generado una Android App Bundle pero como no es el caso hago click en <b><span style="color: #666666;">INHABILITAR</span></b> y posteriormente en <span style="color: #0b5394;"><b>CONFIRMAR</b></span>. Si más adelante quiero usar esa opción podré hacerlo en la página <b><span style="color: #666666;">Firma de aplicaciones de Play Console</span></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD_PVZ6zJsAAxDhHuOQijAS7yMrY9ybnOY2S8QHdI5sOohiV0cvDzRQT8byyq2X4VNSVsFylZe1mrjx-zlVfyhMPkhJtWM0SUWnHYIpbsMRAF8pLiXhmD-BxammVKkd26gwGFQr5yzPGU/s1600/publicar15.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="257" data-original-width="947" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD_PVZ6zJsAAxDhHuOQijAS7yMrY9ybnOY2S8QHdI5sOohiV0cvDzRQT8byyq2X4VNSVsFylZe1mrjx-zlVfyhMPkhJtWM0SUWnHYIpbsMRAF8pLiXhmD-BxammVKkd26gwGFQr5yzPGU/s640/publicar15.JPG" width="640" /></a></div>
<br /></div>
<div style="text-align: justify;">
A continuación, arrastra tu fichero <b><span style="color: #666666;">APK </span></b>o selecciónalo haciendo click en <b><span style="color: #666666;">EXAMINAR ARCHIVOS</span></b>.<br />
<br />
Una vez el archivo se ha cargado puedes rellenar la versión de la App así como una descripción de las novedades de la misma (si es la primera versión pues lo indicas y listo). Haces click en <b><span style="color: #0b5394;">GUARDAR </span></b>y a continuación <b><span style="color: #0b5394;">REVISAR</span></b>.<br />
<br />
Después de unos segundo se mostrará un informe con la revisión efectuada:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwj1i7SDEc5ROvToLnhwCYRFy-GLJpmj-7gqoE8WMUIgkohCsDm2tLpg_l9xLpTbAbBNeZuzFh7Ka1OWPtvCI-EBMpe-yX-Q9MsZWSATr1BqG-d9FeCpfSAQj9QzefuabzNFo0I91Tk4/s1600/publicar16.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="377" data-original-width="944" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwj1i7SDEc5ROvToLnhwCYRFy-GLJpmj-7gqoE8WMUIgkohCsDm2tLpg_l9xLpTbAbBNeZuzFh7Ka1OWPtvCI-EBMpe-yX-Q9MsZWSATr1BqG-d9FeCpfSAQj9QzefuabzNFo0I91Tk4/s640/publicar16.JPG" width="640" /></a></div>
<br />
Si te aparecen <b><span style="color: #666666;">Errores </span></b>no podrás publicar la App. Haz click en <b><span style="color: #0b5394;">VER MENSAJES DE ERROR</span></b> para ver los errores y corrígelos. Algunos errores muy típicos es que si utilizas algún tipo de permiso como es el de la <b><span style="color: #666666;">CAMERA</span></b> tengas que incluir una política de privacidad como expliqué anteriormente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLWZcOi54RVAJBXWH1b4rsa9RFL7Z4n0fddtijvoNK448gmNrZ2A3SR1YmGHbyC9t3LUI8Jo5x7AB2TN_3VCHcP-xkTUVo6LzxBPlrExcp56CT0lXlX97-BtLS9RavODD1JcP4uIxgZZc/s1600/publicar17.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="595" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLWZcOi54RVAJBXWH1b4rsa9RFL7Z4n0fddtijvoNK448gmNrZ2A3SR1YmGHbyC9t3LUI8Jo5x7AB2TN_3VCHcP-xkTUVo6LzxBPlrExcp56CT0lXlX97-BtLS9RavODD1JcP4uIxgZZc/s1600/publicar17.JPG" /></a></div>
Un vez corregidos todos los Errores/Advertencias, podemos <b><span style="color: #0b5394;">INICIAR LANZAMIENTO A PRUEBA INTERNA</span></b>.<br />
<br />
La revisión por parte de Google puede demorarse por unas horas. Para ver los resultados, en el menú lateral seleccionamos <b><span style="color: #666666;">Gestión de versiones</span></b> - <b><span style="color: #666666;">Informe previo al lanzamiento</span></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJWDvQhMVIdzG30CRSyg5uH2i1l6sVSB4QF79E0CTPcm41a7zZMxUyKWgEBolTQKhs24f0CKaDhG07EJVg08Iq-PFABsBqWMCkywxoE1DygdN-npwx76c2LSVvHoF2k2o0d88fYTcJi7I/s1600/publicar20.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="422" data-original-width="976" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJWDvQhMVIdzG30CRSyg5uH2i1l6sVSB4QF79E0CTPcm41a7zZMxUyKWgEBolTQKhs24f0CKaDhG07EJVg08Iq-PFABsBqWMCkywxoE1DygdN-npwx76c2LSVvHoF2k2o0d88fYTcJi7I/s640/publicar20.JPG" width="640" /></a></div>
<br />
Como se puede apreciar en la imagen anterior, pueden producirse:<br />
<ul>
<li><b>Errores</b>: problemas que generan un cuelgue de la app</li>
<li><b>Advertencias</b>: Son problemas relacionados con APIs o problemas de accesibilidad principalmente como tamaños de los componentes, etc.</li>
<li><b>Problemas menores</b>: Relacionados principalmente con problemas de accesibilidad como bajos contrastes con el fondo, etc.</li>
</ul>
Mi consejo es que, una vez solucionados los problemas detectados, vuelva a subir una nueva versión de la app cambiando el <b><span style="color: #666666;">versioncode </span></b>y repita cuantas veces sea necesaria esta operación. Tenga en cuenta que no siempre las pruebas que realiza Google detectan todos los problemas a la primera así que mientra detecte problemas graves no pase la app a producción.<br />
<br />
Esta misma operación se puede realizar en diferentes fases:<br />
<br />
<ul>
<li><b>Alfa</b>: si quieres que tu aplicación esté disponible para hacer pruebas cerradas.</li>
<li><b>Beta</b>: si quieres que tu aplicación esté disponible para hacer pruebas abiertas.</li>
</ul>
<br />
Yo, particularmente, después de realizar las pruebas internas, lo publico en Google Play. Para ello ,en <b><span style="color: #666666;">Segmento de producción</span></b> - <b><span style="color: #0b5394;">GESTIONAR </span></b>nos vamos a <b><span style="color: #0b5394;">CREAR VERSIÓN</span></b> y añadimos la <b><span style="color: #666666;">APK </span></b>arrastrando el fichero o, si utilizamos la última versión utilizada en la prueba interna, podemos hacerlo desde <b><span style="color: #666666;">AÑADIR DE LA BIBLIOTECA</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5eVD0pL8ID7vn4e9eudx_VdlBjV8J5t90KxL0jI1X1rNBZm494OS2G0kw7eG71yMkv90CTgVWosOpKSXutN_y6_sbOd4fhGWup_wxNCRTNIrMfD48cfqfIH-KSqRMBUNNhRdKspgsy9s/s1600/publicar21.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="306" data-original-width="979" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5eVD0pL8ID7vn4e9eudx_VdlBjV8J5t90KxL0jI1X1rNBZm494OS2G0kw7eG71yMkv90CTgVWosOpKSXutN_y6_sbOd4fhGWup_wxNCRTNIrMfD48cfqfIH-KSqRMBUNNhRdKspgsy9s/s640/publicar21.JPG" width="640" /></a></div>
<br />
Por último, como en el caso anterior, rellenamos las <b><span style="color: #666666;">Novedades de esta versión</span></b> o <b><span style="color: #666666;">COPIAR DE LA VERSIÓN ANTERIOR</span></b> y <b><span style="color: #0b5394;">GUARDAR</span></b> - <b><span style="color: #0b5394;">REVISAR </span></b>- <b><span style="color: #0b5394;">INICIAR LANZAMIENTO A PRODUCCIÓN</span></b> - <b><span style="color: #0b5394;">CONFIRMAR</span></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLUjP0AhR25IJVqCrvLsCuV4CIUsLpCFsRR4dhBo-jOQfsfCTj398kWGF8H7g2Hof_uabioxhZzKuVyWJIz69dY6hjW7yEB2RSXZQJQQ25cdJ7Qua52R7YP0j3-UgN-oXCxm4FxDro3dw/s1600/publicar22.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="147" data-original-width="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLUjP0AhR25IJVqCrvLsCuV4CIUsLpCFsRR4dhBo-jOQfsfCTj398kWGF8H7g2Hof_uabioxhZzKuVyWJIz69dY6hjW7yEB2RSXZQJQQ25cdJ7Qua52R7YP0j3-UgN-oXCxm4FxDro3dw/s1600/publicar22.JPG" /></a></div>
<br />
Después de unos segundos nos indique que nuestra App está en fase de ser publicada. Ahora solo queda esperar un poco (a veces un mucho) para que tu app esté disponible en Google Play.<br />
<br />
Cuando finaliza el proceso, se muestra una notificación en Google Play Console<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixKDuxBt_IMGh4XXxaQRQNElfP21E6qscnMz12AJ0YhHY7nP1kOeSkIe4-5xk5qjS66rsDeVJnhpXVSTxFE15wlADdY5zdAdKODqfk1kpn9FpXJ5RP5TcWZv9ukylz0fU82OlMq1c92iA/s1600/publicar23.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="242" data-original-width="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixKDuxBt_IMGh4XXxaQRQNElfP21E6qscnMz12AJ0YhHY7nP1kOeSkIe4-5xk5qjS66rsDeVJnhpXVSTxFE15wlADdY5zdAdKODqfk1kpn9FpXJ5RP5TcWZv9ukylz0fU82OlMq1c92iA/s1600/publicar23.JPG" /></a></div>
<br />
Por último, haciendo click en <span style="color: #0b5394;"><b>VER EN GOOGLE PLAY</b></span> nos lleva a la página de Google Play de nuestra App.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxpGfSl55y7wZVJ45bjfNlr8o0xpovCKIYkc1fc0P43ubC8itntqrTYCCIfYSyhNWc_RTXDkONwi4MyqNNfs4F1_j2wru6IajKuiJNfCh2tW1MZ4CceJtBfenGMx1WzxlycjBPVdFKxJQ/s1600/publicar24.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="570" data-original-width="702" height="518" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxpGfSl55y7wZVJ45bjfNlr8o0xpovCKIYkc1fc0P43ubC8itntqrTYCCIfYSyhNWc_RTXDkONwi4MyqNNfs4F1_j2wru6IajKuiJNfCh2tW1MZ4CceJtBfenGMx1WzxlycjBPVdFKxJQ/s640/publicar24.JPG" width="640" /></a></div>
<br />
Espero que esta información te ayude a la hora de publicar tus aplicaciones en Google Play.<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-25892328869712582632020-02-29T04:56:00.002-08:002020-02-29T04:56:45.991-08:00Generar APK para su publicación<div style="text-align: justify;">
En este artículo voy a detallar los pasos a seguir para obtener el fichero <b><span style="color: #666666;">APK </span></b>necesario para publicar una app en Google Play</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La <a href="https://es.wikipedia.org/wiki/APK_(formato)" target="_blank">Wikipedia </a>explica muy bien que es un archivo con extensión .apk (Android Application Package, significado en español: Paquete de Aplicación Android). Este formato es una variante del formato JAR de Java y se usa para distribuir e instalar componentes empaquetados para la plataforma Android.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFwGVFcnJx5r_opkdnDJJaTZ1fTsPAOAMUDSH7Tdp-SAj_b759zoGmyzn4uRbm_DxlgnWbY0eGyWPOSx4fpwucEQsgWdIm61Lmg71HSSboPRPqwSY2yVmOB_Heo1yLu2B31gOVpifzNs0/s1600/199930-que-es-apk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="677" data-original-width="1200" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFwGVFcnJx5r_opkdnDJJaTZ1fTsPAOAMUDSH7Tdp-SAj_b759zoGmyzn4uRbm_DxlgnWbY0eGyWPOSx4fpwucEQsgWdIm61Lmg71HSSboPRPqwSY2yVmOB_Heo1yLu2B31gOVpifzNs0/s640/199930-que-es-apk.jpg" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
Antes de hacerlo, voy a daros un consejo previo a la publicación de la app y es muy importante que los tengas en cuenta ya que el éxito de una app depende en gran medida de que los usuarios tengan una buena experiencia desde el principio. Si publicas una versión que no tenga unos mínimos de calidad y te dices aquello de que ya la iras mejorando en próximas versiones, los usuarios que se la descarguen inicialmente tendrán una mala experiencia y lo más probable es que no te den una segunda oportunidad.<br />
<br />
<div>
<b>Probar la app en varios dispositivos, incluyendo móviles y tablets con distintas resoluciones, tamaños de pantalla, versiones de android, etc. </b>Dada la gran diversidad de dispositivos android es complicado ajustar los elementos gráficos de la app a la primera. Además, si deseas que tenga una gran cantidad de público objetivo ha de ser compatible con una gran cantidad de versiones de Android por lo que tendrás que realizar pruebas de compatibilidades con cada una de ellas. Por experiencia, lo que va bien en algunas versiones es posible que no vaya tan bien en versiones anteriores o superiores.</div>
<div>
<br /></div>
<div>
Una vez hayas comprobado que tu app funciona correctamente llega la hora de generar el archivo <b><span style="color: #666666;">APK</span></b>. Para ello, lo primero que tienes que hacer es poner Android Studio en modo <b><span style="color: #666666;">release</span></b>. Para ello, en el lateral izquierdo de Android Studio haz click en <b><span style="color: #666666;">Build Variants</span></b> y selecciona <b><span style="color: #666666;">release</span></b>.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRWsH4B6hWeQCK5sU0Umu4IXdq7WfSXWbWV05CssUEpprjfKGdtN3qmX8RA-rUiskwl3NvMx2XyqdzVuBNk0gvKb0mSfd5BFvpPxBZSF-l4F-VeR0iz6SLRQzbsmDy_KiIv1eiTRv8XRc/s1600/publicar07.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="166" data-original-width="456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRWsH4B6hWeQCK5sU0Umu4IXdq7WfSXWbWV05CssUEpprjfKGdtN3qmX8RA-rUiskwl3NvMx2XyqdzVuBNk0gvKb0mSfd5BFvpPxBZSF-l4F-VeR0iz6SLRQzbsmDy_KiIv1eiTRv8XRc/s1600/publicar07.JPG" /></a></div>
<div>
<br /></div>
<div>
Transcurridos unos segundos ya podrás continuar con el siguiente paso que es generar el <b><span style="color: #666666;">APK</span></b>. Para ello haz click en Menú - <b><span style="color: #666666;">Build</span></b> - <b><span style="color: #666666;">Generate Signed Bundle/APK</span></b> </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9pXGxtmAcUd9JCNlz8_mO503LDCnSjYEpK15OTsXkmjRpDTCY2nkqkUUReJzN0kSrspXIXV445iJQnNedcgkh__YDoDj5thJb0asZ1yNCKLmGkAKlX8M1ZiTEHH3jcE7AzyUxMz-3gHQ/s1600/publicar11.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="401" data-original-width="608" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9pXGxtmAcUd9JCNlz8_mO503LDCnSjYEpK15OTsXkmjRpDTCY2nkqkUUReJzN0kSrspXIXV445iJQnNedcgkh__YDoDj5thJb0asZ1yNCKLmGkAKlX8M1ZiTEHH3jcE7AzyUxMz-3gHQ/s640/publicar11.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
Google recomienda generar una <b><span style="color: #666666;">Android App Bundle</span></b> pero yo, en este artículo, voy a generar una <b><span style="color: #666666;">APK</span></b> clásica así que seleccionamos esa opción y <b><span style="color: #0b5394;">Next</span></b>. Se nos abrirá una nueva ventana donde tendremos que rellenar una serie de campos.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiakPPB_G8qf_N8NJMT7q9kKksuzxu4zkwx7Y4BDDnp1Wkek9ilIIziEDCmgBT1NZOCuekWQd5GIyJR9pYRGRFkdFpWuEDaQC0WjkNTTDSY-aoZu1dDMDU9SmEYXtioyQ5TzV3R8k9FBI8/s1600/publicar12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="401" data-original-width="608" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiakPPB_G8qf_N8NJMT7q9kKksuzxu4zkwx7Y4BDDnp1Wkek9ilIIziEDCmgBT1NZOCuekWQd5GIyJR9pYRGRFkdFpWuEDaQC0WjkNTTDSY-aoZu1dDMDU9SmEYXtioyQ5TzV3R8k9FBI8/s1600/publicar12.JPG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
Como estoy generando una nueva app hacemos click en <b><span style="color: #666666;">Create new...</span></b> y nos aparece la siguiente ventana:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7Pzch6Y6eS742TTZHORj_djB77sQfj7MMWVaYc-1fqzLE3XXwdOuSeaSCuWf-2eIBEOO4K7Ir31LBZ6yrLEWPBwKvUUk7-Ai-1Zp4QcP_K7w6bV57M_1VSrEf53l93jl_skDgOOSwXVI/s1600/publicar10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="531" data-original-width="503" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7Pzch6Y6eS742TTZHORj_djB77sQfj7MMWVaYc-1fqzLE3XXwdOuSeaSCuWf-2eIBEOO4K7Ir31LBZ6yrLEWPBwKvUUk7-Ai-1Zp4QcP_K7w6bV57M_1VSrEf53l93jl_skDgOOSwXVI/s1600/publicar10.JPG" /></a></div>
<div>
<br /></div>
<div>
El significado de cada campo es el siguiente:</div>
<div>
<ul>
<li><b>Key store path</b>: Elegimos la ruta donde se va a guardar la llave y el nombre del fichero (se le añade la extensión .jks)</li>
<li><b>Password</b>: el password de la llave (al menos 6 caracteres)</li>
<li><b>Alias</b>: un alias con el que nos identificamos</li>
<li><b>Password</b>: es el password del alias (algunos dicen que no se recomienda que sea el mismo que el anterior)(al menos 6 caracteres)</li>
<li><b>Validity (years)</b>: los años en los que la llave será válida (99 por ejemplo).</li>
<li><b>First and Last Name</b>: Nombre y apellidos</li>
<li><b>Organization Unit</b>: Puesto de trabajo en tu empresa</li>
<li><b>Organization</b>: Nombre de la empresa</li>
<li><b>City or Locality</b>: Ciudad</li>
<li><b>State or province</b>: Provincia</li>
<li><b>Country Code (XX)</b>: ES (para España)</li>
</ul>
</div>
<div>
Después de rellenar todos los campos, hacemos click en <b><span style="color: #0b5394;">OK </span></b>y volvemos a la pantalla anterior pero con los campos ya rellenos. Si teienes varias firmas distintas no es aconsejable marcar la opción <b><span style="color: #666666;">Remember passwords</span></b>. Hacemos click en <b><span style="color: #0b5394;">NEXT </span></b>y se nos muestra la última ventana:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsRy0s6CVGwwAT1hkGQUH4fDv1_BAnWAxC53OXAKwWL0bixo_sF9lKKk1dCZ5pwvV3uqP-wXhvyftBhLkYtdD5V3kI_tCILyweqnu8RZF-rP6QjSukXMg8Ai9DLJ6dr8GbRu5iT1S5xsI/s1600/publicar13.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="401" data-original-width="492" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsRy0s6CVGwwAT1hkGQUH4fDv1_BAnWAxC53OXAKwWL0bixo_sF9lKKk1dCZ5pwvV3uqP-wXhvyftBhLkYtdD5V3kI_tCILyweqnu8RZF-rP6QjSukXMg8Ai9DLJ6dr8GbRu5iT1S5xsI/s1600/publicar13.JPG" /></a></div>
<br />
Marcamos <b><span style="color: #666666;">release</span> </b>y, en este ocasión, la opción <b><span style="color: #666666;">V1 (Jar Signature)</span></b> que es la opción más clásica. Por último, hacemos click en <b><span style="color: #0b5394;">Finish </span></b>y esperamos unos segundos a que se genere nuestro fichero <b><span style="color: #666666;">APK</span></b>.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si todo ha ido bien, se nos mostrará un aviso y si hacemos click en <b><span style="color: #0b5394;">locate</span></b> se nos abrirá una ventana del explorador en la carteta donde se ha guardo nuestro fichero <b><span style="color: #666666;">APK</span></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi11ddZ14tlR4BmFxet25-jdHUbH-tJn7-m4q0d5oYTWi4NSO-rdkGaGdm3RhKEJkCAbWgtOpves9oOkr8kad2J7fj6WZZPkixDOf9tZADVsG_tzd4_AUPFx2DWgdZBA8A_OYZKjxEP268/s1600/publicar14.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="173" data-original-width="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi11ddZ14tlR4BmFxet25-jdHUbH-tJn7-m4q0d5oYTWi4NSO-rdkGaGdm3RhKEJkCAbWgtOpves9oOkr8kad2J7fj6WZZPkixDOf9tZADVsG_tzd4_AUPFx2DWgdZBA8A_OYZKjxEP268/s1600/publicar14.JPG" /></a></div>
<br /></div>
<div style="text-align: justify;">
Listo, ya tenemos nuestro fichero <span style="color: #666666;"><b>app-release.apk </b></span>listo para publicarse en Google Play Store.<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-17004481570732112192019-09-21T09:15:00.002-07:002023-04-10T12:33:00.666-07:00Error: Lint found fatal errors while assembling a release target<div style="text-align: justify;">
Hoy me he llevado la desagradable sorpresa de que al generar el fichero apk de una de mis aplicaciones, me apareció el siguiente error:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEQmsqzJgFWwnj3Qho7E1u8XEByCGBQdAgXcLO9x2BJNQfSq-3Jk3Gt0XsXHU-Djvhc6uwZz2uHD8c52bYosY3KF77tkwwZHKWIQWam1yNEHRdrSQGVLN1XyB3oAVa4PY7JGcS3FSTJqA/s1600/error_01.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="425" data-original-width="821" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEQmsqzJgFWwnj3Qho7E1u8XEByCGBQdAgXcLO9x2BJNQfSq-3Jk3Gt0XsXHU-Djvhc6uwZz2uHD8c52bYosY3KF77tkwwZHKWIQWam1yNEHRdrSQGVLN1XyB3oAVa4PY7JGcS3FSTJqA/s640/error_01.JPG" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Android Studio recomienda desabilitar ciertas comprobaciones pero eso no me parece del todo correcto. Lo que hay que hacer es buscar la causa del error y corregirlo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
He estado investigando un poco y, para conocer la causa del error, hay que ir a la carpeta nombre_de_la_app\app\build\reports y nos encontraremos con dos ficheros:</div>
<div style="text-align: justify;">
</div>
<ul>
<li>lint-results-release-fatal.html</li>
<li>lint-results-release-fatal.xml</li>
</ul>
<br />
<div style="text-align: justify;">
Abriendo el primer fichero descubro la causa del error:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUaoB_zWxvg-i2sc-xInBBUES_hvL7yzF-TTTvPwXNQ9k5uMAwgulYqPhjDtyPH_1uvTpwPsSvD797fub46My73L8Vk-1i-spCN3G_8qaVAwJcBby9ZdzDCNzLNUzeiQLOgyYN8dP5cQw/s1600/error_02.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="268" data-original-width="849" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUaoB_zWxvg-i2sc-xInBBUES_hvL7yzF-TTTvPwXNQ9k5uMAwgulYqPhjDtyPH_1uvTpwPsSvD797fub46My73L8Vk-1i-spCN3G_8qaVAwJcBby9ZdzDCNzLNUzeiQLOgyYN8dP5cQw/s640/error_02.JPG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
Ahora solo me queda corregir este error y se genera correctamente la app.<div><br /></div><div><b>10/04/2023</b>: Otra forma de obtener el error<br /><a href="https://stackoverflow.com/questions/49286268/error-execution-failed-for-task-app-lintvitalrelease-any-one-can-solve-it">https://stackoverflow.com/questions/49286268/error-execution-failed-for-task-app-lintvitalrelease-any-one-can-solve-it</a></div><div><br />
<br />
<br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-22329178374354188252019-06-02T02:14:00.000-07:002019-06-02T02:14:07.049-07:00Configura el Logcat<div style="text-align: justify;">
En esta entrada del blog voy a ver un par de trucos para optimizar el uso de Logcat.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Haz click en el menú <b><span style="color: #666666;">Run </span></b>- <b><span style="color: #666666;">Edit Configurations...</span></b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjm3kYlpq455rlkHYfAKVwurLUVeLKFGtzXPeJxgX1Da6nnbKIzx99tFfrxlf7yS4TQoEkWT1LaZrIGFcnPTmqhXjDSphdWXcaJdWN1K4XZnBp0s52L8-LHknC6qmQ__CWZKlXwyhifTI/s1600/logcat01.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="298" data-original-width="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjm3kYlpq455rlkHYfAKVwurLUVeLKFGtzXPeJxgX1Da6nnbKIzx99tFfrxlf7yS4TQoEkWT1LaZrIGFcnPTmqhXjDSphdWXcaJdWN1K4XZnBp0s52L8-LHknC6qmQ__CWZKlXwyhifTI/s1600/logcat01.JPG" /></a></div>
<br />
<div style="text-align: justify;">
Para borrar el logcat cada vez que ejecutamos la aplicación, debemos ir a <b><span style="color: #666666;">Android App</span> </b>- <b><span style="color: #666666;">app </span></b>- <b><span style="color: #666666;">Miscellaneous </span></b>- <b><span style="color: #666666;">Logcat</span></b> y marca el check <b><span style="color: #666666;">Clear log before launch.</span></b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRh6cMg8FZBeTW8QsGDRCgEvgorM2srkV95jXpeV2Ylt3YB1xELFsPdAXsHzzBJR9GeUhb5XlQkh_O4i7FhVgmAbq6s2_4yQCzt2Moza_x5nq0KMXQXU0-6utWEzLmWvNY3NdBkwL20Oo/s1600/logcat03.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="695" data-original-width="1078" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRh6cMg8FZBeTW8QsGDRCgEvgorM2srkV95jXpeV2Ylt3YB1xELFsPdAXsHzzBJR9GeUhb5XlQkh_O4i7FhVgmAbq6s2_4yQCzt2Moza_x5nq0KMXQXU0-6utWEzLmWvNY3NdBkwL20Oo/s640/logcat03.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
Otra opción disponible es que se muestre la ventana de Logcat automáticamente cuando se ejecuta la aplicación. Para ello solo tenemos que marcar el check <b><span style="color: #666666;">Show logcat automatically</span></b> en la misma ventana de configuración anterior.</div>
<div style="text-align: justify;">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-64404293804387238982018-09-29T02:04:00.001-07:002018-09-29T02:07:04.838-07:00Violation of Usage of Android Advertising ID policy and section 4.8 of the Developer Distribution Agreement<div style="text-align: justify;">
Ayer recibí un correo de Google (Notification from Google Play about...) en el que me informaban que mi aplicación había sido retirada de Google Play Store por violar sus normas de publicación de aplicaciones o algo así (Issue: Violation of Usage of Android Advertising ID policy and section 4.8 of the Developer Distribution Agreement)</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibyyghgOXzafEqMHHHqdGV9PKXw7LsaH1c69VQI2JKeaAIhd9a4A1vQrZDHh_MiiMZx9aIb8d5suPqAj53mZjbzcls-o4Lesg3pBegXSi3Lm17M7WAdTy1Xvjon-oLEt04ulkMkiXmqrs/s1600/privacidad03.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="278" data-original-width="979" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibyyghgOXzafEqMHHHqdGV9PKXw7LsaH1c69VQI2JKeaAIhd9a4A1vQrZDHh_MiiMZx9aIb8d5suPqAj53mZjbzcls-o4Lesg3pBegXSi3Lm17M7WAdTy1Xvjon-oLEt04ulkMkiXmqrs/s640/privacidad03.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: justify;">
<a name='more'></a>Después de comprobar que realmente estos <b><span style="color: #666666;">&%·%/()/%··</span></b> sin previo aviso habían eliminado mi aplicación de Google Play, me puse a investigar como solucionarlo porque los enlaces que google indica en su notificación no me ayudaron mucho.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pude averiguar que básicamente, lo que necesitamos es generar una página web con nuestra política de privacidad con respecto a los datos que obtenemos de los usuarios de la aplicación y publicarla en internet. Además, se recomienda añadir a nuestra aplicación un enlace a dicha página en un lugar que sea fácil de encontrar.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigtdRS6UjFd9IBDroJ5Fcm4MX2Py-fWJev1Jb8sIDQs3INeVtPTYxXI2ki56NsfM3didrblhxUJJAN9nNlpu9hwNbTrfLimsvoMhuiTu4ZpOxV_G99BVQUSM1x-WkruKneCN4QieodHH4/s1600/privacidad04.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="723" data-original-width="480" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigtdRS6UjFd9IBDroJ5Fcm4MX2Py-fWJev1Jb8sIDQs3INeVtPTYxXI2ki56NsfM3didrblhxUJJAN9nNlpu9hwNbTrfLimsvoMhuiTu4ZpOxV_G99BVQUSM1x-WkruKneCN4QieodHH4/s400/privacidad04.JPG" width="265" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para facilitarnos las cosas, google dispone de un generador de políticas de privacidad.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9M8J7tsCvwDSNBSNXBF__OOnj0zYo0hy_UAImPyVNXmgH59Nvoe1tPZucSmfKBy07p3q9GiwKVXywL8fXxb3xV0t8uoI7mNmNCgeM9v2SHCBLaQjcO3Ic-Io_f7Mjg-_UYFvMXlqaRFk/s1600/privacidad02.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="189" data-original-width="551" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9M8J7tsCvwDSNBSNXBF__OOnj0zYo0hy_UAImPyVNXmgH59Nvoe1tPZucSmfKBy07p3q9GiwKVXywL8fXxb3xV0t8uoI7mNmNCgeM9v2SHCBLaQjcO3Ic-Io_f7Mjg-_UYFvMXlqaRFk/s1600/privacidad02.JPG" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para acceder a dicho "generador", nos vamos al siguiente <a href="https://app-privacy-policy-generator.firebaseapp.com/" target="_blank">enlace</a> y rellenamos los campos:</div>
<div style="text-align: justify;">
</div>
<ul>
<li><b><span style="color: #666666;">[APP name]</span></b>: Nombre de la aplicación. Yo utilicé el que me indicaba el propio correo de notificación de google.</li>
<li><b><span style="color: #666666;">Choose Type of App</span></b>: Aquí eliges que tipo de aplicación se trata (Free, Commercial, Ad Supported...)</li>
<li><b><span style="color: #666666;">Choose Dev Type</span></b>: Elige entre Individual y Company</li>
<li><b><span style="color: #666666;">Developer Name</span></b> o <b><span style="color: #666666;">Company Name</span></b>: Nombre del desarrollador o de la empresa desarrolladora</li>
<li><b><span style="color: #666666;">Choose Mobile Os</span></b>: Elige el sistema operativo para el que has desarrollado la app (Android, IOS o ambos)</li>
</ul>
<span style="text-align: justify;">Una vez rellenos todos estos campos debemos incluir aquellas políticas de privacidad de los servicios que utilizamos en nuestra app como pueden ser Google Play Service, AdMob, etc.</span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por último, hacemos click en <b><span style="color: #666666;">Generate </span></b>y nos genera automáticamente una página web que podremos descargar (<b><span style="color: #666666;">Download</span></b>). Una vez descargada la debemos subir a un servidor web con acceso público desde internet y copiar el enlace a dicha página (por ejemplo <a href="http://canariasvista.janubio.com/privacy_policy.html">http://canariasvista.janubio.com/privacy_policy.html</a>)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora, nos vamos a <a href="https://play.google.com/apps/publish/?hl=es&account=5341359282740571601#AppListPlace" target="_blank">Google Play Console</a>, elegimos la app afectada, luego elegimos <b><span style="color: #666666;">Presencia en Google Play Store</span></b> - <b><span style="color: #666666;">Ficha de Play Store</span></b> y al final de la página desmarcamos el check de <b><span style="color: #666666;">No indicar por ahora ninguna política de privacidad</span></b>. A continuación añadimos el enlace a la página de privacidad generada anteriormente y hacemos click en <b><span style="color: #666666;">Volver a subir la Aplicación</span></b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para actualizar la app, accedemos al menú <b><span style="color: #666666;">Gestión de Versiones</span></b> - <b><span style="color: #666666;">Versiones de la Aplicación</span></b> - <b><span style="color: #666666;">Gestionar </span></b>- <b><span style="color: #666666;">Crear nueva versión</span></b> y subimos el fichero apk de la nueva versión.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL77yewX5WFmjQnpz8-8Ys2yuDrsd9OkQcUSRetSLsOYO-25m6JB0kgquorWT9IH3EXGg7yKKrSUiNySGFRj7xrX7c_4aEuvcQxlIAgZjLo9daaq6aLKZcJTQnQZezJ5AyR8-yDXVLwqg/s1600/privacidad01.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="402" data-original-width="981" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL77yewX5WFmjQnpz8-8Ys2yuDrsd9OkQcUSRetSLsOYO-25m6JB0kgquorWT9IH3EXGg7yKKrSUiNySGFRj7xrX7c_4aEuvcQxlIAgZjLo9daaq6aLKZcJTQnQZezJ5AyR8-yDXVLwqg/s640/privacidad01.JPG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Rellenamos como siempre el resto de campos (novedades, etc.) y hacemos click en <b style="background-color: white;"><span style="color: #666666;">Guardar</span></b>. A continuación hacemos click en <b><span style="color: #666666;">Revisar</span></b>. y una vez completado este proceso ya solo nos queda hacer click en <b><span style="color: #666666;">Iniciar lanzamiento a producción.</span></b></div>
<div style="text-align: justify;">
<b><span style="color: #666666;"><br /></span></b></div>
<div style="text-align: justify;">
Ahora tan solo tenemos que cruzar los dedos y esperar un par de horas para que nuestra aplicación vuelva a estar disponible en Google Play.</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8366757327530120590.post-34759112416662364902017-11-25T01:49:00.002-08:002018-09-29T02:07:31.135-07:00Diferencia entre la implementación y compilar en gradle<div style="text-align: justify;">
Después de actualizar a android studio 3.0 y crear un nuevo proyecto me di cuenta de que en <a href="http://flipandroid.com/android/build-gradle">build.gradle</a> hay una nueva forma de agregar nuevas dependencias:</div>
<div style="text-align: justify;">
<ul>
<li>En lugar de compile hay implementation</li>
<li>Y en lugar de testCompile hay testImplementation</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjRCmp_gvoMU5JgNvSXQ5p6iXAIphRpbQWFAe5ZfswW8uFcWN2Uv3PoeWSwkAGKdr0gUBlVMqvoRHXiC5iCOJJJqzjGRxuE3nMng4AC_8Ew_i4YnAkKxkIzO8foGybtiSYxLIMyXP4YUU/s1600/android-studio-3.0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="309" data-original-width="634" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjRCmp_gvoMU5JgNvSXQ5p6iXAIphRpbQWFAe5ZfswW8uFcWN2Uv3PoeWSwkAGKdr0gUBlVMqvoRHXiC5iCOJJJqzjGRxuE3nMng4AC_8Ew_i4YnAkKxkIzO8foGybtiSYxLIMyXP4YUU/s1600/android-studio-3.0.jpg" /></a></div>
<div>
<br /></div>
<div>
<br />
<a name='more'></a>Es uno de los cambios de ruptura que viene con gradle: 3.0 que Google anunció en IO17 gradle: 3.0. La configuración de compile ahora está obsoleta y debe ser reemplazada por la implementation o api.</div>
<div>
<br /></div>
<div>
<div>
Las dependencias que aparecen en las configuraciones api estarán transitivamente expuestas a los consumidores de la biblioteca y, como tales, aparecerán en la clase de compilación de los consumidores.</div>
<div>
<br /></div>
<div>
Las dependencias encontradas en la configuración de implementation , por el contrario, no estarán expuestas a los consumidores y, por lo tanto, no se filtrarán en el camino de clase de compilación de los consumidores. Esto viene con varios beneficios:</div>
<div>
<ul>
<li>Las dependencias no se filtran en el classpath de compilación de los consumidores, por lo que nunca dependerá accidentalmente de una dependencia transitiva.</li>
<li>Una compilación más rápida gracias al tamaño reducido de classpath.</li>
<li>Menos recompilaciones cuando las dependencias de implementación cambian: los consumidores no tendrían que ser recompilados.</li>
<li>Cleaner publishing: cuando se usan conjuntamente con el nuevo complemento maven-publish, las librerías Java producen archivos POM que distinguen exactamente entre lo que se requiere compilar contra la biblioteca y lo que se requiere para usar la biblioteca en tiempo de ejecución (en otras palabras, no Mezclar lo que se necesita para compilar la propia biblioteca y lo que se necesita para compilar contra la biblioteca).</li>
</ul>
</div>
<div>
<b><br /></b>
<b>La configuración de compilación todavía existe, pero no debe utilizarse ya que no ofrecerá las garantías que proporcionan las configuraciones de api y de implementación.</b></div>
</div>
<div>
<br /></div>
<div>
Mas información: <a href="https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation" target="_blank">docs.gradle.org</a></div>
<div>
<br /></div>
<div>
<u>Resumiendo</u> </div>
<div>
<br /></div>
<div>
La diferencia clave entre el complemento estándar de Java y el complemento de la biblioteca Java es que este último introduce el concepto de una API expuesta a los consumidores. Una biblioteca es un componente Java destinado a ser consumido por otros componentes. Es un caso de uso muy común en compilaciones de proyectos múltiples, pero también tan pronto como tenga dependencias externas.</div>
<div>
<br /></div>
<div>
El complemento expone dos configuraciones que se pueden utilizar para declarar dependencias: api e implementación. La configuración api se debe utilizar para declarar dependencias que se exportan por la API de biblioteca, mientras que la configuración de implementación se debe utilizar para declarar dependencias que son internas al componente.<br />
<br />
Fuente: <a href="http://flipandroid.com/" target="_blank">flipandroid.com</a></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-8372530037588429382017-02-28T04:32:00.000-08:002017-07-09T01:32:03.483-07:00Librería Ion para la gestión de imágenes<div style="text-align: justify;">
<a href="https://github.com/koush/ion">Ion</a>, al igual que <a href="http://androidamuete.blogspot.com.es/2017/01/libreria-picasso-para-la-gestion-de.html">Picasso</a>, es una librería que se utiliza para gestionar las imágenes utilizando técnicas de cacheo. Esto consiste en que la librería se encarga de almacenar/recuperar las imágenes de la memoria volatil o interna del dispositivo o de descargarla de internet en caso necesario. También se encarga de eliminarla cuando ya no la utilizamos. Hasta aquí nada nuevo salvo que esta librería también puede gestionar imágenes gif.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPgCcz0oMEQxZxO_m0uzCGPQO98Tn_fxgN3AYOxThzSAr7P9tBx_hNJXpUHI4ib-QLxT24_UdqOBMZXA4qksOxgvcdDTwLD2GR3RX6wVRiQyggm98XYgUyLyL4_Etc07DNgVnkFYlKXw/s1600/ion-sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="383" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPgCcz0oMEQxZxO_m0uzCGPQO98Tn_fxgN3AYOxThzSAr7P9tBx_hNJXpUHI4ib-QLxT24_UdqOBMZXA4qksOxgvcdDTwLD2GR3RX6wVRiQyggm98XYgUyLyL4_Etc07DNgVnkFYlKXw/s640/ion-sample.png" width="640" /></a></div>
<a name='more'></a><div style="text-align: justify;">
Para usar esta librería lo primero que necesitamos es añadir la siguiente línea a <span style="color: #444444;"><b>buidl.gradle</b></span>:</div>
<pre class="brush:java;first-line:1">compile 'com.koushikdutta.ion:ion:2.+'</pre>
<br />
<div style="text-align: justify;">
Para descargar una imagen y mostrarla en una ImageView:</div>
<pre class="brush:java;first-line:1">Ion.with(context)
.load("http://example.com/image.png")
.withBitmap()
.placeholder(R.drawable.placeholder_image)
.error(R.drawable.error_image)
.intoImageView(imageView);</pre>
<div style="text-align: justify;">
donde</div>
<ul>
<li style="text-align: justify;"><b>load</b>: url desde donde descargaremos la imagen</li>
<li style="text-align: justify;"><b>placeholder</b>: (opcional) imagen que aparece en pantalla mientras se descarga la imagen</li>
<li style="text-align: justify;"><b>error</b>: (opcional)muestra una imagen de error cuando no se ha podido descargar la imagen</li>
</ul>
<i><b>Nota</b>: Existen otras opciones que puedes consultar en <a href="https://github.com/koush/ion" target="_blank">GitHub</a></i><br />
<br />
<div style="text-align: justify;">
También se puede descargar directamente:<br />
<br /></div>
<pre class="brush:java;first-line:1">Ion.with(imageView)
.placeholder(R.drawable.placeholder_image)
.error(R.drawable.error_image)
.load("http://example.com/image.png");</pre>
<br />
<div style="text-align: justify;">
Una forma de gestionar cuando se ha producida la descarga de la imagen es la siguiente:<br />
<br /></div>
<pre class="brush:java;first-line:1">Ion.with(getApplicationContext())
.load("http://example.com/image.png")
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
imageView.setImageBitmap(result);
// Otras acciones
}
});</pre>
<div style="text-align: justify;">
De esta forma, una vez descargada la imagen, podemos hacer varias acciones como compartirla, guardarla, etc. Por ejemplo, si queremos establecer la imagen como fondo de pantalla:</div>
<pre class="brush:java;first-line:1">Ion.with(getApplicationContext())</pre>
<pre class="brush:java;first-line:1"> .load(hdurl)</pre>
<pre class="brush:java;first-line:1"> .asBitmap()</pre>
<pre class="brush:java;first-line:1"> .setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext());
try {
wallpaperManager.setBitmap(result);
Toast.makeText(getApplicationContext(),getResources().getString(R.string.wallpaperOK),Toast.LENGTH_SHORT).show();
} catch (IOException en) {
en.printStackTrace();
}
}
});</pre>
<br />
<h3>
Imágenes GIF</h3>
Para descargar una imagen GIF utilizamos:<br />
<br />
<pre class="brush:java;first-line:1">Ion.with(imageView)
.animateGif(AnimateGifMode.ANIMATE)
.load("http://example.com/image.gif")</pre>
<pre class="brush:java;first-line:1"> .withBitmapInfo();</pre>
<br />
<br />
<div style="text-align: justify;">
Con este tipo de imágenes no podemos gestionar directamente la descarga de la propia imagen. Para ello, lo que yo hago es una doble descarga de la imagen ya que al utilizar esta librería técnicas de cacheo la segunda descarga se produce de forma inmediata:</div>
<div style="text-align: justify;">
<br /></div>
<pre class="brush:java;first-line:1">Ion.with(getApplicationContext())
.load("http://example.com/image.gif")
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
Ion.with(imageView)
.fitCenter()
.animateGif(AnimateGifMode.ANIMATE)</pre>
<pre class="brush:java;first-line:1"> .load("http://example.com/image.gif")
.withBitmapInfo();
imageView.setVisibility(View.VISIBLE);
}
});</pre>
<br />
<div style="text-align: justify;">
Ion, permite descargar otro tipo de archivos aunque yo, por ahora, solo la he utilizado para la descarga de imágenes. Puedes consultarlo en su documentación de <a href="https://github.com/koush/ion" target="_blank">GitHub</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esta librería consume más recursos que Picasso por lo que yo recomiendo utilizarla solo en el caso de descargar imágenes GIF.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un ejemplo de utilización de esta librería la puedes ver en mi aplicación <a href="https://play.google.com/store/apps/details?id=com.janubio.nasaphoto" target="_blank">jAPOD</a></div>
<br />
<b>Fuentes</b>:<br />
<a href="https://github.com/koush/ion" target="_blank">GitHub</a><br />
<a href="https://youtu.be/Q7e52RGimJY" target="_blank">How to easily get the html of any URL in android studio using Ion library</a><br />
<a href="https://www.beginnersheap.com/creating-simple-splash-screen-android-animated-gif-image-example/" target="_blank">Creating Splash Screen in Android with Animated Gif Image Example</a><br />
<a href="http://www.thaicreate.com/mobile/android-ion.html" target="_blank">Android and Ion (HTTP LIB:Library)</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-4042038111208461942017-01-10T03:57:00.000-08:002017-01-10T03:57:17.092-08:00Librería Picasso para la gestión de imágenes<div style="text-align: justify;">
Picasso es una librería para android que se utiliza para gestionar las imágenes utilizando técnicas de cacheo. Esto consiste en que la librería se encarga de almacenar/recuperar las imágenes de la memoria volatil o interna del dispositivo o de descargarla de internet en caso necesario. También se encarga de eliminarla cuando ya no la utilizamos.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4KdH0NzvpytpN9fR5kojJsVhOc0f8ZMTcH08MWNiiucGe7xnye-Q_NKapA2EPd6RXSpniKk0p9-AiobJkvIUo-DuOVE-MuQYh8KMSi2BM_cccWRovgo7rbjxk3f9Fbf1KXR1WJW4fls/s1600/sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4KdH0NzvpytpN9fR5kojJsVhOc0f8ZMTcH08MWNiiucGe7xnye-Q_NKapA2EPd6RXSpniKk0p9-AiobJkvIUo-DuOVE-MuQYh8KMSi2BM_cccWRovgo7rbjxk3f9Fbf1KXR1WJW4fls/s640/sample.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<a name='more'></a><br />
<div style="text-align: justify;">
Para usar esta librería lo primero que necesitamos es añadir la siguiente línea a <i>buidl.gradle</i></div>
<br />
<pre class="brush:java;first-line:1">compile 'com.squareup.picasso:picasso:2.5.2'
</pre>
<br />
<div style="text-align: justify;">
Además hay que añadir los siguientes permisos en <i>manifest.xml</i>:</div>
<br />
<pre class="brush:java;first-line:1"><uses-permission android:name="android.permission.INTERNET" /></pre>
<br />
<div style="text-align: justify;">
Para utilizarlo tan solo hay que añadir la siguiente instrucción:</div>
<br />
<pre class="brush:java;first-line:1">Picasso.with(this).load("http://servidor.com/imagen.jpg").into(imageView);
</pre>
<div style="text-align: justify;">
Se pueden configurar muchas opciones como que nos muestre si ha descargado la imagen de la caché, del disco o lo ha descargado de internet con un pequeño label en una de las esquinas (esto es útil sobre todo en fase de desarrollo):</div>
<br />
<pre class="brush:java;first-line:1">Picasso.with(this).setIndicatorsEnabled(true);</pre>
<br />
También podemos aplicar un procesado de la imagen, o que carge una imagen determinada en caso de fallo en la descarga, etc<br />
<br />
<pre class="brush:java;first-line:1">Picasso.with(this).load("http://servidor.com/imagen.jpg").error(R.drawable.error).fit().transform(new RoundedTransformation()).into(imageView);</pre>
<br />
<div style="text-align: justify;">
Una funcionalidad para mi muy interesante es que podemos controlar la descarga de la imagen. Para ello utilizamos un <i>target </i>como destino:</div>
<br />
<pre class="brush:java;first-line:1">Picasso.with(this).load(hdurl).into(target)</pre>
<br />
<div style="text-align: justify;">
En este ejemplo, dependiendo del valor de una variable (TipoDownload) podemos realizar varias operaciones una vez hayamos descargado la imagen:</div>
<br />
<pre class="brush:java;first-line:1">// Guarda la imagen en una carpeta del almacenamiento externo
public void saveImageExtPath(Bitmap bipmap, String nameImage, String path) {
FileOutputStream fileOutputStream = null;
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + path;
File dir = new File(file_path);
if (!dir.exists()) {
dir.mkdirs();
}
File new_file = new File(dir, nameImage);
try {
fileOutputStream = new FileOutputStream(new_file);
bipmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
// añade la imagen a la galería de fotos
MediaScannerConnection.scanFile(this, new String[] { new_file.getPath() }, new String[] { "image/jpeg" }, null);
if (TipoDownload == 2) { // Compartiendo imagen
// Compartir la imagen guardada anteriormente
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
share.putExtra(Intent.EXTRA_TEXT, title);
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new_file));
startActivity(Intent.createChooser(share, getResources().getString(R.string.compartir)));
//boolean deleted = new_file.delete();
}
if (TipoDownload == 4) { // Guardando imagen
// Muestra el mensaje
Toast.makeText(getApplicationContext(), getResources().getString(R.string.mensajeImagenGuardada) + ": " + path + "/" + nameImage, Toast.LENGTH_LONG).show();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private Target target = new Target() {
ProgressDialog pDialog;
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
// loading of the bitmap was a success
if (TipoDownload == 2) { // Compartir
saveImageExtPath(bitmap, txtSubTitulo.getText() + ".jpg", "/jAPOD");
}
if (TipoDownload == 3) { //Wallpaper
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext());
try {
wallpaperManager.setBitmap(bitmap);
Toast.makeText(getApplicationContext(),getResources().getString(R.string.wallpaperOK),Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
if (TipoDownload == 4){ //Guarda la imagen
saveImageExtPath(bitmap, txtSubTitulo.getText() + ".jpg", "/jAPOD");
}
pDialog.dismiss();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
// loading of the bitmap failed
if (TipoDownload == 2) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorLoad),Toast.LENGTH_SHORT).show(); //Compartir
if (TipoDownload == 3) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorLoad),Toast.LENGTH_SHORT).show(); //Wallpaper
if (TipoDownload == 4) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorSavePicture),Toast.LENGTH_SHORT).show(); //Guardar
pDialog.dismiss();
Toast.makeText(getApplicationContext(),getResources().getString(R.string.wallpaperOK),Toast.LENGTH_SHORT).show();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
pDialog = new ProgressDialog(MainActivity.this);
if (TipoDownload == 2 )pDialog.setMessage(getResources().getString(R.string.cargandoImagen));
if (TipoDownload == 3 )pDialog.setMessage(getResources().getString(R.string.cargandoImagen));
if (TipoDownload == 4 )pDialog.setMessage(getResources().getString(R.string.guardandoImagen));
pDialog.setCancelable(true);
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.show();
}
};</pre>
<br />
<div style="text-align: justify;">
La función <i>onBitmapLoaded </i>se ejecuta una vez se haya descargado/obtenido la imagen, <i>onBitmapFailed </i>se ejecuta si se ha producido un error en la descarga/obtención de la imagen mientras que <i>onPrepareLoad </i>se ejecuta antes de iniciar la descarga/obtención de la imagen</div>
<br /><b>Fuentes</b>:<br />
<ul>
<li><a href="http://square.github.io/picasso/">GitHub</a> </li>
<li><a href="https://www.youtube.com/watch?v=IrOhAOwXPhg">Android Studio 2.2: Downloading Images</a> </li>
<li><a href="https://www.simplifiedcoding.net/picasso-android-tutorial-picasso-image-loader-library/">Picasso Android Tutorial – Android Picasso Image Loader Library</a> </li>
<li><a href="http://www.codexpedia.com/android/android-download-and-save-image-through-picasso/">Android download and save image through Picasso</a> </li>
<li><a href="https://futurestud.io/tutorials/picasso-callbacks-remoteviews-and-notifications">Picasso — Callbacks, RemoteViews and Notifications</a> </li>
<li><a href="https://geekytheory.com/gestion-de-imagenes-en-android-con-picasso">Gestión de imágenes en Android con Picasso</a></li>
</ul>
<ul></ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-47868474146875989142016-09-17T03:53:00.002-07:002017-01-10T05:12:03.622-08:00Descargar una imagen jpg de internet y guardarla.<div style="text-align: justify;">
En este artículo, como el título indica, se mostrará como descargar una imagen en formato jpg de internet (disponiendo de su url) y como guardarla en una carpeta en el almacenamiento externo del dispositivo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTgU8JLz_nlrA5AUwXq7l10Wym1dd9HXAFWSOit4ySjLbgZyjpU5M0Y1SnfAQ2QAxkr7VSzspUPeE_kRGRT81AHvdHbTeWsXH5D941DnF3kd0JsGBhUkz-f2OgBRV85UNGd8V-WZbmBc/s1600/524c4636808aae44e8f6e1dfa3aea15c.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTgU8JLz_nlrA5AUwXq7l10Wym1dd9HXAFWSOit4ySjLbgZyjpU5M0Y1SnfAQ2QAxkr7VSzspUPeE_kRGRT81AHvdHbTeWsXH5D941DnF3kd0JsGBhUkz-f2OgBRV85UNGd8V-WZbmBc/s1600/524c4636808aae44e8f6e1dfa3aea15c.jpg" /></a></div>
<br />
Nota: <i>este método solo sirve para imágenes de pequeño tamaño</i>. </div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
Para descargar la imagen de internet utilizaremos la siguiente clase:<br />
<br />
<pre class="brush:java;first-line:1">private class DownloadImage extends AsyncTask<string bitmap="" void=""> {
ProgressDialog pDialog;
private String TAG = "DownloadImage";
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pDialog = new ProgressDialog(PrincipalActivity.this);
pDialog.setMessage(getResources().getString(R.string.DescargandoImagen));
pDialog.setCancelable(true);
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.show();
}
private Bitmap downloadImageBitmap(String sUrl) {
Bitmap bitmap = null;
try {
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
bitmap = BitmapFactory.decodeStream(inputStream); // Decode Bitmap
inputStream.close();
} catch (Exception e) {
Log.d(TAG, "Exception 1, Something went wrong!");
e.printStackTrace();
}
pDialog.dismiss();
// Aquí se puede añadir el compartir imagen
// Aquí se puede añadir el establecer el fondo de pantalla
return bitmap;
}
@Override
protected Bitmap doInBackground(String... params) {
return downloadImageBitmap(params[0]);
}
protected void onPostExecute(Bitmap result) {
String date = (DateFormat.format("yyyyMMdd_hhmmss", new java.util.Date()).toString());
saveImageExtPath(result,date + ".jpg","/tu_carpeta");
}
}
</string></pre>
<br /></div>
<div style="text-align: justify;">
Utiliza <b>AsyncTask</b> para que la descarga se produzca en segundo plano y no "paralizar" la aplicación durante el proceso de descarga de la imagen. Además se mostrará un <b>ProgressDialog</b> indicando dicho proceso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez descargada la imagen (<b>onPostExecute</b>) se llamará al procedimiento que guardará la imagen en el dispositivo externos (SD Card) <b>saveImageExtPath();</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tiene tres parámetros:</div>
<ol>
<li><div style="text-align: justify;">
El primer parámetro es la imagen en formato bitmap resultado de la descarga de internet. </div>
</li>
<li><div style="text-align: justify;">
El segundo parámetro es el nombre de la imagen guardada que está compuesto, en este caso, por la fecha y hora en formato yyyyMMdd_hhmmss.jpg aunque puede ser modificado por el que tu necesites. </div>
</li>
<li><div style="text-align: justify;">
El tercer parámetro es la carpeta donde se guardará la imagen a partir del directorio raíz del almacenamiento externo.</div>
</li>
</ol>
<div style="text-align: justify;">
El procedimiento es el siguiente:</div>
<br />
<pre class="brush:java;first-line:1">public void saveImageExtPath(Bitmap bipmap, String nameImage, String path){
FileOutputStream fileOutputStream = null;
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + path;
File dir = new File(file_path);
if (!dir.exists()){
dir.mkdirs();
}
File new_file = new File(dir,nameImage);
try {
fileOutputStream = new FileOutputStream(new_file);
bipmap.compress(Bitmap.CompressFormat.JPEG,100,fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
// añade la imagen a la galería de fotos
MediaScannerConnection.scanFile(this, new String[] { new_file.getPath() }, new String[] { "image/jpeg" }, null);
Toast.makeText(getApplicationContext(),getResources().getString(R.string.mensajeImagenGuardada) + " " + path + "/" + nameImage + ")",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
</pre>
<div style="text-align: justify;">
<br />
<br /></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Al final del proceso mostrará un mensaje (<b>Toast</b>) indicando que la descarga de la imagen se ha producido y l ruta donde se ha almacenado la imagen.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para que se actualice la galería de imágenes de nuestro dispositivo se utiliza <b>MediaScannerConnection.scanFile()</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para descargar una imagen y guardarla utiliza la sentencia:</div>
<br />
<span style="color: #666666;"><span style="font-family: "courier new" , "courier" , monospace;">new DownloadImage().execute(urlImagenJPG);
</span>
</span><br />
<br />
Para tener acceso a la memoria externa debemos añadir en el manifest.xml:<br />
<br />
<span style="color: #666666;"><span style="font-family: "courier new" , "courier" , monospace;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission></span></span><br />
<br />
Si en vez de querer utilizar la memoria externa queremos utilizar la memoria interna podemos utilizar el método:<br />
<br />
<pre class="brush:java;first-line:1">public void saveImage(Context context, Bitmap b, String imageName) {
FileOutputStream foStream;
try {
foStream = context.openFileOutput(imageName, Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.JPEG, 100, foStream);
foStream.close();
} catch (Exception e) {
Log.d("saveImage", "Exception 2, Something went wrong!");
e.printStackTrace();
}
}
</pre>
<br />
<div style="text-align: justify;">
y para recuperar la imagen:</div>
<br />
<pre class="brush:java;first-line:1">public Bitmap loadImageBitmap(Context context, String imageName) {
Bitmap bitmap = null;
FileInputStream fiStream;
try {
fiStream= context.openFileInput(imageName);
bitmap= BitmapFactory.decodeStream(fiStream);
fiStream.close();
} catch (Exception e) {
Log.d("saveImage", "Exception 3, Something went wrong!");
e.printStackTrace();
}
return bitmap;
}
</pre>
<br />
<div style="text-align: justify;">
<br />
<span style="font-size: large;"><b>Otras acciones</b></span><br />
<br />
Si queremos compartir la imagen guardada en el almacenamiento externo (conociendo la ruta completa de la imagen) podemos utilizar:</div>
<br />
<pre class="brush:java;first-line:1">// Compartir la imagen guardada
File ruta_sd = Environment.getExternalStorageDirectory();
String name = rutaImagen;
File photoFile = new File(ruta_sd.getAbsolutePath(),name);
try {
if (photoFile.exists()){
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
share.putExtra(Intent.EXTRA_TEXT,nombreWebcam);
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(photoFile));
startActivity(Intent.createChooser(share,getResources().getString(R.string.CompartirImagen)));
boolean deleted = photoFile.delete();
}else {
Toast.makeText(getApplicationContext(),getResources().getString(R.string.VuelveAIntentarlo),Toast.LENGTH_SHORT).show();
}
} catch (Exception e){
Log.e("Error Fichero","El fichero no existe");
}
</pre>
<br />
<br />
Por último, si queremos añadir la imagen como fondo de pantalla de nuestro dispositivo:<br />
<pre class="brush:java;first-line:1">WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext());
try {
wallpaperManager.setBitmap(bipmap);
} catch (IOException e) {
Log.e("Main", "Cant set wallpaper");
}
</pre>
<br />
<br />
<div style="text-align: justify;">
<b>Fuentes:</b></div>
<ul>
<li><div id="docs-internal-guid-a9d4c407-3791-734f-515c-f95abc147629" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://sekthdroid.wordpress.com/2012/11/29/descargar-imagen-desde-url-en-android/" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline;">https://sekthdroid.wordpress.com/2012/11/29/descargar-imagen-desde-url-en-android/</span></a></div>
</li>
<li><div style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://sekthdroid.wordpress.com/2012/12/01/guardar-imagen-en-memoria-interna-android/" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline;">https://sekthdroid.wordpress.com/2012/12/01/guardar-imagen-en-memoria-interna-android/</span></a></div>
</li>
<li><div style="text-align: justify;">
<a href="http://www.codexpedia.com/android/android-download-and-save-image-internally/" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline;">http://www.codexpedia.com/android/android-download-and-save-image-internally/</span></a></div>
</li>
<li><div style="text-align: justify;">
<a href="http://stackoverflow.com/questions/2170214/image-saved-to-sdcard-doesnt-appear-in-androids-gallery-app" id="docs-internal-guid-a9d4c407-3791-b807-44ab-454995597ff3" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline;">http://stackoverflow.com/questions/2170214/image-saved-to-sdcard-doesnt-appear-in-androids-gallery-app</span></a><br />
<b></b><i></i><u></u><sub></sub><sup></sup><strike></strike></div>
</li>
</ul>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8366757327530120590.post-43711445519004956342016-04-09T01:21:00.000-07:002016-06-07T04:15:09.116-07:00Android Studio 2.0<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnH2utjGhzEzHyArLHCqYSregY783X-_Wg7viHN_-65fFl5cfwbQyh6v8AGFdiNIzIsldZYfesnQHDSWoMeNn_cOXGU97Grbs2U8otI_kLuWGo2_PnHQMZyRVElUeoYqgigHUCJDHLNwc/s1600/Android-Studio-2.0-Novedades-Portada.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnH2utjGhzEzHyArLHCqYSregY783X-_Wg7viHN_-65fFl5cfwbQyh6v8AGFdiNIzIsldZYfesnQHDSWoMeNn_cOXGU97Grbs2U8otI_kLuWGo2_PnHQMZyRVElUeoYqgigHUCJDHLNwc/s640/Android-Studio-2.0-Novedades-Portada.jpg" width="640" /></a></div>
<div>
<br /></div>
<div style="text-align: justify;">
Ha sido anunciada <b>Android Studio 2.0</b>, la última versión oficial del entorno de programación, de la cual <a href="http://android-developers.blogspot.com.es/2016/04/android-studio-2-0.html">nos hemos enterado a través de Android Developers Blog</a>.<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Entre las principales novedades introducidas en la versión 2.0, se encuentra Instant Run. Esta funcionalidad permite compilar y comprobar los cambios realizados en la aplicación casi al instante, de ahí su nombre. Sin duda, se trata de algo que los usuarios llevaban pidiendo con urgencia, y que ahorrará mucho tiempo en el trabajo de los desarrolladores.</div>
</div>
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/xxx3Fn7EowU?list=PLWz5rJ2EKKc_w6fodMGrA1_tsI3pqPbqa" width="640"></iframe>
</center>
<br />
<div style="text-align: justify;">
Asimismo, también podemos comprobar la existencia de un nuevo y rediseñado Android Emulator, el cual promete ser hasta tres veces más rápido que su anterior versión. Además, como un dispositivo real, el emulador incluye los Servicios de Google Play. Para rematar, el nuevo Android Emulator ahora permite manejar llamadas, comprobar el estado de la batería, las redes móviles o el GPS.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra de las principales innovaciones es Cloud Test Lab Integration. Como su propio nombre indica, esta característica hace uso de los servicios de la nube y permite comprobar el buen funcionamiento desde cualquier dispositivo. De esta manera, los desarrolladores podrán escribir el código de la app y ejecutarla en una gran variedad de terminales en el Cloud Test Lab.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dos de las más útiles mejoras son la generación de código de indexado de aplicaciones para verificar su correcto funcionamiento y el GPU Debugger Preview. La primera característica ayuda a promover la visibilidad de tu aplicación, mientras que la segunda permite detectar errores de renderizado que puedan ocurrir en tu dispositivo.<br />
<br />
Visto en <a href="http://andro4all.com/2016/04/android-studio-2-0-novedades-caracteristicas" target="_blank">andro4all.com</a><br />
Más información: <a href="http://android-developers.blogspot.com.es/2016/04/android-studio-2-0.html" target="_blank">android-developers</a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8366757327530120590.post-6479373823677799632016-03-25T14:03:00.000-07:002017-01-15T04:20:25.071-08:00Conexión a la red con HttpUrlConnection<div style="text-align: justify;">
Este artículo explicará de qué forma se puede enviar y recibir datos hacia un servidor desde una aplicación Android.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La mayoría de las aplicaciones de Android conectadas a la red utilizan HTTP para enviar y recibir datos. La plataforma Android incluye el cliente <a href="http://developer.android.com/reference/java/net/HttpURLConnection.html">HttpURLConnection</a>.</div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPnw5jInr1eMWi59VV2gIkmfy4v8hTzYJWQjnZTCXABjxwLQGdPwqra20PLCWQGptv4fDXwz4zUUFSLE9GmtV-hGBjzGKKue_9YgQV-kYHvzPiPyBuSMaDHuFNwl956vhtvX4tl0mxjrg/s1600/11949856881991616238apacheconf..svg.hi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPnw5jInr1eMWi59VV2gIkmfy4v8hTzYJWQjnZTCXABjxwLQGdPwqra20PLCWQGptv4fDXwz4zUUFSLE9GmtV-hGBjzGKKue_9YgQV-kYHvzPiPyBuSMaDHuFNwl956vhtvX4tl0mxjrg/s320/11949856881991616238apacheconf..svg.hi.png" width="320" /></a></div>
<br />
<a name='more'></a></div>
<div style="text-align: justify;">
Para que las aplicaciones tengan acceso total a la conexión de tu dispositivo Android es necesario incluir los siguientes permisos en el archivo AndroidManifest.xml:<br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #e8bf6a; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><uses-permission </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">android</span><span style="background-color: #2b2b2b; color: #bababa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">:name=</span><span style="background-color: #2b2b2b; color: #a5c261; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"android.permission.INTERNET" </span><span style="background-color: #2b2b2b; color: #e8bf6a; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">/></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #e8bf6a; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><uses-permission </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">android</span><span style="background-color: #2b2b2b; color: #bababa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">:name=</span><span style="background-color: #2b2b2b; color: #a5c261; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"android.permission.ACCESS_NETWORK_STATE" </span><span style="background-color: #2b2b2b; color: #e8bf6a; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">/></span></div>
</td></tr>
</tbody></table>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b>Comprobando la conexión de red</b></div>
Antes de iniciar el cliente Http hay que comprobar si la conexión del dispositivo está habilitada, ya que puede ser posible que el Wi-fi no esté disponible o simplemente la conexión de red está fuera del rango. Para comprobar el estado de conexión usaremos los métodos <a href="http://developer.android.com/reference/android/net/ConnectivityManager.html#getActiveNetworkInfo()">getActiveNetworkInfo()</a> e <a href="http://developer.android.com/reference/android/net/NetworkInfo.html#isConnected()">isConnected()</a>:<br />
<div>
<div style="text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">public boolean </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">isConnected</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(){</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">CONNECTIVITY_SERVICE</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">NetworkInfo networkInfo = connMgr.getActiveNetworkInfo()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(networkInfo != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">null </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">&& networkInfo.isConnected()) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return true;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">else </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return false;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<div style="text-align: justify;">
Se ha usado la clase ConnectivityManager para obtener las características actuales de la conexión. Esta información la guardamos en un elemento del tipo NetworkInfo con el método getActiveNetworkInfo(). Luego comprobamos si se retornó algún dato y si además el dispositivo está conectado con isConnected().</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un simple if (isConnected){..} nos permitirá realizar el resto de acciones una vez que hemos combrado que nuestro dispositivo está conectado a internet:</div>
<div style="text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(isConnected()){</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="color: #999999;"><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// Ejecuta las acciones...</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">DownloadWebpageTask().execute(</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"http://canariasvista.hol.es/"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">else </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> Toast.</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">makeText</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(getApplicationContext()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">,</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"Error en la conexión"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">,</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Toast.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">LENGTH_SHORT</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">).show()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<span style="text-align: justify;"><b>Establecer peticiones HTTP en segundo plano usando AsyncTask</b></span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El tiempo que tarda la transmisión de datos en la red depende de muchos factores, como el tamaño de la información a intercambiar, los tiempos de latencia, la congestión del servidor o incluso la ejecución de múltiples tareas distintas en el sistema operativo. Cualquiera de estas situaciones puede prolongar el tiempo de una petición indefinidamente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para solucionarlo, las tareas asíncronas nos auxilian en estas situaciones. Solo debemos crear una nueva instancia de la clase <a href="http://developer.android.com/reference/android/os/AsyncTask.html">AsyncTask</a> e incluir la petición al servidor en el método <a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...)">doInBackground()</a> y luego actualizar los resultados visuales en <a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)">onPostExecute()</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">private class </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">DownloadWebpageTask </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">extends </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">AsyncTask<String</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Void</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">String> {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@Override</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">protected </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">String </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">doInBackground</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(String... urls) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">try </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">downloadUrl(urls[</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">0</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">])</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">catch </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(IOException e) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"No se puede recuperar la página web. URL puede no ser válida"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #999999; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// onPostExecute displays the results of the AsyncTask.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@Override</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">protected void </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">onPostExecute</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(String result) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">textView</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.setText(result)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<div style="text-align: justify;">
La secuencia de acciones es la siguiente: </div>
<div style="text-align: justify;">
<ul>
<li>Una vez hemos comprobado la conexión, la aplicación pasa el String URL a la subclase DownloadWebpageTask de AsyncTask </li>
<li>Abrimos la conexión hacia la URL en doInBackground() </li>
<li>Si es correcto, se llama al método downloadUrl que toma el parámetro String URL y lo usa para crear el objeto <a href="http://developer.android.com/reference/java/net/URL.html">URL</a></li>
<li>A continuación se usa el objeto URL para establecer una HttpURLConnection. </li>
<li>Una vez se ha establecido la conexión, el objeto HttpUrlConnection obtiene el contenido de la página web como un <a href="http://developer.android.com/reference/java/io/InputStream.html">InputStream</a></li>
<li>Pasamos el InputStream al método readIt() que convierte el stream en String. </li>
<li>Por último, el método onPostExecute() de AsyncTask muestra el string en la Activity.</li>
</ul>
</div>
<br />
<b>Conecta y descarga la página web</b><br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">downloadUrl</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(String myurl) </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">throws </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">IOException {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> InputStream is = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> try </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> URL url = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">URL(myurl)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HttpURLConnection conn = (HttpURLConnection) url.openConnection()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setReadTimeout(</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10000 </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/* milisegundos */</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setConnectTimeout(</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">15000 </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/* milisegundos */</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setRequestMethod(</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"GET"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setDoInput(</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">true</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Inicia la consulta</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.connect()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> int </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">response = conn.getResponseCode()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Log.</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">DEBUG_TAG</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"La respuesta es: " </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">+ response)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">is = conn.getInputStream()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">//Para descargar la página web completa</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">BufferedReader reader = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">BufferedReader(</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">InputStreamReader(is</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"UTF-8"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">))</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String webPage = </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">""</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String data = </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">""</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">((data = reader.readLine()) != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> webPage += data + </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">\n</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">webPage</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Se asegura de que el InputStream se cierra después de la aplicación deja de usarla.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">finally </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(is != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> is.close()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<div style="text-align: justify;">
En el hilo que lleva a cabo las transacciones de red, utiliza <a href="http://developer.android.com/reference/java/net/HttpURLConnection.html">HttpURLConnection </a>para realizar un GET y descargar sus datos. Después de llamar a connect(), se puede obtener un InputStream de los datos llamando a getInputStream().</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el siguiente fragmento, el método doInBackground() llama al método downloadURL(). El método de descarga URL() toma la URL dada y lo utiliza para conectarse a la red a través de HttpURLConnection. Una vez que se ha establecido una conexión, la aplicación utiliza el método getInputStream() para recuperar los datos como un InputStream.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tenga en cuenta que el método getResponseCode() devuelve el código de estado de la conexión. Esta es una manera útil de obtener información adicional acerca de la conexión. Un código de estado 200 indica éxito.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si queremos asegurarnos que solo ejecutamos las siguientes acciones si recibimos un 200, podemos hacerlo de la siguiente forma:</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(response != </span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">200</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">){</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> String contentAsString = </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"El recurso no está disponible"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> return </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">contentAsString</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">else </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is = conn.getInputStream()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: #2b2b2b; color: #999999; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// etc...</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></div>
</td></tr>
</tbody></table>
</div>
<span style="font-family: "verdana" , sans-serif;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="font-family: "verdana" , sans-serif;"> </span> </span></span></div>
<div style="text-align: justify;">
En nuestro ejemplo, mostramos el contenido de la página web en un TextView. El código java completo es el siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; text-align: justify; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="background-color: #2b2b2b; border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">package </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">com.example.miguel.connectingtothenetwork</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.content.Context</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.net.ConnectivityManager</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.net.NetworkInfo</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.os.AsyncTask</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.support.v7.app.AppCompatActivity</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.os.Bundle</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.text.method.ScrollingMovementMethod</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.util.Log</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.widget.TextView</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">android.widget.Toast</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">org.w3c.dom.Text</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.BufferedInputStream</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.BufferedReader</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.DataInputStream</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.IOException</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.InputStream</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.InputStreamReader</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.Reader</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.io.UnsupportedEncodingException</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.net.HttpURLConnection</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.net.MalformedURLException</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">import </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">java.net.URL</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">public class </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">MainActivity </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">extends </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">AppCompatActivity {</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private static final </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">DEBUG_TAG </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"HttpExample"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> private </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">TextView </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textView</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">TextView </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textDebug</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Override</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">protected void </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">onCreate</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(Bundle savedInstanceState) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="color: #666666;"><span style="font-family: "courier new" , "courier" , monospace;">new DownloadImage().execute(urlImagenJPG);
</span></span> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.onCreate(savedInstanceState)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">setContentView(R.layout.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">activity_main</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textView </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= (TextView) findViewById(R.id.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">myText</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textView</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.setMovementMethod(</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ScrollingMovementMethod())</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textDebug </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= (TextView)findViewById(R.id.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textDebug</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(isConnected()){</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Ejecuta las acciones</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">DownloadWebpageTask().execute(</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"http://canariasvista.hol.es/"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">else </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Toast.</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">makeText</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(getApplicationContext()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Error en la conexión"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Toast.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">LENGTH_SHORT</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">).show()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">public boolean </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">isConnected</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(){</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">CONNECTIVITY_SERVICE</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">NetworkInfo networkInfo = connMgr.getActiveNetworkInfo()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(networkInfo != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&& networkInfo.isConnected()) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return true;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">else </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return false;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private class </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">DownloadWebpageTask </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">extends </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">AsyncTask<String</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Void</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String> {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Override</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">protected </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">doInBackground</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(String... urls) {</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">try </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span><span style="background-color: #344134; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">downloadUrl</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(urls[</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">])</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">catch </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(IOException e) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"No se puede recuperar la página web. URL puede no ser válida."</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// onPostExecute muestra el resultado de AsyncTask.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Override</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #bbb529; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">protected void </span><span style="background-color: #2b2b2b; color: #ffc66d; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">onPostExecute</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(String result) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">textView</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.setText(result)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String </span><span style="background-color: #344134; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">downloadUrl</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(String myurl) </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">throws </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">IOException {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> InputStream is = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> try </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> URL url = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">URL(myurl)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HttpURLConnection conn = (HttpURLConnection) url.openConnection()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setReadTimeout(</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10000 </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/* milisegundos */</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setConnectTimeout(</span><span style="background-color: #2b2b2b; color: #6897bb; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">15000 </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/* milisegundos */</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setRequestMethod(</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"GET"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.setDoInput(</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">true</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Inicia la consulta</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">conn.connect()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> int </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">response = conn.getResponseCode()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Log.</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #2b2b2b; color: #9876aa; font-family: "courier new"; font-size: 14.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">DEBUG_TAG</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"La respuesta es: " </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">+ response)</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">is = conn.getInputStream()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">//Para descargar la página web completa</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">BufferedReader reader = </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">BufferedReader(</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">InputStreamReader(is</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"UTF-8"</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">))</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String webPage = </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">""</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">String data = </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">""</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">((data = reader.readLine()) != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> webPage += data + </span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">\n</span><span style="background-color: #2b2b2b; color: #6a8759; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">webPage</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Se asegura de que el InputStream se cierra después de la aplicación deja de usarla.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">} </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">finally </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(is != </span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) {</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> is.close()</span><span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #cc7832; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: #2b2b2b; color: #a9b7c6; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<br />
<b>Fuentes:</b><br />
<a href="http://developer.android.com/intl/es/training/basics/network-ops/connecting.html#stream">Connecting to the Network</a><br />
<a href="http://www.hermosaprogramacion.com/2015/01/android-httpurlconnection/">Operaciones HTTP En Android Con El Cliente HttpURLConnection</a><br />
<br />
<b>Otros artículos interesantes:</b><br />
<a href="http://developer.android.com/intl/es/training/basics/network-ops/managing.html">Managing Network Usage</a><br />
<a href="http://www.hermosaprogramacion.com/2014/12/android-asynctask-hilos/">AsyncTask: Tareas Asíncronas en Android</a><br />
<a href="http://www.codejava.net/java-se/networking/use-httpurlconnection-to-download-file-from-an-http-url">Use HttpURLConnection to download file from an HTTP URL</a><br />
<a href="http://www.tutorialspoint.com/android/android_network_connection.htm">Android - Network Connection Tutorial</a></div>
Unknownnoreply@blogger.com0