IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

fichier access denied avec android


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2024
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2024
    Messages : 33
    Par défaut fichier access denied avec android
    Bonjour,
    J'essaie de lire un fichier txt sui se trouve dans les documents sur smartphone android.
    J'ai un retour acces denied sur 1 fichier.
    Dans le même répertoire, j'ai un autre fichier que j'arrive à lire correctement.
    Si je renomme les 2 fichiers, en donnant le nom du fichier qui fonctionne à celui qui ne fonctionne pas, j'ai toujours acces denied.
    Y a-t-il des droits d'accès particuliers sur les fichiers sous android et comment on les gère.
    Naturellement, les permissions d'accès sont bien accordés (android.permission.READ_EXTERNAL_STORAGE et aussi android.permission.WRITE_EXTERNAL_STORAGE)

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Cela dépend de la version de Android et du SDK ciblé par Delphi : [Android] Résultat différent pour le même code compilé sous Delphi 11 CE ou Delphi 12 CE

    Citation Envoyé par ShaiLeTroll Voir le message
    Cela revient souvent sur le forum, je ne fais pas de FMX ni d'android mais chaque version de Delphi cherche à supporter le plus haut sdk que possible
    Il est donc logique que par défaut, D12 cible la version 34 et gère par retro-compatibilité la version 32

    C'est le problème d'Android, cela impose un tas de truc à chaque fois qu'il sorte une nouvelle version de l'OS, Delphi ne fait que suivre les préconisations.
    Là c'est Android 14
    Sache qu'il y a déjà Android 15 donc level 35, ... Delphi étant un peu en retard sur Android Studio, et l'on trouve énormément ce genre de questions pour Android Studio !
    Même l'outil de dev officiel, les devs ont des galères pour comprendre ces permissions qui changent tous les ans.

    Et avant de changer de version de Delphi, se renseigner sur les évolutions d'Android est un pré-requis.
    je te recommande de lire Gérer tous les fichiers d'un périphérique de stockage - Déclarez l'autorisation MANAGE_EXTERNAL_STORAGE dans le fichier manifeste.

    et la dépréciation en sdk 33 de READ_EXTERNAL_STORAGE qui a changé entre Android 9, 10 et 11 mais qui devient obsolète en 13 - Autorisations de stockage



    Lors de l'ajout de MANAGE_EXTERNAL_STORAGE en version 30, cela ne posait pas de problème pour READ_EXTERNAL_STORAGE
    Mais avec le passage en version 33 (Android 13), c'est une permission qui n'existe plus c'est détaillé ici : Google publie la première bêta d'Android 13 « Tiramisu » : L'OS mobile dispose d'un nouveau système d'autorisation pour les fichiers multimédias de 2022

    Il y a beaucoup sur l'AUDIO ou VIDEO mais rien de clair si il faut des choses en plus en Android 13 pour les TXT



    Comment sont créés les fichiers, est-ce qu'il y a des droits selon l'auteur (programme ou user)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2024
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2024
    Messages : 33
    Par défaut
    Les fichiers ont été créés par programme fait par moi-même.
    Apparemment les savetofile ont l'air de fonctionner à tous les coups

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Le moindre code pour montrer comment vous procédez aiderait certainement à résoudre/comprendre le souci.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 998
    Par défaut
    Le fichier pourrait-il être verrouillé par un autre process ?

    As-tu redémarré ton mobile pour voir si cela résoudrait ton pb ?

    Sinon, même remarque que SergioMaster: « difficile d’être efficace et utile sans le moindre bout de code » !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2024
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2024
    Messages : 33
    Par défaut
    Un peu plus d'information :
    Le programme : application multipériphérique
    sur la form 2 memo et 3 button

    programme :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      PermissionReadExternalStorage = 'android.permission.READ_EXTERNAL_STORAGE';
      PermissionWriteExternalStorage = 'android.permission.WRITE_EXTERNAL_STORAGE';
      Read_Image   = 'android.permission.READ_MEDIA_IMAGES';
    Pour le bouton 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    procedure TForm1.PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    Var
      Folder: string;
      Path : string;
     
    begin
     if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted)  then
      begin
       showmessage('autorisation ok');
        folder := TPath.GetSharedDocumentsPath + System.SysUtils.PathDelim + 'testjoueur.txt';
     
        try
          memo1.Lines.LoadFromFile(TPath.GetSharedDocumentsPath + System.SysUtils.PathDelim + 'fichier_ancien.txt');
        except
           showmessage('imposible de charger le fichier');
        end;
      end
      else
        ShowMessage('pas d''autorisation');
    end;
     
    procedure TForm1.demande_permission;
    begin
      PermissionsService.RequestPermissions([PermissionReadExternalStorage, PermissionWriteExternalStorage], PermissionRequestResult, DisplayRationale);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
      demande_permission;
     
    end;
    pour le bouton2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure TForm1.TakePicturePermissionRequestResult2(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    begin
     
     if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
      begin
        action_bouton2;
      end
      else
        ShowMessage('pas autorisation')
    end;
     
     
     
    procedure TForm1.demande_permission2;
    begin
     PermissionsService.RequestPermissions([Read_Image,PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult2, DisplayRationale2);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      demande_permission2;
    end;

    Bouton 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.TakePicturePermissionRequestResult3(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    begin
     if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
      begin
       TakePhotoFromLibraryAction1.Execute;
        action_bouton3;
      end
      else
        ShowMessage('pas autorisation')
    end;
     
    procedure TForm1.demande_permission3;
    begin
     
      PermissionsService.RequestPermissions([Read_Image,PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult3, DisplayRationale3);
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      demande_permission3;
    end;
    Pour info les procedure DisplayRationale ne sont pas utiles et sont de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // Optional rationale display routine to display permission requirement rationale to the user
    procedure TForm1.DisplayRationale2(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
    begin
      var RationaleMsg: string;
     
      for var I := 0 to High(APermissions) do
      begin
        if APermissions[I] = PermissionCamera then
          RationaleMsg := RationaleMsg + 'The app needs to access the camera to take a photo' + SLineBreak + SLineBreak
        else if APermissions[I] = PermissionReadExternalStorage then
          RationaleMsg := RationaleMsg + 'The app needs to read a photo file from your device';
      end;
     
      // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
      // After the user sees the explanation, invoke the post-rationale routine to request the permissions
      TDialogService.ShowMessage(RationaleMsg,
        procedure(const AResult: TModalResult)
        begin
          APostRationaleProc;
        end)
    end;

    Le read_Image sert dans le cas où on veut l'autorisation d'aller chercher une image dans le téléphone. Cette autorisation n'aest pas nécessaire, mais est tiré d'un autre programme qui fonctionne et permet de lire des photos et d'écrire des fichiers.

    Lorsqu'on click sur le bouton 3 le fichier s'écrit bien dans le répertoire documents.
    Lorsqu'on click sur le bouton 2 le fichier écrit précédemment est bien lu.
    Lorsqu'on click sur le bouton 1, l'accès est refusé. ( le fichier n'a pas été créé par ce programme, mais soit mis dans le dossier, soit créé par un autre programme)

    Sur toutes les actions, les autorisations sont acceptées.
    Après redémarrage du téléphone, il n'y a pas de changement. Le click sur le bouton 2 fonctionne et le click sur le bouton1 ne fonctionne pas.
    Remarque : les écritures de fichiers écrase l'ancien fichier sans aucune demande d'autorisation, sauf si j'essaie d'écraser le fichier ancien 'fichier_ancien.txt'

  7. #7
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 998
    Par défaut
    Je ne maîtrise pas le dev pour Androïd, mais dans la procédure demande_permission, il ne manquerait pas un Read_image ?

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2024
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2024
    Messages : 33
    Par défaut
    Avec ou sans le readimage, c'est la même chose, le Readimage est pour accéder aux photos,ce qui n'est pas utile dans ce programme

Discussions similaires

  1. Serveur de fichiers : Access denied
    Par TipyLeCanadien dans le forum ASP.NET
    Réponses: 4
    Dernier message: 17/10/2012, 18h18
  2. RegisterTouchWindow->access denied avec Frame Java
    Par gizmoIchitzo dans le forum Windows
    Réponses: 6
    Dernier message: 29/03/2012, 20h12
  3. Relay Access Denied avec Postfix
    Par dnizard dans le forum Administration système
    Réponses: 0
    Dernier message: 12/05/2009, 14h54
  4. Probleme sous Access 2002 avec un fichier Access 2000
    Par branqueira dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 17h43
  5. Fichier Access avec extension db
    Par Invité dans le forum VBA Access
    Réponses: 4
    Dernier message: 17/05/2005, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo