Spanish Problemes acceso storage Android 11

Espinosa4

Active Member
Licensed User
Longtime User
Hola a todos.

A ver si me podéis echar un cable.
Tengo una app que funciona correctamente hasta android 10. Al instalarla en android 11 se instala pero las carpetas no se crean y en ellas copio una base de datos que obviamente tampoco se copia. Al entrar al programa me dice que el directorio no existe o que no tiene acceso. Al instalar la app se le da los permisos pero aún así no se crean.


Añadí al Manifiest del proyecto requestLegacyExternalStorage pero ahora ni se instala la app. Responde no se ha instalado.

Sabéis cómo puedo solucionarlo?

Gracias de antemano por vuestra ayuda.

Un saludo
Espinosa
 

Attachments

  • IMG-20201004-WA0020.jpg
    IMG-20201004-WA0020.jpg
    106.5 KB · Views: 254
  • IMG-20201004-WA0023.jpg
    IMG-20201004-WA0023.jpg
    94.3 KB · Views: 229

drgottjr

Expert
Licensed User
Longtime User
oye, si crees que tienes dificultades ahora con "almacenaje" externo, esperate hasta nos llegue android 12, 13 y mas alla.
mejor guardes tu base de datos in file.dirinternal donde debe de encontrarse. un consejo.

eso aparte, y sin saber exactamente lo que has hecho (codigamente), he de preguntar si tienes
AddManifestText(<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />)
en el manifest (ademas de requestlegacyexternalstorage) ?

si se trata de un nuevo aparato en que quieres instalar tu app, diria que es normal que el directorio en external storage no existe.
?has averiguado si existe antes de intenter abrir la base de datos? si no existe, tienes que crearlo. (y averiguar una vez mas)

en cuanto a la instalacion fallada (y no fallera ;)), debe haber mensajes de android al respecto. un mensaje casero como has hecho esta bien, pero
es posible que android te diga que ha occurido.

yo tengo un aparato con android 11 (android.jar 29). como prueba, abro un directorio de file.direxternal sin problema. el manifest refleja lo que
he puesto arriba. si puedes cambiar el lugar de tu base de datas a file.dirinternal, lo recomiendo. pronto no habra mas remedio.
 

Espinosa4

Active Member
Licensed User
Longtime User
Hola drgottjr
Gracias por tu pronta respuesta.

Te copio aquí lo que tengo en el manifest

'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: http://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="30"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:requestLegacyExternalStorage="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetApplicationAttribute(android:theme, "@android:style/Theme.Holo")
'End of default text.
'SetApplicationAttribute(android:uiOptions, "splitActionBarWhenNarrow")


No es algo que toque salvo excepciones.


El mensaje lo da el móvil yo no he creado ese mensaje ;o))))

Voy a añadir las líneas que comentas y te comento.
Tendré que cambiar como tú bien dices a internal.

gracias por todo
 

drgottjr

Expert
Licensed User
Longtime User
no uses 30. ?donde esta: AddManifestText(<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />) ? todavia te hace falta el permiso.
 

Espinosa4

Active Member
Licensed User
Longtime User
Ahora lo tengo así

1'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: http://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="29"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:requestLegacyExternalStorage="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetApplicationAttribute(android:theme, "@android:style/Theme.Holo")
'End of default text.
'SetApplicationAttribute(android:uiOptions, "splitActionBarWhenNarrow")
 

drgottjr

Expert
Licensed User
Longtime User
si, por ahora 29. ?y como ha salido?
 

Espinosa4

Active Member
Licensed User
Longtime User
Ummm no funcionó.
Se instala ahora pero no se crean las carpetas en emulated/0/Android/.........

Probaré a cambiarlo por internal a ver así.
 

drgottjr

Expert
Licensed User
Longtime User
curioso, pero mejor asi; al menos te obliga a portarte como prefiere android. sera cada vez mas dificil salir de tu jaula. aburrido pero necesario aunque algunos no lo ven asi.
voy a hacer otra prueba con emulated/0/Android ... es posible que ya no se puede crear un directorio externo con android 11, solamente acceder a uno ya existente. yo puedo acceder a file.direxternal; no he intentado crear un directorio alli.
 

drgottjr

Expert
Licensed User
Longtime User
y runtimepermission - los permisos dentro de la app - ?sera posible que los hayas olvidado? si no concedes permiso a external write dentro de la app, creo que la app no funciona, pero sin indicar nada. ?cuando fue la ultima actualizacion?
 

drgottjr

Expert
Licensed User
Longtime User
si no incluyo el runtimepermission para file.direxternal en la app (y a pesar de lo que he puesto en el manifest), no puedo acceder al mismo.
si incluyo el runtimpermission en la app (y con los cambios al manifest), si, puedo acceder a file.direxternal.
?lo incluyes o no?
 

Espinosa4

Active Member
Licensed User
Longtime User
Pues voy a revisar el código y te comento.
Muchísimas gracias por tu ayuda drgottjr!!
 

Espinosa4

Active Member
Licensed User
Longtime User
No lo tenía puesto.
rp es la variable rumetimepermission

Cada vez que escribo una línea con file....... tengo que poner antes rp.PERMISSION_READ_EXTERNAL_STORAGE = True?
 

drgottjr

Expert
Licensed User
Longtime User
si colocas la bd en file.dirinternal, no tienes que hacer nada-nadita con permisos de ninguna indole.
si insistes en usar file.direxternal, tienes que ajustar el manifesto asi como conceder acceso con un runtimepermission una sola vez (ej, cuando se abre la db). ademas, si insistes en usar file.direxternal, corres el riesgo que tu app no funcione en un futuro proximo (eg, android 12+)

tu app tiene que indicar a android que vas a usar file.direxternal, pero es el usuario que concede el acceso (con runtimepermission). un detalle importante. depende del usuario - si o no - si permite a tu app a acceder a sus archivos en file.direxternal. asi el usuario se protege contra una app malvada. claro, si dice que no concede acceso, la app no funciona. pero, al mismo tiempo el usuario manda. esto es lo que quiere google.

segun el mago erel, lo del runtimepermission aparece justo antes de acceder a un recurso (ej, un archivo, el gps, etc) por primera vez. esto puede ser en
activity_create or activity_resume. existen opiniones sobre el tema. yo uso activity_resume. de todas formas, una vez concedido el acceso, el trocito de codigo se salta. pero el usuario siempre tiene la opcion de cambiar los permisos en la configuracion del aparato..

como ejemplo:
B4X:
activity_resume
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result Then
            ToastMessageShow("Good to to!", False)    ' permiso dado por el usuario
    Else
            ToastMessageShow("No go",False)             ' el usuario se niega.  cierras la app
            Activity.Finish
    End If

   ' sigue la app
end sub

lo importante es que no intentas acceder a la db (u otros archivos en file.direxternal) antes de pedir permiso.
 

Espinosa4

Active Member
Licensed User
Longtime User
Muchísimas gracias drgottjr por tu ayuda!

Por el momento haré la segunda opción porque accedo a muchos ficheros de external para parchear este problema pero iré arreglándolo para que sea en el internal.

Lo pruebo y comento.
Gracias!
 

Espinosa4

Active Member
Licensed User
Longtime User
Bueno pues aparece el mensaje go to to pero de ahí no pasa.

Voy a modificar el código para que sea en internal.

Gracias por vuestra por tu ayuda!
 

drgottjr

Expert
Licensed User
Longtime User
enviame (o carga aqui) el trocito de codigo relativo al runtime permission. supongo que es de el que hablas. me interesa lo que viene despues. cuanto mas me mandas, mejor. con los permisos en regla, no hay por que la app no funciona. anadiendo el runtime permission, habras tenido que cambiar algunas cosas. es posible que la app no haga nada despues del permiso pues no le hayas dicho que hacer... pidiendo el permiso cambio el flujo de la app ya que no existia antes. que faran els valencians i les valencianes sense el seu tramvia! la cosa es mas facil con file.dirinternal, pero das la impresion que la modificacion seria mayor.
 

drgottjr

Expert
Licensed User
Longtime User
hecho. ja verem
 

drgottjr

Expert
Licensed User
Longtime User
no veo donde has puesto el codigo referente a runtimepermissions...

en linea 71 ( Activity.title = "TRANVIA VLC - L4/6 PrO" )
justo antes, pon:
B4X:
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result Then
            ToastMessageShow("Good to to!", False)    ' permiso dado por el usuario
    Else
            ToastMessageShow("No go",False)             ' el usuario se niega.  cierras la app
            Activity.Finish
    End If

   ' sigue la app
    Activity.title = "TRANVIA VLC - L4/6 PrO"
    LblCopyright.Text = "·#Copyright Espinosa 2013#·"
    LblVersion.Text = "v11.10 (22/09/2020)"
    ImgIcono.Initialize(File.DirAssets,"pro2.png")
    'BORRARRRR LOSSSSSS DELETEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!! SI CAMBIOS EN LA BD L4PRO.SQL
    'File.delete(File.DirDefaultExternal,"l4pro.sql"
  ...

como he dicho, you prefiero ponerlo en activity_resume, pero como ya tienes un monton de codigo en activity_create, pongamoslo alli.
hay que pedir el permiso antes de intentar acceder a todos aquellos archivos in dir external. si el usuario ortoga el permiso, la app prosigue. si no, se cierra. si no da el permiso, no hay manera de continuar. mejor cerrar la app o al menos ensenar un msgbox indicando que sin el permiso no hay manera de continuar.

me faltan 2 librerias que tu utilizas y que yo no reconozco, asi que no puedo compilar. pero sin el codigo referente a runtime permission, la app no va a hacer nada. ?2013? mare meua, apenas habia nacido yo.
 
Top