Spanish [Solucionado] Mostrar archivos en directorio DCIM y copiar alguno a otro directorio

vecino

Well-Known Member
Licensed User
Longtime User
Hola, estoy intentando mostrar las fotos y videos que se guardan en DCIM y quiero que el usuario pueda elegir una y se copie a un subdirectorio de mi aplicación.
Para empezar he encontrado este código en el foro:

B4X:
Sub Button1_Click
    Dim cc As ContentChooser
    cc.Initialize("cc")
    cc.Show("*/*", "")
    Wait For CC_Result (Success As Boolean, Dir As String, FileName As String)
    If Success Then
        Log(Dir)
        Log(FileName)
    End If
End Sub

Pero el log muestra:
ContentDir
content://com.android.providers.media.documents/document/image%3A6406

Sin embargo, el directorio es: /storage/0400-1E07/DCIM/Camera y la foto es: IMG_20220819_131042.jpg

¿Cómo puedo extraer el directorio y nombre correctos para copiarlos a, ejemplo: miaplicacion/files/fotos?
¡¡¡Gracias!!!
 

angel_

Well-Known Member
Licensed User
Longtime User
Creo que no se puede extraer la ruta pero sí copiar el archivo y pegarlo en otra carpeta algo como File.Copy...

Revisa también el hilo SaveAs quizás te sirva.
 

vecino

Well-Known Member
Licensed User
Longtime User
He podido copiarlo así usando esas variables Dir y FileName:
B4X:
Wait For (File.CopyAsync(Dir, FileName, ShCode.cDirMedia, cFileMedia)) Complete (Success As Boolean)
ShCode.cDirMedia es un subdirectorio dentro de mi aplicación y cFileMedia es el nombre con el que lo guardo.
Muchas gracias de nuevo.
Saludos.
 

vecino

Well-Known Member
Licensed User
Longtime User
Edito, no funciona porque el nombre "image%3A6406" (ejemplo) no puedo saber si es una imagen, video, etc.
Y no sé cómo obtener su nombre "normal" para copiarlo.
 

angel_

Well-Known Member
Licensed User
Longtime User
A mí me sucede lo mismo, creo que no se puede, pero en mi caso la extensión si que la conozco. Y si intentas extraer la extensión con Split?

Mira este hilo a ver si te sirve:
 

vecino

Well-Known Member
Licensed User
Longtime User
Perfecto, con el enlace que has puesto se puede hacer bien.
Muchas gracias.
 

vecino

Well-Known Member
Licensed User
Longtime User
Del enlace indicado antes he eliminado todo lo que no me servía y he dejado sólo lo que necesito, ha quedado así:

B4X:
Sub getGaleria
    Dim cc As ContentChooser
    cc.Initialize("cc")
    cc.Show("*/*", "Elige:")
    Wait For CC_Result (Success As Boolean, Dir As String, FileName As String)
    If Success Then
        Wait For (getNombreReal(FileName)) complete (cNFreal As String)
        If cNFreal<>"" Then
            ' Aquí los procesos que hago con el fichero, copiarlo, etc.
        End If
    End If
End Sub

Sub getNombreReal( uri As String ) As ResumableSub
    Try
        Wait For (GetFileInfoByIndex("_display_name", uri)) complete (cNombre As String)
    Catch
        Log(LastException)
    End Try
    Return cNombre
End Sub

Sub GetFileInfoByIndex(column As String, uri As String) As ResumableSub
    Dim results As String
    Dim Cur As Cursor
    Dim Uri1 As Uri
    Dim cr As ContentResolver
    cr.Initialize("")
    '
    'if viewing by gallery
    If uri.StartsWith("content://media/") Then
        Dim i As Int = uri.LastIndexOf("/")
        Dim id As String = uri.SubString(i + 1)
        Uri1.Parse(uri)
        Cur = cr.Query(Uri1, Null, "_id = ?", Array As String(id), Null)
        Cur.Position = 0
        If Cur.RowCount <> 0 Then
            For i = 0 To Cur.ColumnCount - 1
                If Cur.GetColumnName(i) <> Null Then
                    If Cur.GetColumnName(i) = column Then
                        results = Cur.GetString2(i)
                        Exit
                    End If
                End If
            Next
        End If
    Else
        Uri1.Parse(uri)
        Cur = cr.Query(Uri1, Null, Null, Null, Null)
        Cur.Position = 0
        If Cur.RowCount <> 0 Then
            For i = 0 To Cur.ColumnCount - 1
                If Cur.GetColumnName(i) <> Null Then
                    If Cur.GetColumnName(i) = column Then
                        results = Cur.GetString2(i)
                        Exit
                    End If
                End If
            Next
        End If
    End If
    '
    Cur.Close
    '
    Return results
End Sub
 
Top