Spanish [SOLUCIONADO] Compartir archivo

vbmundo

Well-Known Member
Licensed User
Acabo de ver el problema
tiene que ser

B4X:
Intent1.ACTION_SEND

y no

B4X:
Intent1.ACTION_VIEW


YEAHHHHHH !!!!

jejejejeje...

Amigo Jesus... la fuerza no ha estado contigo esta vez.... jejeje.

el código que me has enviado no estaba bendecido por el Señor !!

Un poco de humor no viene mal..

Saludos a ambos.. son 2 máquinas
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo:

Como decia Jack el Destripador: "Vayamos por partes"

1) No puedes decir que es el codigo que te dije que hicieras, ya que en el momento que al escribirlo no tiene nada que ver, por lo tanto comparar un codigo concreto que te he pasado con uno que tu has echo no tiene sentido, por que por ejemplo, la asingnación del Intent1 la hago en el propio sub, no fuera que no se donde la hiciste, en mi codigo te dije que pusieras manualmente el fichero, tu lo seguis generando, tampoco compruebas si existe como te dijo dar2o3 así que nadie me asegura que en la linea de arriba mandes crear el fichero y justo en la de abajo hagas la llamada y ese fichero esté creado (android tardará algo mas en escribirlo que en ejecutar la linea). Pablo, cuando se compara códigos que no van se compara el mismo código, no el que tu haces y que es diferente y pretendes que funcione y encima digas que el otro no va.
Y si quieres otra prueba de lo que te digo, he puesto el nombre de un fichero que no existe, y que casualidad que me da tu mismo error:
B4X:
** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
main_boton1_click (java line: 368)
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:// /storage/emulated/0/prueba1.csv typ=application/csv flg=0x20000 }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1878)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1545)
    at android.app.Activity.startActivityForResult(Activity.java:4283)
    at android.app.Activity.startActivityForResult(Activity.java:4230)
    at android.app.Activity.startActivity(Activity.java:4567)
    at android.app.Activity.startActivity(Activity.java:4535)
    at anywheresoftware.b4a.keywords.Common.StartActivity(Common.java:698)
    at bgs.pruebasparapablo.main._boton1_click(main.java:368)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:157)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:153)
    at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:78)
    at android.view.View.performClick(View.java:5702)
    at android.widget.TextView.performClick(TextView.java:10888)
    at android.view.View$PerformClick.run(View.java:22541)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7229)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Crees que es una coincidencia? o es la certeza de lo que vengo diciendote en un montón de lineas de este hilo
Estoy seguro que si lo haces con debug paso a paso funciona, por que le dará tiempo de escribir el fichero en el caso que ese fichero exista


2)
Amigo Jesus... la fuerza no ha estado contigo esta vez.... jejeje.

el código que me has enviado no estaba bendecido por el Señor !!

Siento decirte que el código está bendecido por San Erel, y reubatizado por el niño Jesús, aqui tienes algunos link donde muchos foreros lo hacen para abrir diferentes tipos de ficheros o aplicaciones externas y emplean el mismo sistema:
https://www.b4x.com/android/forum/threads/download-pdf.43140/#post-262864

https://www.b4x.com/android/forum/t...fest-does-not-need-changes.39854/#post-237299

https://www.b4x.com/android/forum/t...ename-will-fail-to-install.41074/#post-246546

https://www.b4x.com/android/forum/t...android-intents-to-do-stuff.9823/#post-179589

https://www.b4x.com/android/forum/threads/youtube-movie-in-webview.10177/#post-214940

https://www.b4x.com/android/forum/threads/show-app-in-playstore.20229/#post-116907

https://www.b4x.com/android/forum/threads/will-this-code-open-a-pdf.14753/#post-83908

https://www.b4x.com/android/forum/threads/will-this-code-open-a-pdf.14753/#post-96034

https://www.b4x.com/android/forum/threads/update-application-apk.19304/#post-111306

https://www.b4x.com/android/forum/threads/will-i-have-to-like-how-can-i-find-my-downloaded-apk?.31788/#post-185365

https://www.b4x.com/android/forum/threads/file-access-error.44134/#post-268571

3)

Y como decia un filósofo... "El movimiento se demuestra... huyendo" (lo último es mio :D)
Como mas que Pablo pareces Santo Tomás, por eso que no creia que Jesús hubiese resucitado con la frase: "hasta que no meta mis dedos en sus llagas y mi mano en su costado no creeré" , yo no te compraré la biblia para que creas, lo haré a mi forma, te adjunto un ejemplo como te pedí que hicieras, copiando el fichero que SE que existe en el raiz y luego haciendo el código que te pasé, no el que tu has echo. Eso si, si aun me dices que no te funciona, seré yo santo Tomás, no por nada, si no por que lo he probado en diferentes dispositivos con versiones de Android diferentes Y FUNCIONA EN TODOS.



Saludos
 

Attachments

  • pruebasparapablo.zip
    375.7 KB · Views: 269
  • Screenshot_20160907-114303.png
    Screenshot_20160907-114303.png
    350.8 KB · Views: 259
Last edited:

vbmundo

Well-Known Member
Licensed User
Jesus,

era
Intent1.ACTION_SEND

y tu habias puesto
Intent1.ACTION_VIEW

no era ni el nombre del archivo, que SI existe en mi proyecto ni otra cosa... simplemente (con el mismo código) cambié eso que me recomendó dar2o3 y funcionó..

Reconócelo man, La Fuerza no ha estado contigo esta vez.

Mil gracias de todos modos por todo lo que haces por todos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Reconócelo man, La Fuerza no ha estado contigo esta vez.

Vaya, pues entonces resulta que mi ejemplo que te he enviado y que funciona con el Intent1.ACTION_VIEW será otro milagro del niño Jesús, no es una cuestion de reconocer o no, si meto la pata asumo mis errores, no soy Dios, sólo me llamo Jesús, pero en este caso concreto tienes un perfecto ejemplo que demuestra que con el Intent1.ACTION_VIEW FUNCIONA (con captura incluida), pero tu ni te has dignado a probarlo, como montones de cosas que se te han dicho y has echo caso omiso, por lo visto es mas facil no hacer lo que te piden, decir que no funciona aun cuando no probamos lo que nos dicen, e intentar machacar el trabajo de los demas, lo tendré en cuenta para el futuro.

Si hubieses probado el código como te dije en el primer momento poniendo el fichero a mano en el raiz, me hubiese evitado estar perdiendo el tiempo escribiendo y creando ejemplos para demostrarte que si que funciona, tambien estan equivocados todos los ejemplos que te he pasado en los link incluidos los de Erel?

Gracias por hacerme perder el tiempo.

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola a todos

Lo que dice Android Developers:

ACTION_VIEW
Added in API level 1
String ACTION_VIEW
Activity Action: Display the data to the user. This is the most common action performed on data -- it is the generic action you can use on a piece of data to get the most reasonable thing to occur. For example, when used on a contacts entry it will view the entry; when used on a mailto: URI it will bring up a compose window filled with the information supplied by the URI; when used with a tel: URI it will invoke the dialer.

Input: getData() is URI from which to retrieve data.

Output: nothing.

Constant Value: "android.intent.action.VIEW"

-------------------------------------------------------------------------------------------------------------

ACTION_SEND
Added in API level 1
String ACTION_SEND
Activity Action: Deliver some data to someone else. Who the data is being delivered to is not specified; it is up to the receiver of this action to ask the user where the data should be sent.

When launching a SEND intent, you should usually wrap it in a chooser (through createChooser(Intent, CharSequence)), which will give the proper interface for the user to pick how to send your data and allow you to specify a prompt indicating what they are doing.

Input: getType() is the MIME type of the data being sent. get*Extra can have either a EXTRA_TEXT or EXTRA_STREAM field, containing the data to be sent. If using EXTRA_TEXT, the MIME type should be "text/plain"; otherwise it should be the MIME type of the data in EXTRA_STREAM. Use */* if the MIME type is unknown (this will only allow senders that can handle generic data streams). If using EXTRA_TEXT, you can also optionally supply EXTRA_HTML_TEXT for clients to retrieve your text with HTML formatting.

As of JELLY_BEAN, the data being sent can be supplied through setClipData(ClipData). This allows you to use FLAG_GRANT_READ_URI_PERMISSION when sharing content: URIs and other advanced features of ClipData. If using this approach, you still must supply the same data through the EXTRA_TEXT or EXTRA_STREAM fields described below for compatibility with old applications. If you don't set a ClipData, it will be copied there for you when calling startActivity(Intent).

Optional standard extras, which may be interpreted by some recipients as appropriate, are: EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT.

Output: nothing.


Constant Value: "android.intent.action.SEND"
---------------------------------------------------------------------------------------------------

Conclusión:

Si hacemos esto:
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)
No le damos tiempo a que salve el fichero y cuando entra el intent se encuentra que no existe el fichero y por eso da el error.

Si lo cambiamos por un ACTION_SEND, como nos pedirá elegir con que aplicación lo abrimos, habrá tiempo mas que suficiente para que se grabe el fichero.

Si se prueba mi código con el fichero ya copiado en el raiz como he venido insistiendo en numerosos post, y así está en mi programa de prueba, el ACTION_VIEW FUNCIONA PERFECTAMENTE

Ahora que cada cual piense cual es la mejor forma, si quieres que siempre pregunte, está claro que es hacer un ACTION_SEND, pero si quiere que se pregunte solo la primera vez que no hay aplicación predeterminada, es el ACTION_VIEW.
Yo suelo emplear ACTION_VIEW por que a mi personalmente cada vez que abro un fichero no quiero que la App me pregunte con que quiero abrirlo si ya se lo dije, no se, creo que queda mas elegante e incordia menos al usuario. Y el usuario si quiere cambiar las aplicaciones por defecto, ya hay una ventana que cuando lo haces te dice como quitarla.

Como decia el filósofo, a veces los arboles no nos dejan ver el bosque. Yo tengo dos buenas costumbres, una; que cuando le escribo código a alguien no es de oida, es por que lo he probado, dos; cuando tengo un problema voy al origen de este, no lo parcheo, por que al final volveran a salir los problemas, y aqui el problema era crear un fichero y a continuación asumir que estaba creado por la gracia del espiritu santo sin contar que las CPU por muy rápidas que vayan dependen de unas memorias que no lo son tanto, y claro, si luego miro con el visor de archivos si existe , ¡¡¡pues claro que existe!!! , pero tenia que existir en la linea del Intent, no media hora después.

Nota: Con un delay provocado por un Doevents o creando un pequeño delay con un bucle antes de llamar al Intent, seguro que funciona. Pero no meter en el delay si el fichero existe, por que el fichero existe aunque tenga 0 byte cuando lo empieza a crear.


Saludos a todos

 

vbmundo

Well-Known Member
Licensed User
Bueno man

Creo que te estas enojando innecesariamente.. todo fue en clave de humor, y te lo has tomado al churrete.

Lo del delay no lo sabia.. y no se porque dices que NO HE PROBADO LO QUE ME HAS DADO..

Te dije que he creado un proyecto nuevo, vació y puse tu código y no anduvo..

el PORQUE no anduvo ahora queda claro... no ha tenido tiempo la Instrucción anterior en completarse..

Pero ese no es un problema mio, es decir... como voy a pensar que todo funciona ASINCRONO en Android ?

es como que me digas


a=1
b=2
c=a+b

NO LO CORRAS ASÍ !! PORQUE CUANDO SUMAS "a" + "b" aun estos no han recibido los valores.. hay que darles tiempo..

Es ridículo.. y disculpa, no es tu culpa..

Pero entiende de que por 30 años he programado de manera lógica... si hay 5 instrucciones , una debajo de la otra... cuando llega a la 5ta, asumo que las 4 anteriores ya fueron ejecutadas y si hay una falla , para eso esta el TRY CATCH

Como te digo.. no tienes que enojarte conmigo, porque he hecho cuanto tu has dicho..

Saludos y Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Creo que te estas enojando innecesariamente.. todo fue en clave de humor, y te lo has tomado al churrete.

Lo del delay no lo sabia.. y no se porque dices que NO HE PROBADO LO QUE ME HAS DADO..

Te dije que he creado un proyecto nuevo, vació y puse tu código y no anduvo..
No me he enojado, simplemente no me gusta que me culpen de cosas cuando yo digo una cosa y tu otra, y sigues diciendola, tu no copiaste en un proyecto nuevo mi codigo, la prueba es que metiste tu generación de fichero, y con esta es la enesima vez que te digo que para saber si te funcionaba esa instrucción era copiar el fichero de forma manual al raiz, y eso no lo has echo, y encima me dices que me equivoqué en el código, perdoname, pero aqui el que se equivocó fuiste tu que copiaste mal despues de repetirtelo mil veces.

Pero ese no es un problema mio, es decir... como voy a pensar que todo funciona ASINCRONO en Android ?
No es una cuestion de ejecuciones asincronas, es de sentido comun, si en una instrucción salvas y en la siguiente lo quieres ver y te da error, lo normal es pensar que no puede salvarlo en un "ya", por eso te he insistido en que lo copiaras a mano y ejecutaras mi código, pero ya ves, te he tenido que dar la solución y aun no quisiste probarlo, tan dificil era aceptar que habias puesto una linea que no era la que te dije y que si la hubieras puesto nos hubiesemos librado todos de esta perdida de tiempo incecesaria? Sin embargo apostaste por decir que mi código no iba, y eso es lo que no me ha gustado, que hagas un codigo tuyo y aun me eches las culpas de que no va, que si eso es asi, que esta vez la fuerza no te acompañó, etc, etc.

Creo que a estas alturas deberias saber que Android es un SO orientado a objetos y dirigida por eventos, lo cual eso es asincrono, igual que VB y otros muchos SO visuales. No es una programacion secuencial . Y que en todos los lenguajes hay instrucciones que las ejecutas y no las realiza al momento, si me dices que es una llamada a un sub aun, pero eso era una instrucción de salvar a fichero y en ningun SO los ficheros se salvan al ejecutar la linea. Pero yo no estoy aqui para enseñar a nadie, solo para ayudar, y lo unico que pido es que si pongo un codigo, al menos lo prueben tal como lo puse, y si no funciona lo discutiremos pero que lo cambien y me echen la culpa de que no funciona no me gusta.

Como te digo.. no tienes que enojarte conmigo, porque he hecho cuanto tu has dicho..
No, no lo has echo, y por mas que insista en que lo has echo como yo te dije, las pruebas estan arriba con tu generación de fichero, creo que no te lo escribí asi, y no probaste de meter el fichero a mano, por que con eso hubieses visto que funcionaba y te hubieses dado cuenta al momento de donde estaba la diferencia de codigo. Te diré lo que estos dias le dicen al presidente del gobierno en funciones de aqui, una mentira por mucho que la repitas no pasa a ser verdad.

Y aun no me has dicho si funciona con mi codigo original o el programa que hice para ti, sigues agarrado a que puse un codigo mal que no funciona y de ahí no hay quien te baje buscando evasivas de que no sabias lo del delay, lo del asincrono, etc, pero aun no has sido capaz de decir, pues mira, hice TODO lo que me dijiste y si, funciona, el fallo fue añadir por mi parte esa linea de creación del fichero justo antes del intent, y tambien he probado tu programa que es lo mismo que escribiste y tambien funciona. Y no es que quiera que lo digas, lo que no quiero que me digas es que mi codigo no va, cuando creo que a estas alturas está mas que demostrado que fue tu codigo el que hizo que no funcionara. Quien no quiere dar el brazo a torcer?

a=1
b=2
c=a+b

NO LO CORRAS ASÍ !! PORQUE CUANDO SUMAS "a" + "b" aun estos no han recibido los valores.. hay que darles tiempo..

Es ridículo.. y disculpa, no es tu culpa..

Pero entiende de que por 30 años he programado de manera lógica... si hay 5 instrucciones , una debajo de la otra... cuando llega a la 5ta, asumo que las 4 anteriores ya fueron ejecutadas y si hay una falla , para eso esta el TRY CATCH
Hay gente aqui que lleva mucho menos tiempo programando y nos dan tres vueltas en programación, a ti con 30 años y a mi con muchos mas de 30. Los años de programación a veces solo sirven para ser mas viejos, no mas sabios.

Saludos
 

vbmundo

Well-Known Member
Licensed User
Buen amigo , te pido disculpas, como te he dicho fue todo en tono de broma..

en cuanto a lo Asincrono o no.. te digo que la clase TABLE que me he descargado y que es de Erel, va grabando cada label y si no grabó el primero no puede grabar el segundo, así que no es Asincrónico.

No demos mas vueltas, fue un error mio por desconocimiento. y lo que yo queria lograr, era precisamente lo que hace el comando SEND,... no VIEW, no deseaba ver el contenido en pantalla, si te fijas el título del POST habla de COMPARTIR un archivo.. no de visualizarlo.

Pero no demos mas vueltas...

saludos y vamos !! que ya ni se que decirte para que bajes tu enojo.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Buenos dias

vale, acepto pulpo como animal de compañia ;)

Saludos
 
Last edited:

vbmundo

Well-Known Member
Licensed User
Amigo Jesus,

Tienes alguna idea de porqué este código que finalmente ha resultado y con el archivo comprobado como CREADO, no envia el adjunto ?

B4X:
           Msgbox("File Created in "&File.DirRootExternal&"/SqlResult.csv","Done")
           Intent1.Initialize(Intent1.ACTION_SEND, "file://" & File.Combine(File.DirRootExternal,"SqlResult.csv"))
           Intent1.SetType("application/csv")
           StartActivity(Intent1)

si uso el objeto SMTP funciona.. pero es el usuario el que decide con que compartir su archivo, por eso no puedo obligarlo a usar solo Email...

Usando INTENT el Email es enviado y correctamente recibido, pero llega sin Adjunto... (que le falta a este código)

Aclaro que previamente tuve un

IF File.exists(file.combine(xxxxxxxxxxxx) y el archivo figuraba como creado correctamente

No se ya mas donde buscar

Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Ese intent solo abre una ventana de aplicaciones con las que poder verlo, no se que código tienes antes de todo eso para enviar el email y el fichero adjunto, tienes que decirle al envio de email la carpeta y el nombre del archivo, que no se si lo haces, quizas antes de darle la opción al usuario de ver el archivo tendrias que poner los valores al envio de email al fichero adjunto:
B4X:
SMTP1.AddAttachment(FicheroAdjuntoDir,FicheroAdjuntoNombre)

No conozco tu codigo, pero yo lo que haria seria en la ventana donde le das para que vea el fichero, un botón de enviar, y ahi pones todos los parámetros de envio incluido el fichero adjunto, asi aseguras el envio. Una vez que el usuario haya visto el fichero y salido de verlo, volverá a esa ventana y podrá darle a ese boton de enviar.

Saludos
 

vbmundo

Well-Known Member
Licensed User
Hola Pablo

Ese intent solo abre una ventana de aplicaciones con las que poder verlo, no se que código tienes antes de todo eso para enviar el email y el fichero adjunto, tienes que decirle al envio de email la carpeta y el nombre del archivo, que no se si lo haces, quizas antes de darle la opción al usuario de ver el archivo tendrias que poner los valores al envio de email al fichero adjunto:
B4X:
SMTP1.AddAttachment(FicheroAdjuntoDir,FicheroAdjuntoNombre)

No conozco tu codigo, pero yo lo que haria seria en la ventana donde le das para que vea el fichero, un botón de enviar, y ahi pones todos los parámetros de envio incluido el fichero adjunto, asi aseguras el envio. Una vez que el usuario haya visto el fichero y salido de verlo, volverá a esa ventana y podrá darle a ese boton de enviar.

Saludos

Hola Jesus,

Gracias, mi código es el que te he mostrado... una vez grabado el archivo ejecuto el INTENT, para que el usuario pueda enviarlo por diversos canales..

Pero como en el INITIALIZE del INTENT, se hace mención del archivo y la carpeta, yo pense que no hacia falta ningún otro seteo previo...

El código del SMTP ya lo he ejecutado en otro proyecto que tengo y funciona muy bien.. pero en ese caso.. yo ya tengo en claro que el envio es 100 % por Email..

Como hago para que si el usuario DECIDE enviar por Email tenga ya los seteos y si quiere enviarlo por WhatsApp tenga los suyos también ?

Saludos y Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pablo

Como hago para que si el usuario DECIDE enviar por Email tenga ya los seteos y si quiere enviarlo por WhatsApp tenga los suyos también ?

Cuando tu abres una ventana para que puedan abrir/enviar/visualizar u otra acción, pierdes el control de esa acción desde tu App, la unica forma es controlarla tu, en el caso de email, tu puedes enviar un mail como me has comentado.

Yo creo que la solución seria, poner un boton para enviar desde tu aplicación un email, y simplemente pides los datos que necesites para el envio. Y otro botón en el cual el usuario seleccione otra aplicación. En android no existen las SEND KEYS de VB para enviar una linea de comando, se hace normalmente con Intent o con reflection, y aun asi es dificil la comunicación entre dos APP

Saludos
 

vbmundo

Well-Known Member
Licensed User
Pero explicame esto...

Para que uno indica en el INITIALIZE que lo que quiere compartir es un archivo determinado, si luego el usuario en el INTENT elije enviar un Email y ese Archivo no sale como adjunto ?

Es como medio raro eso...

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola, esto te va a costar un café :D

Ponlo asi:
B4X:
    Dim Intent1 As Intent
    Intent1.Initialize(Intent1.ACTION_SEND, "")
    Intent1.SetType("*/*")
    Dim jo As JavaObject = Intent1
    Dim uri1 As Uri ' Pon la libreria ContentResolver
    uri1.Parse("file://" & File.Combine(File.DirRootExternal,"prueba.csv" )) ' cambialo por tu linea de generar el fichero, lo he puesto asi para que se entienda mejor
    jo.RunMethod("putExtra", Array("android.intent.extra.STREAM", uri1))
    StartActivity(Intent1)

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Te funciona? por que con los problemas que han habido ya no me fio si te va o no :D

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Buenos dias Pablo

Me alegro que por fin vaya y cerremos de verdad este post que se hizo un poco largo :D

Saludos
 
Top