Spanish Mostrar imagenes url

Jorgelcr

Active Member
Licensed User
Hola,

Necesito ayuda, estoy comenzando a realizar una app, guardo los datos en una BD Msyql, en uno de los campos guardo la dirección de la imagen la cual la he subido por FTP.

No consigo poder mostrar la imagen cuando muestro los datos de las tabla.

Alguien puede ayudarme?
 

inakigarm

Well-Known Member
Licensed User
Hola, no acabo de entender cúal es el problema.
Cuando recuperes la URL de la imagen, puedes mostrar la imagen en un webview o descargarla en local (con Okhttp o FTP) y mostrarla en un imageview
 

Jorgelcr

Active Member
Licensed User
Hola,

Es lo que intento, te paso parte de mi codigo:

For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
tl.First = m.Get("Nombre")
tl.Second = "Lat: " & m.Get("Latitud")& "-" & "Long: " & m.Get("Longitud")

If m.Get("logo")=Null Then
ListView1.AddTwoLines(tl.First,tl.Second)
Else

imageurl2 = "http://www.miweb.com/desnivel.jpg"
ListView1.AddSingleLine(m.Get("Nombre"))
HttpUtils.Download("Job1", imageurl2)



If HttpUtils.IsSuccess(imageurl2) Then
Msgbox("hola","ase")
Dim b As Bitmap
b = HttpUtils.GetBitmap(imageurl2)
Activity.SetBackgroundImage(b)

ListView1.AddTwoLinesAndBitmap (tl.First,tl.Second,LoadBitmap(HttpUtils.GetBitmap(imageurl2)))

End If
 

inakigarm

Well-Known Member
Licensed User
Jorge, cuando adjuntes código mejor adjúntalo seleccionando la opción CODE porque se lee mucho mejor:

upload_2016-11-13_18-8-26.png

Preguntas:
- Entiendo que utilizas la librería OKHttp y OkHttpUtils2 y no las antiguas Http y HttpUtils2
- En httputils.download tienes 2 parámetros cuando sólo es uno (la URL)
upload_2016-11-13_18-21-26.png
 

Jorgelcr

Active Member
Licensed User
Hola,

Lo estaba haciendo con HttpUtils2.

Puedo asignar la imagen a un imageview directamente con getbitmap?

imagview1.bitmap =httpdownload.getbitmap
 

Jorgelcr

Active Member
Licensed User
No consigo añadir al listview la imagen que tengo en el ftp.
Puedes ponerme un ejemplo porfavor?
 

inakigarm

Well-Known Member
Licensed User
Cuando hablas que lo tienes en FTP, tienes acceso por Http ?? (lo ves si accedes directamente con el navegador?)
 

Jorgelcr

Active Member
Licensed User
Si que puedo acceder, lo veo cuando entro en el FTP.
Recorro los registros de la tabla y muestro el nombre.Lo que estoy intentando mostrar es el logo que tengo guardado en el ftp mediante:

ListView1.AddTwoLinesAndBitmap (tl.First,tl.Second,LoadBitmap(httpdownload.GetBitmap(imageurl2)))

pero no lo consigo
 

inakigarm

Well-Known Member
Licensed User
Tienes que asignar el bitmap al imageview dentro del evento Jobdone del http (si job.success=True)

okhttputils es asíncrono y no cargará el imageview hasta que no lo obtenga en JobDone (mira este Post)
 

Carlos marin

Active Member
Licensed User
Hola amigo, mira yo utilizo un servicio de erel para descargar la imagen del servidor y mostrarla en tu app. mira te comparto

Aqui llamas el servicio
B4X:
Dim links As Map
             links.Initialize
             links.Put(imageview, "http://ruta donde esta tu imagen" )
             CallSubDelayed2(ImageDownloader, "Download", links)

y este es el codigo del servicio

B4X:
Sub Download (ImageViewsMap As Map)
    For i = 0 To ImageViewsMap.Size - 1
        tasks.Put(ImageViewsMap.GetKeyAt(i), ImageViewsMap.GetValueAt(i))
        Dim link As String = ImageViewsMap.GetValueAt(i)
        If cache.ContainsKey(link) Then
            Dim iv As ImageView = ImageViewsMap.GetKeyAt(i)
            iv.SetBackgroundImage(cache.Get(link))
               
        Else If ongoingTasks.ContainsKey(link) = False Then
            ongoingTasks.Put(link, "")
            Dim j As HttpJob
            j.Initialize(link, Me)
            j.Download(link)
        End If
    Next
End Sub

Sub JobDone(Job As HttpJob)
    ongoingTasks.Remove(Job.JobName)
    If Job.Success Then
        Dim bmp As Bitmap = Job.GetBitmap
        cache.Put(Job.JobName, bmp)
        If tasks.IsInitialized Then
            For i = 0 To tasks.Size - 1
                Dim link As String = tasks.GetValueAt(i)
                If link = Job.JobName Then
                    Dim iv As ImageView = tasks.GetKeyAt(i)
                    iv.SetBackgroundImage(bmp)
                End If
            Next
        End If
    Else
        Log("Error downloading image: " & Job.JobName & CRLF & Job.ErrorMessage)
    End If
    Job.Release
End Sub
Sub ActivityIsPaused
    tasks.Clear
End Sub
y listo!, cada que necesites bajar una foto en cualquier activity de tu app solo llama este servicio, nunca falla. saludos!!!!
 

Jorgelcr

Active Member
Licensed User
Hola,

Estoy perdido y desesperado, cuanto más miro e investigo más me pierdo.
Unas preguntas Carlos:
- Hablas de código de servicio, que quieres decir, que este código va en un módulo de servicio o puede estar en el mismo modulo que el código anterior y es sólo una funcion.
- En el ejemplo que has puesto tienes los comandos tasks y ongoingTasks ¿Donde los declaras?
- Se necesitan algunas librerias?

Gracias de antemano.
 

Jorgelcr

Active Member
Licensed User
Hola,

Lo he conseguido pero a medias. Me carga la misma imagen en todas las lineas

B4X:
Select job.JobName
        Case "Job1"
            If job.Success Then
                Dim res As String
                res = job.GetString
                Log("Response from server: " & res)
                Dim parser As JSONParser
                parser.Initialize(res)
                COUNTRIES = parser.NextArray 'returns a list with maps   
                For i = 0 To COUNTRIES.Size - 1
                    m = COUNTRIES.Get(i)       
                    If m.Get("logo")=Null Then
                        ListView1.AddTwoLines(m.Get("Nombre"),"Lat: " & m.Get("Latitud")& "-" & "Long: " &  m.Get("Longitud"))
                    Else
                        imageurl2 = "http://www.miweb.com/logo/" & m.Get("logo")
                        json.Initialize(job.GetString)
                        job2.Initialize("Image",Me)
                        job2.Download(imageurl2)
                        
                       
                    End If
                Next
            End If       
        Case "Image"
            ListView1.AddTwoLinesAndBitmap(m.Get("Nombre"),m.Get("Localidad"),job2.GetBitmap)
 

Carlos marin

Active Member
Licensed User
Hola,

Estoy perdido y desesperado, cuanto más miro e investigo más me pierdo.
Unas preguntas Carlos:
- Hablas de código de servicio, que quieres decir, que este código va en un módulo de servicio o puede estar en el mismo modulo que el código anterior y es sólo una funcion.
- En el ejemplo que has puesto tienes los comandos tasks y ongoingTasks ¿Donde los declaras?
- Se necesitan algunas librerias?

Gracias de antemano.

Hola jorge, el segundo codigo pegalo en un modulo de servicio aparte, y lo llamas mediante la funcion CallSubDelayed2(ImageDownloader, "Download", links)
si disculpa sobre las variables, te paso todo el modulo de servicio que tengo, tu ya lo acomodas a tu proyecto

B4X:
Sub Process_Globals
    Private cache As Map
    Private tasks As Map
    Private ongoingTasks As Map
End Sub

Sub Service_Create
    tasks.Initialize
    cache.Initialize
    ongoingTasks.Initialize
    nativeMe.InitializeContext
End Sub

Sub Service_Start (StartingIntent As Intent)
   
End Sub

Sub Service_Destroy
End Sub

Sub Download (ImageViewsMap As Map)
    For i = 0 To ImageViewsMap.Size - 1
        tasks.Put(ImageViewsMap.GetKeyAt(i), ImageViewsMap.GetValueAt(i))
        Dim link As String = ImageViewsMap.GetValueAt(i)
        If cache.ContainsKey(link) Then
            Dim iv As ImageView = ImageViewsMap.GetKeyAt(i)
            iv.SetBackgroundImage(cache.Get(link))
           
                   
        Else If ongoingTasks.ContainsKey(link) = False Then
            ongoingTasks.Put(link, "")
            Dim j As HttpJob
            j.Initialize(link, Me)
            j.Download(link)
        End If
    Next
End Sub

Sub JobDone(Job As HttpJob)
    ongoingTasks.Remove(Job.JobName)
    If Job.Success Then
        Dim bmp As Bitmap = Job.GetBitmap
        cache.Put(Job.JobName, bmp)
        If tasks.IsInitialized Then
            For i = 0 To tasks.Size - 1
                Dim link As String = tasks.GetValueAt(i)
                If link = Job.JobName Then
                    Dim iv As ImageView = tasks.GetKeyAt(i)
                    iv.SetBackgroundImage(bmp)
                          
                End If
            Next
        End If
    Else
        Log("Error downloading image: " & Job.JobName & CRLF & Job.ErrorMessage)
    End If
    Job.Release
End Sub
Sub ActivityIsPaused
    tasks.Clear
End Sub

trabaja con la libreria okhttpultis2. pruebalo y me comentas. saludos
 

Jorgelcr

Active Member
Licensed User
Hola,

Lo he probado y no hace nada, he creado un modulo service que se llama ImageDownloader y he pegado el código que me has pasado, y en el main tengo el siguiente codigo:

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
Dim imageview As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("principal")
    imageview.Initialize("")
    Dim links As Map
    links.Initialize
        links.Put(imageview, "http://www.miweb.com/logo/desnivel.jpg" )
    CallSubDelayed2(ImageDownloader, "Download", links)
End Sub
y no hace nada :(
 

Carlos marin

Active Member
Licensed User
hola jorge, ya lo reviso paso a paso?? para ver si, si entra al modulo, también mira el tamaño de la imagen pues cuanto mas grande mas se demora en bajarlo. prueba con una imagen de muy poco tamaño. jorge otra cosa es que las imagenes que yo subia eran jpeg y a veces me confundia (jpg, jpeg) con la extencion y ps no me cargaban. intenta tambien cargar esa ruta en el navegador y te debe abrir la imagen. pruebalo y nos comentas, saludos
 
Last edited:

Jorgelcr

Active Member
Licensed User
No hace nada, no entra. Las imagenes tiene ruta correcta y ocupan muy poco 160 kb aproximadamente.

Con el codigo que puse yo antes consigo mostrar el nombre del logo. El problema que tengo es que quiero mostrar la imagen dentro de un bucle que estoy recorriendo para mostrar mas datos. Si dentro del bucle hago la llamada para mostrar la imagen no me lo hace ya que primero muestra todo el bucle y despues hace la llamada a mostrar la imagen y sólo me muestra la imagen del ultimo registro. No sé si me explico bien
 

Carlos marin

Active Member
Licensed User
No hace nada, no entra. Las imagenes tiene ruta correcta y ocupan muy poco 160 kb aproximadamente.

Con el codigo que puse yo antes consigo mostrar el nombre del logo. El problema que tengo es que quiero mostrar la imagen dentro de un bucle que estoy recorriendo para mostrar mas datos. Si dentro del bucle hago la llamada para mostrar la imagen no me lo hace ya que primero muestra todo el bucle y después hace la llamada a mostrar la imagen y sólo me muestra la imagen del ultimo registro. No sé si me explico bien

Hola jorge, me puedes mostrar el proyecto o por lo menos esa parte para mirar. así yo también reviso y ps miro en que puedo ayudarte. muy raro que no te entre al modulo cuando lo llamas. muestrame tambien la ruta del la imagen para probar
 
Top