Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   permiso de escritura y lectura en delphi 10.3.3 (android) (https://www.clubdelphi.com/foros/showthread.php?t=97414)

kurono 17-04-2025 08:52:27

permiso de escritura y lectura en delphi 10.3.3 (android)
 
hola amigos como estan les cuento que estoy desarrollando una aplicacion que me escanea las memorias tanto interna como externa en android todo funciona bien en versiones de android 9 hacia abajo pero a partir de android 10 me da error de acceso denegado intente darle permiso manualmente en el celular y aun asi me sigue saliendo acceso denegado ,hace varios meses atras tenia el mismo problema pero era con una base de datos el cual dandole permiso manualmente si me funciono pero ahora con esta aplicacion no me funciona, sera por el tipo de operacion que hace la aplicacion que es listar todo los archivos que estan en la memoria ,bueno le pregunte a chagpt y me dio soluciones pero me muestra libreria que no estan en la version 10.3.3 de delphi como puedo hacer para que me otorgue permiso a las memorias del celular

navbuoy 19-04-2025 04:27:01

Tu problema tiene que ver con cambios importantes que introdujo Android 10 (API 29) en cuanto al acceso al almacenamiento. Desde esa versión, el sistema restringe muchísimo el acceso libre al sistema de archivos, especialmente a las rutas externas como /sdcard, incluso si le das permisos manuales.

🔒 ¿Qué cambió en Android 10?
Google introdujo Scoped Storage, que hace que las apps ya no puedan acceder libremente a la memoria externa. Las apps sólo pueden acceder:

A sus propias carpetas internas (/data/data/tu.app.paquete/).

A su carpeta de almacenamiento externo privado (/Android/data/tu.app.paquete/).

A archivos del sistema de archivos externos públicos, como fotos, pero usando mecanismos especiales (como el Storage Access Framework o MediaStore).

🛑 Por eso no te sirve el permiso "READ_EXTERNAL_STORAGE" como antes.
Incluso si le das permiso manual, Android 10 y superior bloquea el acceso tradicional a carpetas como /storage/emulated/0/ o /sdcard/ si no lo haces mediante las nuevas APIs que ellos permiten.

✅ ¿Qué soluciones hay en Delphi 10.3.3?
Delphi 10.3.3 es algo limitado, ya que no soporta directamente las nuevas APIs de Android 10 como Scoped Storage o Storage Access Framework. Pero aquí hay opciones que puedes intentar:

🛠️ 1. Usa requestLegacyExternalStorage en AndroidManifest.xml
Esto le dice a Android 10 que tu app quiere usar el comportamiento anterior, como si fuera Android 9. Se hace agregando esto en el AndroidManifest.template.xml de tu proyecto, dentro del tag <application>:

Código:

android:requestLegacyExternalStorage="true"
Ejemplo del XML

Código:

<application
    android:requestLegacyExternalStorage="true"
    android:label="%label%"
    android:icon="@mipmap/ic_launcher">

🛠️ 2. Verifica que estés solicitando los permisos correctamente
Además de poner el permiso en el manifest, también necesitas solicitarlo en tiempo de ejecución. Algo como esto:

Código Delphi [-]
uses
  Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, FMX.Helpers.Android;

procedure SolicitarPermisos;
begin
  if TOSVersion.Check(6, 0) then // Android 6.0 o superior
  begin
    PermissionsService.RequestPermissions(
      ['android.permission.READ_EXTERNAL_STORAGE',
       'android.permission.WRITE_EXTERNAL_STORAGE'],
      procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
      begin
        if (Length(AGrantResults) > 0) and (AGrantResults[0] = TPermissionStatus.Granted) then
          ShowMessage('Permiso concedido')
        else
          ShowMessage('Permiso denegado');
      end);
  end;
end;

📦 3. Si necesitas Android 11 o superior: usa SAF o MediaStore (no directo con Delphi 10.3.3)
Esto ya implica hacer integración con Java nativo, o migrar a una versión más moderna de Delphi (como Delphi 11.3 o 12) que sí soporta acceso mediante SAF o integraciones modernas.

✅ Recomendaciones resumidas:
Añade android:requestLegacyExternalStorage="true" en el Manifest.

Asegúrate de pedir permisos en tiempo de ejecución.

Limita el acceso a carpetas como Environment.getExternalStorageDirectory() o getExternalFilesDir().

Si puedes, actualiza a Delphi 11+ para soporte más fácil con Android moderno.

Evita tratar de escanear toda la memoria externa, porque eso está muy restringido en versiones modernas.

kurono 27-04-2025 00:27:54

revisare lo que has comentado luego comentare si me resulto


La franja horaria es GMT +2. Ahora son las 09:32:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi