Spanish Abrir imagen con su ruta

RAFA BRAVO

Active Member
Licensed User
Longtime User
Hola buenas tardes. Me gustaría poder abrir una imagen teniendo su ruta, para poder copiarla a una imageview por ejemplo. Es posible? Gracias
 

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

No entiendo bien tu pregunta. Si te refieres a asignar una imagen a un imageview, puedes hacerlo con su ruta (el primer parámetro de LoadBitmap es la ruta de la imagen.

1605210442068.png
 

TILogistic

Expert
Licensed User
Longtime User
Si es desde una URL te aconsejo:

 

RAFA BRAVO

Active Member
Licensed User
Longtime User
lo que intento es subir a BD mySQL las variables dir As string y filename As string que recibo de elegir una imagen de la galería_

B4X:
Sub GetSelectedRecord (NameSelectedItem As String)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("selectedItem", Array(NameSelectedItem))
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    ProgressDialogShow("Cargado...")
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_Result(res As DBResult)
        'work with result
        'req.PrintTable(res)
'        Log(res.Columns)
        For Each row() As Object In res.Rows
            
            If Main.Status = "U" Then
                
                item_id = row(0)
                EditTextNameIU.Text = row(1)
                EditTextNumber.Text = row(2)
                EditTextMarcaIU.Text = row(3)
                Fecha = DateTime.now = row(4)
                EditTextPrecio.Text = row(5)
                Dirx = row(6)
                Filenamex = row(7)
                EditTextDescriptionIU.Text = row(8)
                
            Else
                If res.Rows.Size > 0 Then
                    ProgressDialogHide
                    Msgbox("Nombre ya en uso, cambie el nombre porfavor !","Fallo")
                End If
            End If
        Next
    Else
        Log("ERROR: " & j.ErrorMessage)
    End If
    
    If res.Rows.Size = 0 Then
    
        InsertRecord(EditTextNameIU.Text, EditTextNumber.Text, EditTextMarcaIU.Text, Fecha, EditTextPrecio.Text, Dirx, Filenamex,  EditTextDescriptionIU.Text)
    End If
    
    ProgressDialogHide
    j.Release
End Sub

Logro ver esas variables en la base de datos, incluso si regreso a man puedo ver la imagen en un ListView

main:
Sub GetRecord
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("selectAllItem", Null)

    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    ProgressDialogShow("Cargando...")
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_Result(res As DBResult)
        'work with result
        req.PrintTable(res)
'        Log(res.Columns)
        ListViewListTable.Clear
        For Each row() As Object In res.Rows
            Dim oBitMap As Bitmap
            Dirx = row(6)
            Filenamex = row(7)
            oBitMap = LoadBitmap(Dirx,Filenamex)
            ListViewListTable.TwoLinesAndBitmap.ImageView.Bitmap = oBitMap.Rotate(90)
            ListViewListTable.AddTwoLinesAndBitmap(row(1),  row(2) & "       Ver mas...", oBitMap)
        Next
    Else
        Log("ERROR: " & j.ErrorMessage)
    End If
    ProgressDialogHide
    j.Release
End Sub
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Pero al hacer click sobre ese ListView, refrescar la aplicación o cualquier otro movimiento, la aplicación falla. Este es el log:

log:
Registro conectado a:  Xiaomi Mi 9T
--------- beginning of system
--------- beginning of main
** Activity (insertandupdate) Pause, UserClosed = true **
** Activity (main) Create, isFirst = false **
** Activity (main) Resume **
Tag: null, Columns: 9, Rows: 1
Id    Name    numero    marca    data    price    dir    filename    description   
13    RAFA BRAVO    7655    GARMÍN        25€    ContentDir    content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FIMG_20201113_053223.jpg    Correa rota.   
** Activity (main) Pause, UserClosed = true **
** Activity (viewandedit) Create, isFirst = true **
** Activity (viewandedit) Resume **
Tag: null, Columns: 9, Rows: 1
Id    Name    numero    marca    data    price    dir    filename    description   
13    RAFA BRAVO    7655    GARMÍN        25€    ContentDir    content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FIMG_20201113_053223.jpg    Correa rota.   
viewandedit$ResumableSub_GetSelectedRecordresume (java line: 551)
java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at b4a.mySQL.viewandedit$ResumableSub_GetSelectedRecord.resume(viewandedit.java:551)
    at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:267)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:207)
    at anywheresoftware.b4a.keywords.Common$11.run(Common.java:1178)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6861)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
 

TILogistic

Expert
Licensed User
Longtime User
verifique que columna esta retornando null o vacio:

viewandedit$ResumableSub_GetSelectedRecordresume (java line: 551)
java.lang.NumberFormatException: empty String
 

TILogistic

Expert
Licensed User
Longtime User
Dirx = row(6)
Filenamex = row(7)
oBitMap = LoadBitmap(Dirx,Filenamex)


Dirx = ContentDir
Filenamex: content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FIMG_20201113_053223.jpg

Esta tratando de leer una imagen de una URL:

VER:

The images will be downloaded concurrently.
Tip about the code flow: Sleep and Wait For are equivalent to calling Return from the calling sub perspective.


1605458341009.png


B4X:
'Good example. Use.

Sub DownloadImage(Link As String, iv As ImageView)
   Dim job As HttpJob
   job.Initialize("", Me) 'note that the name parameter is no longer needed.
   job.Download(Link)
   Wait For (job) JobDone(job As HttpJob)
   If job.Success Then
     iv.SetImage (job.GetBitmap) 'replace with iv.Bitmap = job.GetBitmap in B4A / B4i
   End If
   job.Release
End Sub
 
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

Creo (no estoy seguro) que estás confundiendo algo. Supongo que esto viene al hilo de cuando estabas intentando guardar las imágenes en tu base de datos mysql como blob directamente, y luego viste que era mejor subir la imagen (bien por FTP, bien por HTTP) y almacenar sólo el nombre de la misma.
En realidad, en la base de datos no tienes que almacenar la ruta y el nombre de tu imagen en tu móvil, sino tienes que almacenar la ruta y el nombre de la imagen que toman en el servidor.

Imagina que tienes una imagen en tu móvil en la carpeta /storage/DCIM/imagen1.jpg
La quieres subir a tu servidor y almacenar su ruta, pero puede ocurrir que otra persona haya ya subido una imagen1.jpg. Lo que se hace habitualmente es renombrar la imagen en el servidor a un nombre único (por ejemplo, el usuario que está subiendo la imagen seguido de la fecha actual, por ejemplo: user1_20201115191100.jpg.
En tu servidor subes las imágenes a una carpeta por ejemplo "/upload". Bien, lo que tienes que almacenar en tu base de datos son el nombre "user1_20201115191100.jpg", y almacenas la ruta sólo en caso de que esta cambie, si no cambia, no hace falta almacenarla.
Supongo que cuando quieres volver a ver esa imagen, la descargas de tu servidor, entonces vas a tu base de datos, lees el nombre, y si la ruta la conoces, entonces en tu app ya sabes que tienes que descargar la imagen "https://miservidor.com/uploads/ & campo_nombreBD".

No sé si me he explicado bien, o si tiene que ver con lo que te pasa.
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Si José, está relacionado con el anterior hilo. Entiendo la forma de hacerlo ahora que me lo explicas,buscare ejemplos con FTP. Yo inserto los datos desde el teléfono y luego puedo visualizarlos en mySQL y en un Listview desde el teléfono. Entonces pensé que subiendo los archivos de dir y filename podría abrir la imagen en el ListView junto al resto de datos. En un principio sí la veo pero al pulsar en ListView la aplicación falla con ese error. De la forma que yo lo intento no es posible hacerla funcionar? Gracias
 

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

Lo que ocurre es que finalmente, estás viendo la imagen desde tu teléfono, por lo que no entiendo el que quieras guardarla en la base de datos. ¿Qué ocurre si el usuario borra la imagen?

En relación al error que te da, entiendo que pone "Broken Link" (lo ha traducido como correa rota).
¿Qué código tiene el evento _click de tu imageview?
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Si eso lo entiendo, las imágenes solo las utilizo en el teléfono como aporte visual. El resto de datos si los paso finalmente a un Exel, pero las imágenes no, por eso quería intentar hacerlo así, para que la imagen vaya en acordé al resto de datos que subo. En cuanto a si se borra la imagen ya lo había pensado, poner algún mensaje de imagen borrada. También tengo un layout donde edito los items y puedo cambiar o añadir nueva imagen.
En relación al error que te da, entiendo que pone "Broken Link" (lo ha traducido como correa rota).
¿Qué código tiene el evento _click de tu imageview?
Te refieres al evento click del ListView? No tengo demasiado, simplemente una llamada al módulo donde muestro en lavels y un imageView todos los datos subidos.
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Pero el error no creo que esté en ese evento click, porque también aparece al actualizar los datos del ListView o al volver a insertar otro ítem. Lo curioso es que si sube los datos y en principio consigo ver el ListView con la imagen y los otros dos datos subidos.
En relación al error que te da, entiendo que pone "Broken Link" (lo ha traducido como correa rota).
¿Qué código tiene el evento _click de tu imageview?
Lo de correa rota no se si tiene relación pero una de las columnas que añado es la de averías del producto y en el ejemplo puse precisamente eso "correa rota."
 

josejad

Expert
Licensed User
Longtime User
Pero al hacer click sobre ese ListView, refrescar la aplicación o cualquier otro movimiento, la aplicación falla. Este es el log:
Ah, es cierto, lo indicabas arriba.
Parece que hay algún error al leer alguna imagen. Si lo ejecutas en modo debug, en qué línea te lanza el error?
oBitMap = LoadBitmap(Dirx,Filenamex)
Aquí creo que deberías comprobar primero si la imagen existe:
B4X:
If File.Exists(Dirx, Filenamex) Then
   oBitMap = LoadBitmap(Dirx,Filenamex)
else
    Log("La imagen no existe, asignar una imagen tipo 'Img no encontrada'")
End If
 
Last edited:

RAFA BRAVO

Active Member
Licensed User
Longtime User
introduzco ese código que me has recomendado :

B4X:
            Dirx = row(6)
            Filenamex = row(7)
            If File.Exists(Dirx, Filenamex) Then
                Dim oBitMap As Bitmap
                oBitMap.Initialize(Dirx,Filenamex)
                oBitMap = LoadBitmap(Dirx,Filenamex)
                ListViewListTable.AddTwoLinesAndBitmap(row(1),  row(2) & "       Ver mas...", oBitMap.Rotate(90))
            Else
                Log("La imagen no existe, asignar una imagen tipo 'Img no encontrada'")
            End If
y ya no me aparece el error, pero claramente no encuentra el archivo y aparece el log de imagen no encontrada. de hay el error inicial. lo que me parece raro es que al subir los datos si la encuentre, pero si realizo cualquier acción ya no. también falla si salgo y vuelvo a entrar en la aplicación.
 

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

Ya me pierdo un poco porque son cosas que no he usado nunca, pero creo que los tiros van por aquí.
- No sé de qué manera estás seleccionando la foto para añadirla al imageview (contentchooser?)
- Creo que la ruta que estás obteniendo, no es la ruta real de tu imagen, sino una URI (content://), pero la ruta real debe ser algo como " /storage/emulated/0/DCIM/Camera/image_name.jpg"
- Echa un vistazo a estos enlaces a ver si te aclaran más el tema.

 

josejad

Expert
Licensed User
Longtime User
Esta tratando de leer una imagen de una URL
Ya comentaba oparra algo al respecto. ContentChooser te puede devolver una ruta física de tu teléfono, pero también un enlace a google Drive si seleccionas una imagen de ahí, y cosas así
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Hola José referente al enlace que me pasaste en el otro hilo:

Decirte que ya lo utilizo, en el activity donde inserto y actualizo datos al mySQL uso ese código para añadirle a un imageView la imagen de la galería. Puedo iniciar un bitmap en contentchooser y pasarlo a los los demás activitys? Maine por ejemplo?
 

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

Como te comenté no lo he usado nunca, así que no te sabría decir.
¿Podrías subir un proyecto simple de lo que quieres hacer (sin la parte de la base de datos, ya guardaremos lo que necesites en local con kvs o sqlite) con el imageview y el contentchooser y hacemos alguna prueba?

saludos,
 

edgar_ortiz

Active Member
Licensed User
Longtime User
Hola José referente al enlace que me pasaste en el otro hilo:

Decirte que ya lo utilizo, en el activity donde inserto y actualizo datos al mySQL uso ese código para añadirle a un imageView la imagen de la galería. Puedo iniciar un bitmap en contentchooser y pasarlo a los los demás activitys? Maine por ejemplo?

Rafa,

Declara la imagen como GLOBAL en el "starter" y la tienes disponible en cualquier activity.

Saludos,

Edgar
 

RAFA BRAVO

Active Member
Licensed User
Longtime User
Esta es mi prueba:

En main tengo un ListView donde muestro algunos datos de mySQL y una imagen. el siguiente activity acedo al pulsar un item del ListView y muestro todos los datos de mySQL y la imagen en un imageView. y en el tercer activity inserto y actualizo los datos en la base de datos. también elijo la imagen con contentchooser. lo que quiero conseguir es cada vez que inserte los datos en mySQL poder mostrar en listView y en el imageView la imagen con los demás datos. Que opción puede ser la mejor. Gracias
 

Attachments

  • prueba SQL x.zip
    9.6 KB · Views: 155
Top