B4A en español - Juan Antonio Villalpando
(BASIC4Android)
-- Tutorial de B4A --
Volver al índice del tutorial
____________________________
77.- Bajar archivo .zip de Internet. Descomprimirlo. Ver su sitio web offline. Servicios.
Esto trata de bajar un archivo comprimido, jquery.mobile-1.2.1.zip, en este caso es un sitio web comprimido. Una vez bajado se guarda y descomprime automáticamente en la SdCard. Finalmente se navega por el sitio web offline, es decir desde los archivos bajados en la SdCard.
Para realizar este tutorial me voy a basar en la web de jQuery, esta web muestra una plantilla para realizar sitios web. La verdad podría haber tomado un ejemplo más fácil, pero vamos a atrevernos con este.
Primero vamos a ver de qué trata jQuery. Bájate este archivo: jquery.mobile-1.2.1.zip
La versión nueva la puedes bajar de su sitiio: http://jquerymobile.com/download/ pero para hacer las pruebas mejor vamos a bajar la version 1.2.1 que he preparado en mi servidor.
Bájalo a tu ordenador, descomprímelo. Ve a la carpeta jquery.mobile-1.2.1\demos y pulsa sobre el archivo index.html
Navegarás por un sitio web offline realizado con una plantilla, que podrás adaptar a tus necesidades.
jQuery Mobile es la manera más fácil para construir sitios y aplicaciones accesibles desde todos los dispositivos populares como los teléfonos móviles, tablets y ordenadores.
________________________________
Bien pues se trata de hacer eso mismo en el móvil. Lo vamos a realizar en dos pasos
1.- Lo primero bajar el archivo jquery.mobile-1.2.1.zip desde Internet a la SdCard.
Para ello vamos a basarnos en un tutorial de los foros de Basic4Android, concretamente en esta página.
- Debemos marcar las librerías: HTTP y HttpUtils2
- Mediante el Designer creamos un Layout y lo llamamos: 1
- El Layout debe tener un Button llamado: Button1
- Vamos a bajar el susodicho archivo de http://kio4.com/b4a/programas/jquery.mobile-1.2.1.zip
- Lo bajaremos a la Sdcard: /mnt/sdcard
Código del programa en Basic4Android
|
Sub Process_Globals
End Sub
Sub Globals
Dim Button1 As Button End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("1")
End Sub
Sub Activity_Resume
'check if download has finished while the activity was paused
If Button1.Enabled = False AND DownloadService.JobStatus = DownloadService.STATUS_DONE Then
FinishDownload
End If
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
Activity.Color = Colors.Black
DownloadService.URL = "http://kio4.com/b4a/programas/jquery.mobile-1.2.1.zip"
DownloadService.Target = File.OpenOutput(File.DirRootExternal, "jquery.mobile-1.2.1.zip", False)
StartService(DownloadService)
Button1.Enabled = False
End Sub
Sub FinishDownload
Button1.Enabled = True
DownloadService.JobStatus = DownloadService.STATUS_NONE
End Sub
|
___________________________
- Creación del Servicio.
- Creamos un módulo de servicio mediante Project / Add New Module / Service Module
Lo llamamos DownloadService
y copiamos este código...
Código del Service Module: DownloadService
|
' Módulo de Servicio
Sub Process_Globals
Dim HC As HttpClient
'Activity is expected to set URL
Dim URL As String
Dim Target As OutputStream
Dim JobStatus As Int
Dim STATUS_NONE, STATUS_WORKING, STATUS_DONE As Int
STATUS_NONE = 0
STATUS_WORKING = 1
STATUS_DONE = 2
Dim DoneSuccessfully As Boolean
Dim Notification1 As Notification
End Sub
Sub Service_Create
HC.Initialize("HC")
Notification1.Initialize
Notification1.Icon = "icon" 'use the application icon file for the notification
Notification1.Vibrate = False
End Sub
Sub Service_Start
'URL and Target should be set by the calling module
Dim request As HttpRequest
request.InitializeGet(URL)
HC.Execute(request, 1)
JobStatus = STATUS_WORKING
Notification1.SetInfo("Servicio de bajada", "Bajando: " & URL, Main)
Notification1.Sound = False
'Make sure that the process is not killed during the download
'This is important if the download is expected to be long.
'This will also show the status bar notification
Service.StartForeground(1, Notification1)
End Sub
Sub HC_ResponseError (Reason As String, StatusCode As Int, TaskId As Int)
ToastMessageShow("Error en la bajada: " & Reason, True)
DoneSuccessfully = False
Finish
End Sub
Sub HC_ResponseSuccess (Response As HttpResponse, TaskId As Int)
'Asynchronously download the stream
Response.GetAsynchronously("Response", Target, True, TaskId)
End Sub
Sub Response_StreamFinish (Success As Boolean, TaskId As Int)
If Success = False Then
ToastMessageShow("Error en la bajada: " & LastException.Message, True)
Else
ToastMessageShow("Bajada correcta.", True)
End If
DoneSuccessfully = Success
Finish
End Sub
Sub Finish
Log("Servicio de bajada acabado.")
JobStatus = STATUS_DONE
'Notify the activity that the download has finished.
'It will do nothing if the activity is currently paused.
CallSub(Main, "FinishDownload")
Service.StopForeground(1) 'Return the service to the "background" (also removes the ongoing notification)
If IsPaused(Main) Then
'The activity is paused. The user is probably busy with some other activity.
'Notify the user that the download has finished
Notification1.Sound = True
Notification1.SetInfo("Servicio de bajada", "Bajada completada.", Main)
Notification1.AutoCancel = True
Notification1.Notify(1)
End If
End Sub
Sub Service_Destroy
End Sub
|
Bien, ya lo tenemos bajado a la SdCard. Lo podemos ver conociendo el tutorial de LINUX en Android que he puesto en otra página.
Entraríamos en adb -e shell
y luego
# cd /mnt/sdcard
# ls -l
Debe haber un archivo llamado jquery.mobile-1.2.1.zip
También observamos el directorio Descomprimido creado al descomprimir jquery.mobile-1.2.1.zip, como veremos en el siguiente apartado.
En caso que el archivo jquery.mobile-1.2.1.zip y el directorio Descomprimido ya existieran, porque se han bajado previamente, las nuevas bajadas y descomprensiones sobreescribirán al archivo y directorio viejo.
Hay que tener en cuenta que el archivo tiene un tamaño de unos 3 MB, por lo cual tardará un poco en bajar.
________________________________________________________________________________
2.- Lo segundo descomprimir el archivo bajado en un directorio de la SdCard y visualizarlo en un WebView.
Código del programa en Basic4Android
|
Continuamos con la misma aplicación que estamos realizando.
En este caso nos basamos en el ejemplo que viene con la librería ABZipUnzip.
- Marcamos la librería ABZipUnzip
- Añadimos al Layout un WebView y un Button2
- En el Text del Button1 ponemos Bajar/Descomprimir y
en el Text del Button2 Ver/Inicio
- Modificamos el código principal de esta manera... |
|
Código del programa en Basic4Android
|
Sub Process_Globals
' Adaptado por Juan Antonio Villalpando
' juana1991@yahoo.com
Dim myZip As ABZipUnzip ''''''' NUEVO
End Sub
Sub Globals
Dim Button1 As Button
Dim WebView1 As WebView ''''''' NUEVO
Dim sdRoot As String
sdRoot = File.DirRootExternal & "/"
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("1")
End Sub
Sub Activity_Resume
'check if download has finished while the activity was paused
If Button1.Enabled = False AND DownloadService.JobStatus = DownloadService.STATUS_DONE Then
FinishDownload
End If
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
Activity.Color = Colors.Black
DownloadService.URL = "http://kio4.com/b4a/programas/jquery.mobile-1.2.1.zip"
DownloadService.Target = File.OpenOutput(File.DirRootExternal, "jquery.mobile-1.2.1.zip", False)
StartService(DownloadService)
Button1.Enabled = False
End Sub
Sub FinishDownload
Button1.Enabled = True
DownloadService.JobStatus = DownloadService.STATUS_NONE
''''''' NUEVO
If File.ExternalWritable = False Then
Msgbox("No se puedes escribir en la SdCard.", "")
End If
' Descomprime en /mnt/sdcard/Descomprimido
File.MakeDir(sdRoot, "Descomprimido")
myZip.ABUnzip(sdRoot & "jquery.mobile-1.2.1.zip", sdRoot & "Descomprimido")
Msgbox("Bajado y Descomprimido.","")
' Visualización
WebView1.LoadUrl("file:///mnt/sdcard/Descomprimido/jquery.mobile-1.2.1/demos/index.html")
End Sub
Sub Button2_Click
' Visualización
WebView1.LoadUrl("file:///mnt/sdcard/Descomprimido/jquery.mobile-1.2.1/demos/index.html")
End Sub
|
En el código anterior he utilizado la variable sdRoot y en otra ocasión el File.DirRootExternal, se podría haber abreviado y utilizar en las dos ocasiones una u otra forma ya que se refiere al mismo directorio, la diferencia es la barra /.
El sdRoot y el File.DirRootExternal son la SdCard.
El Servicio DownloadService es el mismo que antes.
_______________
- Comentario.
Podemos crear en nuestro ordenador un sitio web que luego lo comprimiremos y subiremos ese archivo comprimido a un hosting de Internet (recomiendo el gratuito http://byethost.com/).
Hacemos la aplicación cambiando la dirección web que he puesto en mi ejemplo.
De esta manera cuando actualicemos el sitio web le enviaremos un correo al usuario para que vuelva a bajar el archivo comprimido del sitio.
En vez de un correo podríamos instalar en la aplicación un servicio de manera que cuando actualicemos el sitio se comunicaría al servicio instalado en el móvil del usuario que hay una nueva actualización de nuestro sitio. Aunque esto cargaría el móvil del usuario ya que instalar un servicio equivaldría a que el móvil del usuario debiera comprobar diariamente si hay una nueva actualización.
__________________________________________
- Al pulsar un Botón debe salir una web...
Sub Button1_Click
Dim i As Intent
i.Initialize(i.ACTION_VIEW, " http://www.google.com " )
StartActivity (i)
End Sub
_________________________________________________________________ - Al pulsar un Botón debe salir un archivo que tenemos en la SDCard...
Sub Button1_Click
Dim i As Intent
i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(File.DirRootExternal, "dibujo.jpg"))
i.SetType("image/*")
StartActivity(i)
End Sub
________________________________
|