Ver Mensaje Individual
  #2  
Antiguo Hace 1 Semana
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Reputación: 2
navbuoy Va por buen camino
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.
Responder Con Cita