- Presentación.
- Mediante el WebView podemos realizar un navegador web.
____________________________
- Designer. Layout.
Creamos los controles
|
Si consultamos la Guía oficial, podemos aprender a insertar más código para mejorar nuestra aplicación.
Guía oficial
Las librerías constan de un par de archivos de la forma:
WebViewExtras.jar
WebViewExtras.xml
que se encuentran en la subcarpeta Libraries donde está instalado el Basic4Android:
C:\Program Files (x86)\Anywhere Software\Basic4android\Libraries
|
Insertamos mediante
Designer / Add View
Button1 Text = Ir
EditText1
WebView1
Guardamos el Designer:
File / Save : Layout
Una vez cargado el Designer en el emulador, podemos ubicar los controles donde queramos.
Cargamos la librería:
WebViewExtras
|
____________________________
- Código (copia y pega).
Código del programa en Basic4Android
|
'Activity module
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
End Sub
Sub Globals
Dim WebView1 As WebView
Dim Button1, Button2 As Button
Dim EditText1 As EditText
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout") ' Cargamos el Designer
End Sub
Sub Button1_Click
WebView1.LoadUrl("http://" & EditText1.Text)
' EditText1.Text = WebView1.Url
End Sub
|
___________________________________
1.- Bajar un archivo de internet a la tarjeta de memoria SD.
En este caso se trata de bajar un archivo de internet, concretamente...
http://www.basic4ppc.com/android/images/logo2.png
a un directorio de la tarjeta de memoria SD.
Debemos crear un Layout llamado "layout" con un Button1, Button2 y un ImageView.
Este ejemplo no trata de visualizar una página web, simplemente trata de bajar un archivo, en este caso una imagen.
También debemos marcar la librería HTTP (version x.xx)
- Además debemos cargar dos módulos: HttpUtils.bas y HttpUtilsService.bas
NOTA: las nuevas versiones de B4A ya traen incorporada la librería HttpUtils2, no hace falta bajarla de los foros, solo necesitamos marcarlas para activarlas.
Estos módulos lo podemos bajar de esta página del foro:
Bajamos y descomprimimos HttpUtilsExample.zip y copiamos los archivos HttpUtils.bas y HttpUtilsService.bas en la carpeta de nuestro proyecto.
Ahora debemos agregar estos módulos a nuestro proyecto, para ello vamos a Project / Add Existing Module
Ya los tenemos...
Código del programa en Basic4Android
|
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
Dim imageUrl As String
imageUrl = "http://www.basic4ppc.com/android/images/logo2.png"
End Sub
Sub Globals
Dim ImageView1 As ImageView
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("layout")
HttpUtils.CallbackActivity = "Main"
HttpUtils.CallbackJobDoneSub = "JobDone"
HttpUtils.CallbackUrlDoneSub = "UrlDone"
End Sub
Sub Activity_Resume
If HttpUtils.Complete = True Then JobDone(HttpUtils.Job)
End Sub
Sub UrlDone(Url As String)
Log(Url & " terminado ")
End Sub
Sub JobDone (Job As String)
If HttpUtils.IsSuccess(imageUrl) Then
Dim out As OutputStream
' out = File.OpenOutput(File.DirRootExternal & "/" & "directorio_sd", "logo2.png", True)
out = File.OpenOutput(File.DirRootExternal & "/", "logo2.png", True)
File.Copy2(HttpUtils.GetInputStream(imageUrl), out)
out.Close
End If
End Sub
Sub Button1_Click
HttpUtils.Download("Job1", imageUrl)
End Sub
Sub Button2_Click
Dim b As Bitmap
b = HttpUtils.GetBitmap(imageUrl)
ImageView1.Bitmap = HttpUtils.GetBitmap(imageUrl)
End Sub
|
____________________________
- Comentarios.
- Cuando pulsamos el Button1, la imagen se guarda en una carpeta.
- Cuando pulsamos el Button2, la imagen se muestra en el ImageView1.
____________
Podríamos haber puesto esta línea...
out = File.OpenOutput(File.DirInternal & "/" , "logo2.png", True)
en este caso el archivo se guardaría en la memoria interna, en el caso del emulador se guardaría en...
/data/data/<yourpackagename>/files
<yourpackagename> podría ser anywheresoftware.b4a.samples.programa
La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta
cd /data/data/anywheresoftware.b4a.samples.programa/files
ls
Esto lo vimos en el tutorial dedicado a LINUX en el B4A, mediante adb -e shell
A este archivo solo se puede acceder desde el mismo programa, pero no desde otro programa.
___________________________________
2.- Otra forma de hacerlo con una nueva versión de HttpUtils2.
Consultamos este ejemplo con HTTPutils2.
Bajamos una imagen mediante:
job3.Download("http://www.basic4ppc.com/forum/images/categories/android.png")
y luego la presentamos en el Activity (o un ImageView) mediante:
Activity.SetBackgroundImage(Job.GetBitmap)
(Si quisiéramos guardar la imagen en un directorio utilizaríamos: File.Copy2 y Job.GetInputStream, como hemos visto anteriormente.)
___________________________________
3.- Otra forma más de hacerlo.
Está basado en este mensaje del foro.
(Consulta también este mensaje.)
En este caso vamos a bajar el archivo logo2.png y cuando pulsamos el Button1 lo visualizamos en el ImageView1
En este proyecto no es necesario los módulos HttpUtils.
Crea un layout con un Button1 y un ImageView1. Activamos la librería HTTP.
Código del programa en Basic4Android
|
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
End Sub
Sub Globals
Dim ImageView1 As ImageView
Dim hcimage As HttpClient
Dim reqimage As HttpRequest
Dim pic As String
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("layout")
pic = "logo2.png"
End Sub
Sub Activity_Resume
End Sub
Sub hcimage_ResponseSuccess(Response As HttpResponse, TaskId As Int)
' Baja el archivo y lo guarda en la sdcard
Response.GetAsynchronously("ImageResponse", _
File.OpenOutput(File.DirRootExternal & "/" , pic, False), True, TaskId)
End Sub
Sub Button1_Click
' Toma el archivo de la sdcard y lo pone en el ImageView1
Dim imagepath As String
imagepath = "http://www.basic4ppc.com/android/images/" & pic
reqimage.InitializeGet(imagepath)
hcimage.Execute(reqimage, 1)
ImageView1.Bitmap = LoadBitmap(File.DirRootExternal, pic)
End Sub
|
___________________________________
4.- Otra manera de hacerlo.
Esto también está publicado en los tutoriales de B4A, concretamente en esta página.
- Debemos marcar la librería: HTTP
- Mediante el Designer creamos un Layout y lo llamamos: 1
- El Layout debe tener un Button llamado: btnDownload
Código del programa en Basic4Android
|
'Activity module
Sub Process_Globals
Dim image As Bitmap
End Sub
Sub Globals
Dim btnDownload As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("1")
'check if we already loaded the image previously.
If image.IsInitialized Then
Activity.SetBackgroundImage(image)
End If
End Sub
Sub Activity_Resume
'check if download has finished while the activity was paused
If btnDownload.Enabled = False AND DownloadService.JobStatus = DownloadService.STATUS_DONE Then
FinishDownload
End If
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub btnDownload_Click
Activity.Color = Colors.Black
DownloadService.URL = "http://www.basic4ppc.com/basic4android/images/designer1.png"
DownloadService.Target = File.OpenOutput(File.DirInternalCache, "image.png", False)
StartService(DownloadService)
btnDownload.Enabled = False
End Sub
Sub FinishDownload
'Load the saved image
If DownloadService.DoneSuccessfully = True Then
image = LoadBitmapSample(File.DirInternalCache, "image.png", _
100%x, 100%y)
Activity.SetBackgroundImage(image)
End If
btnDownload.Enabled = True
DownloadService.JobStatus = DownloadService.STATUS_NONE
End Sub
|
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
|
'Service module
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("Download Service example", "Downloading: " & 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 downloading file: " & 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 downloading file: " & LastException.Message, True)
Else
ToastMessageShow("Download successfully.", True)
End If
DoneSuccessfully = Success
Finish
End Sub
Sub Finish
Log("Service finished downloading")
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("Download Service", "Download complete", Main)
Notification1.AutoCancel = True
Notification1.Notify(1)
End If
End Sub
Sub Service_Destroy
End Sub
|
___________________________________
5.- Bajar varios archivos.
Utiliza la librería HttpUtils2
Para bajar varios archivos consulta este tutorial.
___________________________________
6.- Bajar un archivo de gran tamaño.
Utiliza la librería HttpUtils2
Para bajar varios archivos consulta este tutorial.
___________________________________
- Recordamos varios lugares de directorios.
DirAssets es el directorio del programa C:\Android\<Programa>\Files
es un directorio de solo lectura, por lo tanto no podemos (desde el programa), cambiar nada en él.
DirRootExternal es un directorio en la tarjeta de memoria SD de nuestro móvil. Si en la tarjeta de nuestro móvil tenemos un directorio que se llama Fotos, podemos ir a ese directorio de esta manera...
out = File.OpenOutput(File.DirRootExternal & "/" & "Fotos", "foto2.jpg", True)
DirInternal es un directorio existente en nuestro Programa y que solo podemos acceder mediante ese Programa.
Para ver el listardo de archivos en ese directorio, lo debemos hacer mediante el shell del LINUX, esto lo he comentado anteriormente y se explica con más detalle en el tutorial LINUX. Este directorio se encuentra en una subcarpeta de nuestro Programa, pero no podemos verlo mediante el Explorador de Windows.
out = File.OpenOutput(File.DirInternal & "/" , "logo2.png", True)
La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta
cd /data/data/<anywheresoftware.b4a.samples.programa>/files
ls
DirDefaultExternal es el directorio por defecto de la aplicación en el móvil. Se puede acceder a él cualquier aplicación mediante la ruta [external device]/Android/data/[package name]/files/
DirInternalCache
_____________________________________________
- Introducir datos en un casillero de un formulario de una página web directamente desde nuestro código.
Este código también lo he visto en los foros y me ha resultado curioso.
Entras en esta página: http://www.aangepastlezen.nl/home/boeken
Ves que hay un casillero: "Zoek in de collectie boeken" donde podemos escribir algo.
Se trata de que cuando entremos en la página, desde nuestro código rellene ese casillero automáticamente.
Vamos a... este envío de los foros y bajamos WebViewFormInput.zip
La línea en la que debemos fijarnos es...
Javascript.Append("document.forms.masterform.ContentPlaceHolderDefault_MainContent_MainContentPage_ctl02_SearchInOlc_7_SearchTerms.value='this is some text';")
this is some text es el texto que aparecerá en el casillero cuando cargemos la página.
No te funciona.
ContentPlaceHolderDefault_MainContent_MainContentPage_ctl02_SearchInOlc_7_SearchTerms
esa parte es el nombre del formulario. Ahí debes poner el nombre del formulario donde está el casillero.
Veamos el código fuente de la página...
localiza esta parte...
<div id =" readspeaker1 "> |
|
<p> </p> |
|
|
|
<div id =" zoeken " onkeypress =" javascript:return WebForm_FireDefaultButton(event, 'ContentPlaceHolderDefault_MainContent_MainContentPage_ctl02_SearchInOlc_8_SearchButton') "> |
|
|
|
<fieldset> |
En el código que has bajado hay un 7 y en el de la página actualizada hay un 8, cambia el 7 por el 8.
Para que además pulse el botón automáticamente pondríamos debajo de la línea de nuestro código:
Javascript.Append("document.forms.masterform.ContentPlaceHolderDefault_MainContent_MainContentPage_ctl02_SearchInOlc_8_SearchButton.click()")
_______________________________________________
- Orientación horizontal - vertical de una página web.
- Consulta este ejemplo del foro y baja la aplicación PreserveURLOnScreenRotation.zip.