Autor Beitrag
JmHobby
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 31.01.23 17:35 
Hi Leute,
Als Hobby-Programmierfan möchte ich weiter an meine Android App unter Delphi 11 herumbasteln bzw. erstellen.
Leider stosse ich immer wieder auf das Problem mit der Android Permission, sei in Handhabung bzw. Ausführung.
Dachte mit Delphi Mobile wäre das nicht so schwierig. Habe auch keine so richtige Ahnung von Android und Java.
Trotzdem habe ich schon einige kleine Apps in Delphi (Android) lauffähig auf die Handy (Android 11+12) gebracht.
Meine Probleme sind besonders die Zugriffe auf Dateien.
Hier mein erstes Problem:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Texportimport.AddFilesImport(MyImportListbox: TListbox);
 Var
 SDIm : TStringDynArray;
 i,ii : Integer;
 LBI: TListBoxItem;
 begin//SDA := TDirectory.GetFiles(TPath.GetHomePath + PathDelim,'*.db'); // funktoniert super alle Dateien werden gelistet
  //SDA := TDirectory.GetFiles(TPath.GetSharedDocumentsPath + PathDelim,'*.db'); wird in der Listbox nicht gelitet
   SDA := TDirectory.GetFiles(TPath.GetDocumentsPath + PathDelim,'*.db'); // wird auch nicht gelistet
   for i := Low(SDA) to High(SDA) do
   begin
     ii := MyImportListBox.Items.Add(ExtractFileName(SDA[i]));
     LBI := MyImportListbox.ListItems[ii];
     LBI.ItemData.Detail := SDA, [i];
   end;
end;


// Aufruf später mit

Listbox1.Clear;
AddFilesImport(Listbox1);


Wenn ich auf GetHomePath mit der Liste zugreife, dann funktioniert die Auflistung.
Bei den Zugriff auf die anderen Verzeichnisse (GetSharedDucomentsPath oder GetDocumentsPath) wird nichts angezeigt.
Was mache ich da falsch? Oder welche Permission muss ich bei Delphi Berechtigung einstellen.

Hier meine komplette AndroidManifest.xml:
ausblenden volle Höhe XML-Daten
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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.jmbausoft"
    android:versionCode="2"
    android:versionName="1.0.1"
    android:installLocation="auto">
    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="32" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    <queries>

    </queries>
    <application
        android:persistent="False"
        android:restoreAnyVersion="False"
        android:label="JM-Rommy"
        android:debuggable="true"
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true"
        android:resizeableActivity="false"
        android:requestLegacyExternalStorage="true">
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="de.jmbausoft.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>




        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->

        <activity
            android:name="com.embarcadero.firemonkey.FMXNativeActivity"
            android:exported="true"
            android:label="JM-Rommy"
            android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
            android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name" android:value="romapp" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />

    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->


Zweites Problem in diesem Zusammenhang:
Dateien in den GetHomePath kopieren bzw. überschreiben.
Thema hatte ich schon mal hier gehabt, aber keine Lösung.
Hier der Code:
ausblenden Delphi-Quelltext
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:
procedure Texportimport.btn_dbdatei_importClick(Sender: TObject);
var
del_datei1 : String;
begin
    del_datei1 := System.IOUtils.TPath.GetHomePath + PathDelim + lbl_loaddatei_import.Text;

      begin
          PermissionsService.RequestPermissions(['android.permission.READ_EXTERNAL_STORAGE','android.permission.WRITE_INTERNAL_STORAGE'],
            procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
             begin
                if FileExists(del_datei1) then
                   begin
                     DeleteFile(del_datei1);
                     TFile.Copy(TPath.GetSharedDocumentsPath + PathDelim + lbl_loaddatei_import.Text, TPath.GetHomePath + PathDelim +lbl_loaddatei_import.Text) ;
                      //TFile.Copy(TPath.GetDocumentsPath + PathDelim + lbl_loaddatei_import.Text, TPath.GetHomePath + PathDelim +lbl_loaddatei_import.Text) ;
                      //ShowMessage('Die Spieldaten-Datei wurde importiert!');
                   end
                   else begin
                     TFile.Copy(TPath.GetSharedDocumentsPath + PathDelim + lbl_loaddatei_import.Text, TPath.GetHomePath + PathDelim +lbl_loaddatei_import.Text) ;
                     //TFile.Copy(TPath.GetDocumentsPath + PathDelim + lbl_loaddatei_import.Text, TPath.GetHomePath + PathDelim +lbl_loaddatei_import.Text) ;
                     //ShowMessage('Die Spielgemeinschaft-Datei wurde in Dokumenten-Ordner kopiert!');
                     end;
               end);
         ShowMessage('Daten wurden importiert.');
       end;
 exportimport.btn_db_delete.Enabled := False;
 exportimport.btn_dbdatei_import.Enabled := False;
end;

Die Dateien sind SQlite-DB, aber keine ist geöffnet bzw. wird gerade von der App verwendet. Diese Prozedur gehört wie oben bei Auslesen der Liste zur selben App.
Die App läuft ohne Probleme speichert und lädt, kopiert auch Dateien ins Verzeichnis GetSharedDocumentsPath, aber eben nur das Problem mit diesen Zugriff wie oben beschrieben.
Komme einfach nicht weiter.
Bräuchte eine Lösung wie man sowas mit Delphi auch lösen kann.

Vielen Dank im Voraus.
JmHobby

Moderiert von user profile iconTh69: Rechtschreibfehler korrigiert: Andriod -> Android
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 01.02.23 09:44 
Wie schon in Delphi FMX Android Mobile - SQL Datenbank geschrieben, mußt du seit Android 12 den "Scoped Storage" benutzen.
Hast du denn mal getestet, android:targetSdkVersion="28" zu benutzen?