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:
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