Spanish (SOLUCIONADO) FileDialog no presenta los archivos buscados

J M Movilla Cuadrado

Member
Licensed User
Llevo muchas horas consultando en el foro para intentar encontrar la solución, sin resultado positivo.

No sé cómo obtener que FileDialog seleccione los ficheros de la ruta indicada
B4X:
Sub FileOrig
    Dim fd As FileDialog
    Dim ruta As String

    fd.FastScroll = True
    ruta = File.Combine(File.DirRootExternal, "documents")
    fd.FilePath=ruta
    If Main.ntipo = 1 Then
        fd.FileFilter=".txt,.doc,.docx,.pdf,.xls,.xlsx, "
    Else
        fd.FileFilter=".edf"                         ' Uso ESTE filtro
    End If
 
    ' COMPROBACIÓN
    If (File.Exists(ruta,"pasos-txt.edf")) Then
        Msgbox("Existe pasos-txt.edf", "Vale")      ' Se presenta ESTE mensaje
    Else
        Msgbox("No existe pasos-txt.edf", "No vale")
    End If
 
    Dim sf As Object = fd.ShowAsync("Selecciona el fichero de Origen", "Sí", "Cancelar", "No", Null, True)
    Wait For (sf) Dialog_Result(Result As Int)      ' NO PRESENTA NINGÚN FICHERO
    If Result = DialogResponse.POSITIVE Then
        ff=fd.FilePath & "/" & fd.ChosenName
  
    End If
End Sub
De nuevo me veis dependiendo de vuestra ayuda (como el año pasado...). Gracias anticipadas.

Que tengáis un año 2019 lleno de todo lo bueno que os pueda interesar...
 
Last edited:

josejad

Expert
Licensed User
Longtime User

J M Movilla Cuadrado

Member
Licensed User
Te agradezco mucho tu atención, amigo José J.

No había visto el post que tú me indicas; pero lo he copiado y adaptado a mis necesidades, y me da el mismo error que todos los métodos que venía probando hasta ahora:

B4X:
java.lang.RuntimeException: Object should first be initialized (List).

a pesar de que incluyo la línea "lstFiles.Initialize "

Efectivamente, siempre me provoca este error de java, y no sé cómo solucionarlo. Ya os tengo dicho que llevo muchos años programando (en VB 6.0), pero soy autodidacta, ya que soy médico y no informático. Así que cuando me encuentro con un problema nuevo que se escapa de mis elementales conocimientos, me quedo totalmente atascado. Y a mis 87 años... estos atascos son "mortales"...

Te agradezco mucho la ayuda que habitualmente me ofreces; espero que como en anteriores ocasiones sea en ésta útil también. Y aunque no lo sea, seguiré manifestándote mi sincero agradecimiento.

Adjunto mi proyecto (lleno de "posibles"...)
 

Attachments

  • MliED.zip
    29.4 KB · Views: 373
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola JM, no hay por qué darlas, para eso estamos. Espero estar dándole vueltas al coco cuando tenga tu edad, jeje.

No me ha dado tiempo de probarlo a fondo, pero creo que ya sé dónde está el problema.
- Creo que en tu primer post deberías haber dado algún dato más, como el error que te salta, y la línea en la que te sale el error.
- Tienes razón en que el problema está en la lista, he quitado las líneas de Try...Catch para ver dónde da el error y sale esto:
B4X:
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
** Activity (encrdecr) Create, isFirst = false **
/storage/emulated/0
Error occurred on line: 76 (EncrDecr)
java.lang.RuntimeException: Object should first be initialized (List).
    at anywheresoftware.b4a.AbsObjectWrapper.getObject(AbsObjectWrapper.java:50)
    at anywheresoftware.b4a.objects.collections.List.AddAll(List.java:92)
....
- Efectivamente inicializas la lista, pero si te fijas, la línea que lanza el error es
B4X:
lstFiles.AddAll(File.ListFiles(sDir))
Y si te fijas, en la ayuda que te da el IDE cuando usas File.ListFiles te indica:

Captura.JPG

Es decir, la carpeta a la que intentas acceder no es accesible.
Me temo que tienes que lidiar con los permisos para leer una carpeta externa
https://www.b4x.com/android/forum/threads/runtime-permissions-android-6-0-permissions.67689/
Veo que lo tienes agregado en el archivo manifest, pero no veo que solicites el permiso.

EDITO: remirando tu ejemplo, veo que has empezado a aplicar los permisos, pero no has terminado de implementarlos.
Veo que tienes una linea comentada
B4X:
'    rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
pero te falta aún por declarar rp, y solicitar el permiso adecuado (READ_EXTERNAL_STORAGE), o mejor, poner los archivos en la carpeta
B4X:
rp.GetSafeDirDefaultExternal("")
que no necesitará permisos.

Ya si tienes problema con los permisos inicia un nuevo hilo.

Un saludo y suerte¡¡
 

J M Movilla Cuadrado

Member
Licensed User
De momento al menos, como no soy capaz de implementar los permisos para leer la carpeta de mi ruta [File.Combine(File.DirRootExternal,"documents")] he cambiado la ruta a [File.DirDefaultExternal] y efectivamente ahí no se precisan permisos de lectura... PERO tengo que crear esa carpeta, porque en principio no existe, a pesar de ser la carpeta POR DEFECTO...
Estoy seguro de que eso se debe también a algo que yo hago mal, ¿no es así?
 

Seneca

Active Member
Licensed User
Hola.

La cuestión es que el ejemplo que pusiste en el mensaje #3 a mí me funciona correctamente. Supongo que dependerá de la versión de android el tener que habilitar permisos.

Saludos.
 

josejad

Expert
Licensed User
Longtime User
Hola JM:
Te adjunto una versión de tu app preguntando por los permisos de la carpeta, quizás no están gestionados de la mejor forma (no es que yo sea un experto), pero al menos lista los archivos para que sigas investigando.
Por aclararte un poco, según indica el tutorial de los permisos (no sé cómo te manejas con el inglés)
The dangerous permissions are marked with * (in B4A v6+).
You don't need to ask for non-dangerous permissions.

READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE

This is the most common dangerous permission. It is added automatically when you use File.DirDefaultExternal or File.DirRootExternal.
However there is a simple workaround for this.

1. Use RuntimePermissions.GetSafeDirDefaultExternal("") instead of File.DirDefaultExternal. The parameter passed is an optional subfolder that will be created under the default folder.

Lo suyo es trabajar con rp.GetSafeDirDefaultExternal("") en vez de con File.DirDefaultExternal. La carpeta que se crea automáticamente cuando instalas tu aplicación, está en /storage/emulated/0/Android/data/, como bien indicas en tu otro post (en este caso /storage/emulated/0/Android/data/b4a.ed/files)
Por tanto, la ruta que te devolverá
rp.GetSafeDirDefaultExternal("") será /storage/emulated/0/Android/data/b4a.ed/files
y la ruta que te devolverá rp.GetSafeDirDefaultExternal("documents") será /storage/emulated/0/Android/data/b4a.ed/files/documents
Ahí, no te pedirá permiso porque es una ruta "segura" para tu app.
Comentarte también que lo más común, es nombrar los paquetes de alguna forma como por ejempo: "com.jmmovilla.mlled" o algo así, de esta forma, por ejemplo otra app que hicieras que se llamara app2 sería "com.jmmovilla.app2".
Espero que todo esto te sea algo de ayuda.

saludos
 

Attachments

  • MLled.zip
    29.5 KB · Views: 365

J M Movilla Cuadrado

Member
Licensed User
Ahora vengo de dar mi paseo obligatorio de 10.000 pasos (porque durante el día me lo han impedido otras obligaciones familiares), y con una temperatura de 2 grados bajo cero (con una sensación térmica de -8 o -10 grados... por el vientecillo helado que es habitual en Burgos) te puedes imaginar que no tengo más ganas que de cenar e irme a calentar entre las mantas...

Mañana veré tu código, que estoy seguro de que será eficazmente resolutivo. Siento llevarte la contraria, pero no me queda más remedio que estarte muy, muy agradecido. Saludos y abrazo efusivo.

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

Perfecto... No te imaginas la alegría que he sentido al ver solucionado mi atasco. La conversación que habéis tenido bgsoft y tú sobre este tema en el otro post que abrí paralelamente (Listar archivos de "documents"), ha sido la mar de interesante. Os quedo muy reconocido.
 
Last edited:
Te agradezco mucho tu atención, amigo José J.

No había visto el post que tú me indicas; pero lo he copiado y adaptado a mis necesidades, y me da el mismo error que todos los métodos que venía probando hasta ahora:

B4X:
java.lang.RuntimeException: Object should first be initialized (List).

a pesar de que incluyo la línea "lstFiles.Initialize "

Efectivamente, siempre me provoca este error de java, y no sé cómo solucionarlo. Ya os tengo dicho que llevo muchos años programando (en VB 6.0), pero soy autodidacta, ya que soy médico y no informático. Así que cuando me encuentro con un problema nuevo que se escapa de mis elementales conocimientos, me quedo totalmente atascado. Y a mis 87 años... estos atascos son "mortales"...

Te agradezco mucho la ayuda que habitualmente me ofreces; espero que como en anteriores ocasiones sea en ésta útil también. Y aunque no lo sea, seguiré manifestándote mi sincero agradecimiento.

Adjunto mi proyecto (lleno de "posibles"...)
Tienes un objeto text que debes inicializar aunque sea resultado de un campo en designer, pon campo.initialize("") y listo
 
Top