Spanish Copiar un archivo de uri [SOLUCIONADO]

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola estoy creando una pequeña aplicación que me sirva para compartir una imagen o video a una aplicación mía. La primera parte ya la logré, compartir el archivo.

El siguiente problema es que la dirección y nombre del archivo vienen de la forma

content://com.app/files/28347923484723

La función file.copy pide un path(camino) y un nombre de archivo El path destino, no es problema. Tampoco el nombre nuevo, creo.

La pregunta es "Como copio dicho archivo?" Así?

B4X:
File.Copy("content://com.app/files", "28347923484723", "file:///storage/backup", "28347923484723")

¿Alguna función que alguien me pueda compartir para obtener el path u en nombre del archivo? Voy a probar.

¿Si es una imagen, como averiguo la extensión del archivo? Por ejemplo si es .jpg .png, etc?

Encontre esta respuesta de erel https://www.b4x.com/android/forum/threads/copy-file-from-uri.90300/#post-571060 pero no veo como copiar el archivo
 

josejad

Expert
Licensed User
Longtime User
Hola Carlos:

No he trabajado mucho compartiendo ficheros y con URI's, pero por lo que sé puede ser que una URI no corresponda con un archivo real en el dispositivo y por tanto no pueda copiarse. Por ejemplo, podría ser un archivo de google drive o algo así, y por tanto no tendría un "path" de tu dispositivo, por tanto, no des por hecho que siempre vas a obtener un archivo real que puedas copiar.

Haz algunas pruebas con estos post:
Con este, por ejemplo, podrías ver si hay path, pero puede no estar disponible, por lo que deberías comprobar qué te devuelve "res":


Y con este puedes obtener alguna información del archivo:

 

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

No he trabajado mucho compartiendo ficheros y con URI's, pero por lo que sé puede ser que una URI no corresponda con un archivo real en el dispositivo y por tanto no pueda copiarse. Por ejemplo, podría ser un archivo de google drive o algo así, y por tanto no tendría un "path" de tu dispositivo, por tanto, no des por hecho que siempre vas a obtener un archivo real que puedas copiar.

Haz algunas pruebas con estos post:
Con este, por ejemplo, podrías ver si hay path, pero puede no estar disponible, por lo que deberías comprobar qué te devuelve "res":


Y con este puedes obtener alguna información del archivo:


Hola Jose.

Aunque la información me sirve mucho, aún no lo logro.

Coloque un post en ingles a ver si de casualidad Erel me ayuda. Creo que la cosa no es tan fácil. Supongo que varios de los expertos han leído mi pregunta, pero aún no hay ni una respuesta. Por experiencia sé que cuando una pregunta no tiene respuestas, Erel las responde.

Vamos a ver que pasa.

Su ayuda es valiosa. Muchas gracias.
 

edgar_ortiz

Active Member
Licensed User
Longtime User
Carlos,

Te comparto lo que yo utilizo para copiar un archivo, según el "URI" seleccionado por el usuario

B4X:
' En el manifesto se defino:
'
' SETS para File Provider
AddManifestText(<uses-permission
   android:name="android.permission.WRITE_EXTERNAL_STORAGE"
   android:maxSdkVersion="18" />
)
AddApplicationText(
  <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="$PACKAGE$.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/provider_paths"/>
  </provider>
)
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)
'
'
' En la actividad donde se "selecciona el archivo" en Process_Globals
    Private DIDCC As ContentChooser         'Phone Library

' En el boton donde permite al usuario "seleccionar la imagen"
    DIDCC.Initialize("DIDCC")
    DIDCC.Show("image/*", "Imagen de la Boleta")
'
'
' la rutina que "Procesa el Result de DIDCC"
'
'
Sub DIDCC_Result (Success As Boolean, Dir As String, FileName As String)
    Dim lcFileName As String = ""
    Dim lcExtension As String = ""
    Dim lcPos As Int = 0
    Log("Inicio: DIDCC_Result")
    Log("Dir: " & Dir)
    Log("FileName: " & FileName)
    '
    If Success = True Then
        '
        lcPos    = lcFileName.LastIndexOf(".")
        '
        Log("Dir: " & Dir)
        Log("FileName: " & FileName)
        Log("Extension: " & lcExtension)
        '
        If lcPos > 0 Then
            Log("Posicion del Punto: " & lcPos)
            lcExtension    = lcFileName.SubString(lcPos)
        Else
            Log("NO se encuentra la Extension del Archivo Seleccionado")
            lcExtension    = ".jpg"
        End If
        '
        If Starter.wDIDTipoImagen = "BOLETA" Then
            lcFileName    = "B" & Starter.ParPedidosNumero & lcExtension
            Log("Nuevo Nombre: " & lcFileName)
            Starter.wDIDetBoleta    = lcFileName
        Else
            If Starter.wDIDTipoImagen = "LICENCIA" Then
                lcFileName    = "L" & Starter.ParPedidosNumero & lcExtension
                Log("Nuevo Nombre: " & lcFileName)
                Starter.wDIDetLicencia    = lcFileName
            Else
                lcFileName    = "T" & Starter.ParPedidosNumero & lcExtension
                Log("Nuevo Nombre: " & lcFileName)
                Starter.wDIDetTarjeta    = lcFileName
            End If
        End If
        '
        File.Copy(Dir,FileName,File.DirDefaultExternal,lcFileName)
        Log("Copiado el Archivo: " & File.DirDefaultExternal & lcFileName)
    Else
        Log("NO seleccionó una imagen")
    End If
        
End Sub

Espero te sirva.

Saludos,

Edgar
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Les comento que Erel ya me dio respuesta, como siempre, breve y concisa.

Captura.PNG

Link a la respuesta https://www.b4x.com/android/forum/threads/copy-file-from-uri.132007/post-832977

Aún no he tenido tiempo de probar sus ayudas. Mas tarde me pongo y ello y les comento como me funcionó.

Muchas gracias a todos.
 
Last edited:

josejad

Expert
Licensed User
Longtime User
Gracias Carlos por compartir la solución de Erel y hacer más sencillo el foro en español.

saludos,
 
Top