Spanish No me genera carpetas al instalar

cas6678

Active Member
Licensed User
Hola a todos. Esto de volver a b4a cada tanto me hace retroceder en mis conocimientos :(.

Tengo una aplicacion que lee posiciones GPS y me las guarda en un txt, funciona bien en una tablet con Android 5.1.1. Sin embargo al querer ponerlo en un telefono con Android 8.0 la aplicacion se cuelga al momento de escribir o consultar el txt. Me he dado cuenta que no me ha generado la carpeta Android/data/b4a.nombreapk/files. Supongo que sera por eso que se cuelga, porque el archivo a consultar deberia estar alli y esa direccion no existe.

Entiendo que sera por la forma de gestionar los permisos en 8.0 a diferencia de 5.1.1. pero tengo otras aplicaciones que gestionan archivos en 8.0 y no encuentro diferencias ni el codigo, ni en el manifiest.

Que me estoy perdiendo???
 

Descartex

Well-Known Member
Licensed User
Buenas!!!
Ejecutala en modo Debug y ponle un
B4X:
Log(File.DirInternal)
A ver que tira por el log...
 

cas6678

Active Member
Licensed User
No me quiero complicar ahora mucho con el tema de los permisos. Tengo pensado hacerlo cuando tenga que subir al PlayStore y necesite aumentar la version, de momento no lo necesito y trabajo con android:targetSdkVersion="22"

Algo me pasa que no se me instalan las carpetas en la ruta normal pero.............sorpresa..........la ejecute en modo Debug para responder a @José J. Aguilar y decirle el error y ahora ya no hay error, es decir, me creo la ruta y funciona perfectamente. No me lo explico. Voy a intentar a instalar la apk en otro movil con 8.0 y vere que pasa.

A la pregunta de @Descartex ...

/data/user/0/b4a.nombreapk/files

Creo que quizas no sean solo los permisos....quizas algo relacioando con el dispositivo?
 

cas6678

Active Member
Licensed User
No hay caso. Ahora esto poniendo el archivo .apk en otro movil y la aplicacion se instala pero no me general la carpeta, luego cuando la aplicacion quiere recurrir a escribir se cuelga.

La ruta que uso es esta:

DirFile = File.DirDefaultExternal

El tema es que no me crea siempre al instalar
 

José J. Aguilar

Well-Known Member
Licensed User
Has añadido los permisos al manifest?

AddManifestText(
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="19" />
)


Échale un ojo al post de los Runtime Permissions. Verás que para tu app no tendrás que solicitarlos, pero como indica el post, podrás usar rp.GetSafeDirDefaultExternal("")


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


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.

2. Add this code to the manifest editor:
Code:
AddManifestText(
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="19" />
)
The explanation for this is that GetSafeDirDefaultExternal doesn't require any permission on Android 4.4+ (API 19) and requires the WRITE_EXTERNAL_STORAGE on older versions. The code above adds the permission to older devices.

You only need to deal with WRITE_EXTERNAL_STORAGE at runtime if you need access to a folder other than the app's default external folder.
Si no ,usa DirInternal, como indica:

https://www.b4x.com/android/forum/threads/app-install-not-creating-app-folder.104535/

saludos,
 

cas6678

Active Member
Licensed User
Tengo que estudiarme lo que me dices en detalle.

He probado con DirInternal pero me crea la carpeta habitual pero luego el archivo que yo genero desde la aplicacion vete a saber donde lo pone porque ahi no :D, aunque al menos la aplicacion no se detiene asi que en algun lugar lo dejara.

Veo por el link que compartes que a alguien mas le ha pasado y que habra habido algun cambio en todo esto.

De momento lo he soluciando con DirRootExternal y me deja el archivo en el directoria principal.

Gracias por tu colaboracion.
 

Xanatos34

Member
Licensed User
B4X:
Dim rp As RuntimePermissions
dim rutaBase As String
dim rutaImagenes as string

rutaBase=rp.GetSafeDirDefaultExternal("")
rutaImagenes=rutaBase & "/imagenes/productos"


Sub Activity_Create(FirstTime As Boolean)
    ' Permiso escritura
    rp.CheckandRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)

End Sub


Sub Activity_PermissionResult (Permission As String, Result As Boolean)
      

    If Permission = rp.PERMISSION_WRITE_EXTERNAL_STORAGE and result=true Then
' Permiso correcto
          If File.Exists(rutaImagenes, "") = False Then
              File.MakeDir(rutaBase, rutaImagenes)
         end If
              
    End If       
end sub
Algo así te deberia valer a mi me funcionó. Los permisos son un auténtico coñazo a partir de la versión 6 de Android.
 
Top