Spanish [SOLUCIONADO] Compartir archivo

vbmundo

Well-Known Member
Licensed User
Amigos,

En mi APP (la versión gratuita) luego de ejecutar la Sentencia SQL que el usuario quiera escribir, el resultado se carga en una grilla y la grilla tiene la facilidad de poder exportarse en formato CSV.

Bien... en la gratuita todo queda ahí... el usuario exporta la grilla(tabla) y listo.. luego hace con ella lo que quiera, pero la tiene que ir a buscar a la carpeta donde se ha grabado.

En la versión PRO, luego de exportar el resultado a CSV, quiero dar al usuario la posibilidad ahí mismo, sin tener que salir de la APP, de poder compartir ese archivo CSV..

Como se hace para que pasando el dato del archivo como parámetro, nos abra esa pantalla donde podemos COMPARTIR el archivo con muchos métodos ? (WhatsApp, Facebook, Email, etc) , así como hace con una Foto de la Galería ?

Saludos y Gracias
 

vbmundo

Well-Known Member
Licensed User
Perdón,

Ya lo resolví, me descargué esta increíble librería.

https://www.b4x.com/android/forum/t...and-anothers-important-intents.68229/#content

Y solo tengo que colocar

B4X:
Sub Process_Globals
    Private INTENT As INTENTID
End Sub

Sub unProceso
       INTENT.Share_File(File.DirAssets,"miArchivo.csv")
End Sub

Y se abren todas las opciones para compartir ese archivo , dependiendo de las Apps que yo tenga instaladas...

Es la Gloria esa Lib...

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Buenos dias Pablo

Te recomendaria que no emplees como nombre el mismo que existe en objetos (INTENT), por que si casualmente empleas los dos vas a tener un error que te costará encontrarlo, lo digo por que existe un objeto Intent .

Hay llamadas con el objeto Intent que abre cualquier tipo de documento y si no existe un programa por defecto te saldrá la relación de programas con los que puedes abrirlos.
Ya se que lo has solventado con esa libreria, pero esa libreria es una recopilación de intent y si vas sólo a emplear ese intent es añadir una libreria mas al proyecto (mas peso) y una serie de permisos que mucha gente cuando ve muchos permisos no se baja la App.

Eso mismo puedes hacerlo directamente asi:

B4X:
  Dim Intent1 As Intent
   
     
   Try   
     Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & Directorio y Nombre fichero)
     Intent1.SetType("application/csv") 
     'Intent1.SetType("application/doc") ' la mayoria de documentos
     StartActivity(Intent1)
  Catch
      ToastMessageShow("Error al ejecutar documento", True)
   End Try

Saludos
 

vbmundo

Well-Known Member
Licensed User
Buenos dias Pablo

Te recomendaria que no emplees como nombre el mismo que existe en objetos (INTENT), por que si casualmente empleas los dos vas a tener un error que te costará encontrarlo, lo digo por que existe un objeto Intent .

Hay llamadas con el objeto Intent que abre cualquier tipo de documento y si no existe un programa por defecto te saldrá la relación de programas con los que puedes abrirlos.
Ya se que lo has solventado con esa libreria, pero esa libreria es una recopilación de intent y si vas sólo a emplear ese intent es añadir una libreria mas al proyecto (mas peso) y una serie de permisos que mucha gente cuando ve muchos permisos no se baja la App.

Eso mismo puedes hacerlo directamente asi:

B4X:
  Dim Intent1 As Intent
  
    
   Try  
     Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & Directorio y Nombre fichero)
     Intent1.SetType("application/csv")
     'Intent1.SetType("application/doc") ' la mayoria de documentos
     StartActivity(Intent1)
  Catch
      ToastMessageShow("Error al ejecutar documento", True)
   End Try

Saludos

Muy buena tu explicación !

veo que haces un StartActivity.. pero asumo que no debes tu crear ese activity, sino que Android la reconoce como propia..

Es así ?

Saludos y Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
veo que haces un StartActivity.. pero asumo que no debes tu crear ese activity, sino que Android la reconoce como propia..

Ese StartActivity es para hacer la llamada al Intent, no hay que crear ningun formulario Intent, tu copias ese codigo tal como está y te hará lo mismo que con la libreria sin necesidad de crear otro activity o emplear una libreria adicional.

Saludos
 

vbmundo

Well-Known Member
Licensed User
Ese StartActivity es para hacer la llamada al Intent, no hay que crear ningun formulario Intent, tu copias ese codigo tal como está y te hará lo mismo que con la libreria sin necesidad de crear otro activity o emplear una libreria adicional.

Saludos

Mil Gracias amigo !
 

vbmundo

Well-Known Member
Licensed User
Buenos dias Pablo

Te recomendaria que no emplees como nombre el mismo que existe en objetos (INTENT), por que si casualmente empleas los dos vas a tener un error que te costará encontrarlo, lo digo por que existe un objeto Intent .

Hay llamadas con el objeto Intent que abre cualquier tipo de documento y si no existe un programa por defecto te saldrá la relación de programas con los que puedes abrirlos.
Ya se que lo has solventado con esa libreria, pero esa libreria es una recopilación de intent y si vas sólo a emplear ese intent es añadir una libreria mas al proyecto (mas peso) y una serie de permisos que mucha gente cuando ve muchos permisos no se baja la App.

Eso mismo puedes hacerlo directamente asi:

B4X:
  Dim Intent1 As Intent
  
    
   Try  
     Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & Directorio y Nombre fichero)
     Intent1.SetType("application/csv")
     'Intent1.SetType("application/doc") ' la mayoria de documentos
     StartActivity(Intent1)
  Catch
      ToastMessageShow("Error al ejecutar documento", True)
   End Try

Saludos

Jesus,

Me da ActivityNotFoundException .. eso de StartActiviy(Intent1) no funciona

Algo le falta.
 

vbmundo

Well-Known Member
Licensed User
Este es mi código

B4X:
        Archivo=MySQL.Tabla & ".csv"
        g.SaveTableToCSV(File.DirDefaultExternal,Archivo)
        Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & File.DirDefaultExternal & "/" & Archivo)
        Intent1.SetType("application/csv")
        StartActivity(Intent1)
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo:

Me da ActivityNotFoundException

Prueba así

B4X:
Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & File.Combine(File.DirDefaultExternal, Archivo)

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Se me olvidó

Te recomiendo que cuando hagas un intent lo protejas con
B4X:
Try
Catch
End try

Te lo puse en el ejemplo y era por algo :D

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Si con lo que te he dicho no te funciona (lo dudo :D), crea un pequeño proyecto, mete mi ejemplo con un fichero ya puesto en el raiz del dispositivo y veras que funciona, a partir de ahí veras por que el otro codigo no va

B4X:
   Dim Intent1 As Intent
  
    
   Try  
     Intent1.Initialize(Intent1.ACTION_VIEW, "file:// " & File.Combine(File.DirRootExternal, "prueba.csv") )
     Intent1.SetType("application/csv")
     StartActivity(Intent1)
  Catch
      ToastMessageShow("Error al ejecutar documento", True)
   End Try


Saludos
 

vbmundo

Well-Known Member
Licensed User
Amigo,

El error que me da es de ActivityNotFoundException

No encuentra el Activity "Intent1"

no tengo problema con el nombre del archivo, aunque lo de File.Combine me gustó.

También te comento que todo lo tengo entre un TRY CATCH.. y por eso puse un MessageBox mostrando el error.

Seguro que se ejecuta el INTENT con un StartActivity ?

Saludos y Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo:

no tengo problema con el nombre del archivo, aunque lo de File.Combine me gustó.
Pero has probado con el file.combine?

Seguro que se ejecuta el INTENT con un StartActivity ?

Palabrita del niño Jesús que si :D , haz lo que te he dicho, crea un nuevo programa y mete en el raiz el fichero que sepas que es bueno, y veras que funciona, a partir de ahi tendrás que mirar donde está el error. Crear un programa copiando las 7 lineas que te he escrito son dos minutos y saldrás de dudas de donde está el error. Ese código lo tengo en infinidad de sitios para diferentes tipos de ficheros y nunca me ha dado problemas.

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pedro

Me encanta que por un pequeño juego de palabras le alegre a alguien el dia :), eso si que le sube a uno la moral.
Pero es que a veces Pablo me lo pone a webs, por que si le estoy insistiendo en un código será por que lo he probado, diria que nunca he puesto un ejemplo sin haberlo probado yo primero, hay cosas que llevo tanto tiempo usandolas y son tan obvias que esa no las pruebo.

Y es tan facil como tener un proyecto para pruebas (no solo lo empleo para cosas de aqui), asi que no tengo que crearlo, simplemente meto el codigo y ya está (esto que quede entre tu y yo :rolleyes: )


Saludos
 

vbmundo

Well-Known Member
Licensed User
He creado una aplicación nueva.. de 0...

Solo tengo esas lineas de código que me has pasado..

Y da el mismo error

B4X:
** Activity (main) Pause, UserClosed = false **
** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
Error occurred on line: 33 (Main)
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:// /storage/emulated/0/prueba.csv typ=application/csv flg=0x20000 }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1781)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1501)
    at android.app.Activity.startActivityForResult(Activity.java:3843)
    at android.app.Activity.startActivityForResult(Activity.java:3797)
    at android.app.Activity.startActivity(Activity.java:4114)
    at android.app.Activity.startActivity(Activity.java:4082)
    at anywheresoftware.b4a.keywords.Common.StartActivity(Common.java:698)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at anywheresoftware.b4a.shell.Shell.runVoidMethod(Shell.java:748)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:343)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:247)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:134)
    at Intent.Example.main.afterFirstLayout(main.java:102)
    at Intent.Example.main.access$000(main.java:17)
    at Intent.Example.main$WaitForLayout.run(main.java:80)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5593)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
** Activity (main) Resume **
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Sr. Pablo

La parte interesante del código no la has puesto, pero no me hace falta, por que al ponerme el error he visto donde está:

act=android.intent.action.VIEW dat=file:// /storage/emulated/0/prueba.csv

Ves que has dejado un espacio después de las dos barras de file://, ese es el error

Yo te puse la primera vez:
B4X:
Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & File.DirDefaultExternal & "/" & Archivo)

Pero como me decias que no iba te hice el file.combine y ahí se me coló un espacio :rolleyes:
B4X:
Intent1.Initialize(Intent1.ACTION_VIEW, "file:// " & File.Combine(File.DirRootExternal, "prueba.csv") )

Esa sutiliza hace que te de error y es de fichero, no es de código de que no encuentra el activity. Ya te iras dando cuenta (si no lo has echo ya) que los mensajes de error a veces estan echos para que te hagan la programación un poco mas dura :D

Saludos y perdona por el lapsus
 

vbmundo

Well-Known Member
Licensed User
Ahora dejando un poco la broma de lado...

Mi código es este

B4X:
Sub Export_Click
    Dim Archivo As String
    If g.IsInitialized=False Then
        Return
    End If
    If g.Size=0 Then
        Return
    End If
    Try
        Archivo=MySQL.Tabla & ".csv"
        g.SaveTableToCSV(File.DirDefaultExternal,Archivo)
        Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & File.Combine(File.DirDefaultExternal,Archivo))
        Intent1.SetType("application/csv")
        StartActivity(Intent1)
    Catch
        Msgbox("Error " & LastException.Message,"Error")
        Log(LastException)
    End Try
End Sub

Como podrás ver, no hay ESPACIO luego de "file://"

A ver si el Espíritu Santo nos ayuda !!
 

dar2o3

Active Member
Licensed User
Longtime User
Comprueba antes si el fichero existe, a ver si van por ahí los tiros.


B4X:
Archivo=MySQL.Tabla & ".csv"
g.SaveTableToCSV(File.DirDefaultExternal,Archivo)

If File.Exists(File.DirDefaultExternal,Archivo) Then
      Intent1.Initialize(Intent1.ACTION_VIEW, "file://" & File.Combine(File.DirDefaultExternal,Archivo))
      Intent1.SetType("application/csv")StartActivity(Intent1)
    Else
      Msgbox("No esxiste el fichero","Error")
End If
 
Top