German Fehler beim Erstellen einer Datei. Manifest-Problem

Lothar Kriegerow

Active Member
Hallo Gemeinde,

ich habe folgendes Problem.
(Ich verwende B4A 12.20 64 Bit)
In meinem Projekt in LOGS wird folgender Text angezeigt:
Der empfohlene Wert für android:targetSdkVersion ist 31 oder höher (Manifesteditor). (warning #31)

Wenn ich nun in der Manifest-Datei den Wert von 29 auf 31 erhöhe, und mein Programm will im Programmordner eine Datei neu erstellen, bekomme beim Ausführen von ( siehe unten) diesen Fehler:
java.io.FileNotFoundException: /storage/emulated/0/Health/Rohdaten.txt: open failed: EPERM (Operation not permitted)

B4X:
Public Pfad As String = File.DirRootexternal & "/Health"
Writer.Initialize(File.OpenOutput(Pfad,"Test.txt", False))

Wenn ich auf 29 zurückstelle, gibt es keinen Fehler. Sicher muss in die Datei noch eine zusätzliche Information, nur weiß ich nicht, welche.

Hat jemand das gleiche Problem?

Hier mal meine Manifeas-Datei
B4X:
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="29"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
CreateResourceFromFile(Macro, Themes.LightTheme)
SetApplicationAttribute(android:requestLegacyExternalStorage, true)
'End of default text.

Gruß Lothar
 

b4x-de

Active Member
Licensed User
Longtime User
Die Rohdaten.txt wird unter dem angegebenen Pfad nicht gefunden. Deshalb kommt eine FileNotFound-Exception.

Versuche bitte anstelle von File.DirRootExternal aus der RuntimePermission die Funktion GetSafeDirDefaultExternal zu verwenden.

Viele Grüße
Thomas
 

GMan

Well-Known Member
Licensed User
Longtime User
Mache aus dem hier
B4X:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="29"/>
einfach dies hier:
B4X:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="31"/>

Hast Du im Manifest die Berechtigungen auch eingetragen ?

B4X:
AddManifestText(<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="31" />
)
 
Last edited:

Lothar Kriegerow

Active Member
Hallo

@bx4-de - Richtig. Die Meldung kommt aber nur, wenn ich die Sdk-Version von 29 auf 31 ändere. Natürlich wird die Datei nicht gefunden. Ich will sie ja auch erstellen.

@GMan ich habe die permission hinzugefügt. (Eigentlich will ich ja garnich auf die externe Karte schreiben). Der Fehler kommt trotzdem. Zurückändern auf Sdk=29 und alles funktioniert.

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo b4x-de,

ich habe viel versucht und muss dir Recht geben. Es funktioniert nur bis 29. Ich sehe keinen Grund das Level zu wechseln und mir meinen eigenen Zugang zu sperren.
Der Witz ist. unter der sdk-Version > 29 kann man zwar die Datei nicht mehr erstellen, ist dies aber da, kann man die jeder Zeit neu schreiben.

Gruß Lothar
 

mw71

Active Member
Licensed User
Longtime User
Ich sehe keinen Grund das Level zu wechseln
Wenn du die App nur für dich nutzt, dann ist das (im Moment) kein Problem. Wenn du sie in den Play Store stellen willst, dann wird das nix.

Ich kann mich nur b4x-de anschließen, schau dir die RuntimePermission an. Das ist simpel und funktioniert auch bei höherem API Level.
 

Lothar Kriegerow

Active Member
Hallo mw71,

Ich stecke vielleicht zu wenig in der Materie, aber ich denke, ich verwende die RuntimePermissions schon.
Die Library ist geladen - in der Manifestdatei habe ich diesen Eintrag:
"SetApplicationAttribute(android:requestLegacyExternalStorage, true)"

und im Projekt habe ich diese Zeilen integriert:

B4X:
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result = True Then Starter.Verz = File.DirRootExternal
    If Result=False Then xui.MsgboxAsync("Der Zugriff auf den Bildpfad ist fehlerhaft.","Fehler")

Muss ich da noch mehr tun? Ich bin für jeden Tipp dankbar.

Gruß Lothar
 

mw71

Active Member
Licensed User
Longtime User
der Anfang ist o.k., aber nach Abfrage der Berechtigung nicht konsequent bei RP geblieben

B4X:
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result Then 'das =True ist optional
        Dim pfade() As String = Starter.rp.GetAllSafeDirsExternal("")
        Starter.Verz = pfade(0)

        'folgende If.... kannst Du weg lassen, wenn Du die evtl. Externe nicht brauchst, nur der Vollständigkeit halber ;-)
        If pfade.Length>0 Then
            Starter.ExtSDCard=pfade(pfade.Length-1)
        Else
            Starter.ExtSDCard=""
        End If
        
    else
        xui.MsgboxAsync("Der Zugriff auf den Bildpfad ist fehlerhaft.","Fehler")
    end if
 

GMan

Well-Known Member
Licensed User
Longtime User
Als was ist Starter deklariert ?
 

GMan

Well-Known Member
Licensed User
Longtime User
Und wird da noch was deklariert
Copy&Paste gibt bei mir eine Fehlermeldung
 
Last edited:

Lothar Kriegerow

Active Member
Um das Beispiel zu testen muss in die STARTER folgendes hinzu


B4X:
    Public Verz As String
    Public rp As RuntimePermissions
    Public ExtSDCard As String
 

mw71

Active Member
Licensed User
Longtime User
ein simples Copy & Paste ist oft nicht so dolle, man sollte schon (etwa) verstehen was gemacht wird.

Starter Service

Dort musst du natürlich noch die Variablen deklarieren
 

Lothar Kriegerow

Active Member
Hallo mw71,

Das stimmt, aber gerade B4A zu lernen ist echt mühselig. Man muss sich das meiste aus den verschiedensten Threads zusammensammeln. Eine richtige Dokumentation habe ich noch nicht gefunden. Ich z.B. habe mir alles über COPY - PASTE - VERSTEHEN LERNEN erarbeitet. Und natürlich durch fragen. Wobei mir Klaus die meist Erleuchtung brachte.

Gruß Lothar
 

GMan

Well-Known Member
Licensed User
Longtime User
Schon klar, aber generell finde ich es extrem nervig dass so eine simple Sache wie das Lesen/Schreiben von einer SD-Karte so aufwendig geworden ist.
Da wäre eine Lib o.ä. sinnvoll mit Befehlen wie ReadFile.SDkarte(Folder,File) oder so
 
Top