Spanish [SOLUCIONADO] Extraer el nombre y la extensión de una imagen de la galería

tomky

Active Member
Licensed User
Hola.

Estamos siguiendo las instrucciones de https://www.b4x.com/android/forum/t...ia-de-imagenes-solucionado.51087/#post-371718, incluida la subida FTP que nos funciona.

Pero esta manera no te dice la extensión de la imagen que subes, pudiendo asignar jpg a un archivo que en realidad es png.

¿Cómo puedes averiguar la extensión de la imagen de la galería para subirla como tal?
¿Hay otra manera de abrir la galería de imágenes extrayendo el nombre real y extensión de la imagen?

Gracias.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Tomky

Puedes gestionar las imagenes/videos, etc de la galeria asi:

B4X:
Sub Globals
Dim VerGaleriaFotos As ContentChooser
...

Sub Activity_Create(FirstTime As Boolean)
  VerGaleriaFotos.Initialize("EventoGaleriaFotos")
...

' para que salga la galeria y selecciones imagen
VerGaleriaFotos.Show("image/*", "Seleccione Imagen")



Sub EventoGaleriaFotos_Result (Success As Boolean, Dir As String, FileName As String)
' en su evento coges los datos   
       
End Sub


Saludos
 

tomky

Active Member
Licensed User
Gracias Bgsoft.
Pero de esa manera, me dice que el directorio es "ContentDir" y como nombre de archivo "content://media/external/images/media/6513".

Además me indica el log: "Downsampling image due to lack of memory.".

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Gracias Bgsoft.
Pero de esa manera, me dice que el directorio es "ContentDir" y como nombre de archivo "content://media/external/images/media/6513".

Además me indica el log: "Downsampling image due to lack of memory.".

Saludos.

Que mas da donde te diga que está el directorio y el nombre de la imagen? son datos que maneja Android pero que son buenos, yo los empleo en algunas aplicaciones sin ningún problema. Ademas, puedes copiar la imagen desde donde te dice que está a donde tu quieras si necesitas un nombre mas real.
B4X:
Sub EventoGaleriaFotos_Result (Success As Boolean, Dir As String, FileName As String)
  
    
     If Success = False Then Return
    
     DirImagen = el que tu quieras
     NombreImagen = "foto.jpg" ' la que tu quieras
     Try
       File.Copy (Dir,FileName, DirImagen,NombreImagen)
     Catch
       Log("Error al copiar imagen cogida de la galeria")
     End Try
    


           
End Sub

Saludos
 

tomky

Active Member
Licensed User
Hola BgSoft.

Entiendo tu idea de que puedo ponerle el nombre y extensión que yo quiera al copiarla, pero nuestro problema es que al copiarla no sé cuál es su extensión correcta (jpg, png...)

Y a la hora de subirla al servidor mediante
B4X:
FTP.UploadFile(DirSeleccionado, ImagenSeleccionada, False, "/imagenes/" & nomImatge & "_" & id_usuario & ".jpg")
tengo que ponerle yo otra vez la extensión a mano.

¿Hay alguna manera de gestionar las extensiones con B4A?

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
¿Hay alguna manera de gestionar las extensiones con B4A?

Esto te va a costar un SUPERLIKE :D, era algo muy antiguo que ni me acordaba.


B4X:
Sub EventoGaleriaFotos_Result (Success As Boolean, Dir AsString, FileName AsString)

If Success = False Then Return

Dim jo As JavaObject
Dim cd As String = jo.InitializeStatic("anywheresoftware.b4a.objects.streams.File").GetField("ContentDir")
Dim UriString As String = GetPathFromContentResult(FileName)

log("UriString " & UriString) '---- Si no te devuelve nada, asume que es .jpg ---

End Sub

Sub GetPathFromContentResult(UriString As String) As String
  If UriString.StartsWith("/") Then Return UriString 'If the user used a file manager to choose the image
  Dim Cursor1 As Cursor
  Dim Uri1 As Uri
  Dim Proj() As String = Array As String("_data")
  Dim cr As ContentResolver
  cr.Initialize("")
  If UriString.StartsWith("content://com.android.providers.media.documents") Then
  Dim i As Int = UriString.IndexOf("%3A")
  Dim id As String = UriString.SubString(i + 3)
  Uri1.Parse("content://media/external/images/media")
  Cursor1 = cr.Query(Uri1, Proj, "_id = ?", Array As String(id), "")
  Else
  Uri1.Parse(UriString)
  Cursor1 = cr.Query(Uri1, Proj, "", Null, "")
  End If
  Cursor1.Position = 0
  Dim res As String
  res = Cursor1.GetString("_data")
  Cursor1.Close
  Return res
End Sub

Utiliza las librerias: SQL, ContentResolver y JavaObject



Saludos
 
Last edited:

tomky

Active Member
Licensed User
Sí BgSoft, era eso lo que buscábamos.
Te has ganado un like como una casa! :)
Muchas gracias!
Funciona perfectamente.

Un saludo.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola, me alegro que te funcione, tambien te puse un pequeño ejemplo en tu Post Colocación consecutiva de labels (por si no lo viste)

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Otra cosa, cuando resuelvas una pregunta, podrias añadir al título del post [SOLUCIONADO] ?
Es que así mejoramos el foro, ya que si alguien tiene tu problema y ve el solucionado encontrará la solución rapidamente , de otra forma tendria que entrar y comprobar si hay respuesta, y si no la hay buscar otra...

Aqui: https://www.b4x.com/android/forum/threads/mejorar-el-foro-“spanish-forum”.39799/
hay un post donde cada uno ponemos ideas para mejorar el foro, si tienes alguna exponla, asi lo mejoraremos.


Gracias

Saludos
 
Top