Results 1 to 14 of 14

Thread: Database bestanden (SQLite) zijn niet meer te openen na update Delphi 10.4 naar 11.3

  1. #1

    Database bestanden (SQLite) zijn niet meer te openen na update Delphi 10.4 naar 11.3

    Database bestanden (SQLite) zijn niet meer te openen, ook niet als deze in de map "Documents" staan.

    Code:
    DataBaseBestand := Path + '/Data/Adressen.db';
    FDConnection1.ConnectionName := Path + '/Data/Adressen.db';
    FDConnection1.DriverName := 'SQLite';
    FDConnection1.Params.Database := DataBaseBestand;
    FDConnection1.Connected := True;
    Het volledige path is dan:
    /storage/emulated/0/Documents/MMSoft/Data/Adressen.db

    Bij de laatste regel krijg ik de melding:
    [FireDAC][Phys][SQLite]
    ERROR: unable to open
    database file

    Het werkte prima met Delphi 10.4, maar nu met versie 11.3 krijg ik deze fout melding.
    Wat is er aan de hand en hoe kan ik dit oplossen denken jullie ?

  2. #2
    Misschien heb je hier iets aan?

  3. #3
    Ik probeer van alles om toestemming te geven, maar kom geen stap verder....

    Als test probeer ik het eerst voor elkaar te krijgen met een .txt bestand en een Memo.
    Daarmee heb ik ook het probleem dat er geen toestemming is om het .txt bestand te lezen.

    Kwam dit tegen, iemand een idee of en hoe ik het hiermee werkend kan krijgen ?
    https://github.com/emozgun/delphi-android-SAF

    Als er een (.txt) bestand gemaakt wordt door de App, dan is deze ook weer uit te lezen.
    Maar het probleem is dat ik een App heb die een bestand (die van een PC op de telefoon gezet is) uit moet lezen.
    Dit was nooit een probleem met Delphi 10.4, maar nu dus wel met 11.3.

    Dus hoe kan ik het voor elkaar krijgen dat mijn App weer toegang heeft tot dit bestand denken jullie ?
    Last edited by MMSoft; 18-Sep-23 at 19:28.

  4. #4
    Senior Member
    Join Date
    Dec 2003
    Location
    Den Haag
    Posts
    208
    Ik heb ook wel eens problemen gehad met updaten van een Android app naar een nieuwere versie van Delphi. Probeer eens een heel nieuw Android project aan te maken, en daar alle units van je project aan toevoegen.

    Zorg ook voor dat de AndroidManifest.template.xml file up to date is zoals hier staat beschreven.
    https://docwiki.embarcadero.com/RADS...dManifest.xml)

    Heb je deze stappen ook uit gevoerd?
    https://blogs.embarcadero.com/develo...droid_Projects

  5. #5
    Ik ben helaas niets verder gekomen (eerst maar eens kijken of ik een .txt bestand kan
    openen voordat ik met een database bestand begin).
    Zo test ik het:

    -Begin een nieuw project (Er is nu dus een nieuw AndroidManifest.template.xml bestand)
    -Plaats een Memo en een Button op het Form.
    -Maak op de PC een .txt bestand (Bestand.txt) en plaats dat op de Device in de Map "Documents"

    Als ik nu op de Button drukt krijg ik de melding:
    Cannot open file "storage/emulated/0/Documents/Bestand.txt".
    Permission denied.

    Maar hoe geef ik nu op de juiste manier toestemming hiervoor ?

    Voorheen kon er toestemming gegevens worden voor "Bestanden en media", maar met de nieuwe versie
    kan je alleen nog maar toestemming voor Foto/video/muziek en audio geven.


    Code:
    unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,
      FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    uses
      System.IOUtils;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Memo1.Lines.LoadFromFile( System.IOUtils.TPath.GetSharedDocumentsPath + '/Bestand.txt' );
    end;
    
    end.
    Last edited by MMSoft; 19-Sep-23 at 15:40.

  6. #6
    Senior Member
    Join Date
    Dec 2003
    Location
    Den Haag
    Posts
    208
    Probeer eens internal storage te gebruiken met:

    Code:
    TPath.GetDocumentsPath
    Gebruik je de Deployment Manager om het bestand in assets\internal te plaatsen?
    https://developer.android.com/about/...rivacy/storage

    Welke versie van Android gebruik je trouwens? De latere versies zijn veiliger!

  7. #7
    Andriod versie 13

    Het gaat over bestanden die er via de PC opgezet zijn en gedeeld worden door meerdere App's
    Dus al deze App's moeten kunnen lezen en schrijven van/naar deze bestanden.

    Er zal toch nog wel een mogelijkheid moeten zijn ?
    Anders zou er ook geen bestandsbeheer App gemaakt kunnen worden.
    Last edited by MMSoft; 20-Sep-23 at 19:54.

  8. #8
    Ik kom maar niet verder....
    Zo lees ik ergens dat als je de bestanden in de map Documents zet, dat je gewoon toegang hebt tot je bestanden zonder
    dat je toestemming moet vragen.
    Helaas heb ik geen toegang tot de bestanden in die map (met uitzondering van audio en video bestanden).

    En zo probeer ik van alles, maar alles is in het Engels en daar ben ik niet goed in, dus mogelijk begrijp ik niet goed wat ik moet doen.
    Hulp is dan ook heel erg welkom.

  9. #9
    Als het op dezelfde 'machine' met dezelfde Android wel werkt met Delphi 10.4, maar nu niet met Delphi 11.3 is het misschien aan te raden een bugmelding te doen bij Embarcadero.
    Baat het niet, schaadt het niet.

  10. #10
    Quote Originally Posted by MaartenW View Post
    Als het op dezelfde 'machine' met dezelfde Android wel werkt met Delphi 10.4, maar nu niet met Delphi 11.3 is het misschien aan te raden een bugmelding te doen bij Embarcadero.
    Baat het niet, schaadt het niet.
    Het gaat niet om dezelfde Android (api). Delphi 11.3 werkt met een compleet andere Android Api (die veel meer beveiligd is) dus een bugreport zal niet zoveel uitmaken.

    Dan kun je beter hulp vragen op het Engelstalige Delphi forum.

    Misschien kun je nog de oude Android api installeren (maar ik heb geen idee of dat mogelijk is en hoe). En dat is uiteraard maar een tijdelijke oplossing.

  11. #11
    Hulp vragen op een Engels forum is lastig als je slecht Engels kunt.

    Ik kwam dit tegen: https://github.com/emozgun/delphi-android-SAF
    Daar kom ik dit tegen: procedure openDirectory(uriToLoad : JNet_Uri); (* DizinAc *)
    Zou dat de oplossing kunnen zijn denken jullie ?

    Code:
    procedure openDirectory(uriToLoad : JNet_Uri);  (* DizinAc *)
    // Choose a directory using the system's file picker.
    var
      Intent : JIntent;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT_TREE);
      
      // Optionally, specify a URI for the directory that should be opened in
      // the system file picker when it loads.
      Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI, JParcelable(uriToLoad));
    
      Mainactivity.startActivityForResult(Intent, Open_Doc_Tree);
    end;
    Maar krijg de fout melding:
    [DCC Error] Unit1.pas(305): E2003 Undeclared identifier: 'TJDocumentsContract'

    En dan zit ik nog met de vraag hoe ik mijn Directory op geef als een "JNet_Uri"
    Dus hoe roep ik deze procedure op ? Als het om de Directory "Documents" gaat denk jullie ?

    Ook hier ben ik aan het kijken:
    https://en.delphipraxis.net/topic/85...torage-schism/

  12. #12
    Quote Originally Posted by MMSoft View Post
    Maar krijg de fout melding:
    [DCC Error] Unit1.pas(305): E2003 Undeclared identifier: 'TJDocumentsContract'
    Dit kun je vrij makkelijk uitvogelen door even het hele project op die github pagina te pakken, in te laden, je cursor op TJDocumentsContract in unit1.pas zetten en dan CTRL+UP drukken.
    Je komt dan in Androidapi.JNI.Provider, dus daar staat TJDocumentsContract. Je zult de Androidapi.JNI.Provider op moeten nemen in je Uses.

    (Of het in 11 dezelfde file is moet je zelf even uitproberen met die demo)

    Op de andere vragen heb ik geen antwoord.

  13. #13
    Ik heb nu dit:
    Code:
    uses
      Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers,
      Androidapi.JNI.Net, Androidapi.JNI.Provider, FMX.Platform.Android;
    
    
    
    procedure TForm1.openDirectory(uriToLoad : JNet_Uri);  (* DizinAc *)
    // Choose a directory using the system's file picker.
    var
      Intent : JIntent;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT_TREE);
    
      // Optionally, specify a URI for the directory that should be opened in
      // the system file picker when it loads.
      Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI, JParcelable(uriToLoad));
    
      Mainactivity.startActivityForResult(Intent, 33); //Als ik mij niet vergis, dan moet ik hier het getal 33 opgeven
    end;
    En dan zit ik nog met de vraag hoe ik mijn Directory op geef als een "JNet_Uri"
    Dus hoe roep ik deze procedure op ? Als het om de Directory "Documents" gaat denk jullie ?

  14. #14
    Met deze code:
    Code:
    uses
      Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers,
      Androidapi.JNI.Net, Androidapi.JNI.Provider,
      FMX.Platform.Android, Androidapi.JNI.Net,
      Androidapi.Jni.Os, Androidapi.Helpers,
      Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;
    
    
    var
      Test: JNet_Uri;
    
    //------------------------------------------------------------------------------
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     //Test := ??? Wat geef ik hier op ?
     openDirectory( Test );
    end;
    
    //------------------------------------------------------------------------------
    
    procedure TForm1.openDirectory(uriToLoad : JNet_Uri);  (* DizinAc *)
    // Choose a directory using the system's file picker.
    var
      Intent : JIntent;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_OPEN_DOCUMENT_TREE);
    
      // Optionally, specify a URI for the directory that should be opened in
      // the system file picker when it loads.
      Intent.putExtra(TJDocumentsContract.JavaClass.EXTRA_INITIAL_URI, JParcelable(uriToLoad));
    
      Mainactivity.startActivityForResult(Intent, 33); //Is 33 het juiste getal ?
    end;
    Krijg ik dit scherm:

    Click image for larger version. 

Name:	1.jpg 
Views:	4 
Size:	95.3 KB 
ID:	8356
    En klik op Deze map gebruiken (Documents/MMSoft)

    En kan dan toestemming geven om deze Map te gebruiken voor deze App (Die de naam "Test" heeft):
    Click image for larger version. 

Name:	2.jpg 
Views:	3 
Size:	55.9 KB 
ID:	8357
    Hier kies ik natuurlijk voor Toestaan, maar ...

    Click image for larger version. 

Name:	3.jpg 
Views:	2 
Size:	57.6 KB 
ID:	8358
    Helaas kan ik het bestand Bestand.txt dan nog niet openen

    Het valt mij op dat de volgende keer dat deze App weer gestart wordt weer de vraag komt om toestemming te geven.
    Deze toestemming is dus niet opgeslagen.
    Dus daar gaat al iets mis. Hoe zou ik deze toestemming op moeten slaan ?

    Ik ben blijkbaar op de goede weg, maar wat moet er nog verbeterd worden denken jullie ?
    ================================================== ======

    Edit:
    Eens een hele andere weg ingeslagen en het werkt nu, MAAR er verschijnt nu nog geen Machtigings vraag en dat is natuurlijk wel de bedoeling.
    -Begin een nieuw project (er wordt dan ook een nieuw "AndroidManifest.template.xml" bestand aangemaakt)
    -Plaats in "AndroidManifest.template.xml" onder <%uses-permission%> deze regel:
    Code:
    <%uses-permission%>
       <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    Als de App start krijg je nu helaas nog niet de Machtigings vraag, maar deze kan je aanzetten bij:
    -Instellingen
    -Zoek naar: Toegang tot alle bestanden
    (-Speciale Toegang)
    -Toegang tot alle bestanden
    -Kies de juiste App en zet de Switch aan

    Deze App heeft nu toegang tot de bestanden.
    Hopelijk blijft dit in de volgende versie's ook werken

    Maar nu, hoe kan ik de App om deze Machtiging laten vragen ?
    Last edited by MMSoft; 23-Sep-23 at 11:53.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •