German EACCES (Permission denied) Android 11

arnold steger

Member
Licensed User
Ich verwende folgenden Befehl um den Pfad für eine txt-Datei zu erzeugen.
Alles funktionierte bis zum letzten Android Update einwandfrei.

B4X:
PfadBackup = File.DirRootExternal & "/xxx"
File.MakeDir(File.DirRootExternal, "xxx")
Vor einigen Tagen bekam mein Phone das Update zu Android 11.
Seither kann ich die App nicht mehr starten da bereits beim Aufstarten eine Fehlermeldung erscheint.
Versuche ich die App am Phone mit Android 10 zu laden funktioniert wieder alles normal.

Logger verbunden mit: samsung SM-A505FN
--------- beginning of main
--------- beginning of system
** Activity (main) Create, isFirst = true **
LocationManager has been initialized.
Added Separator
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
main_activity_pause (java line: 1519)
java.lang.RuntimeException: Object should first be initialized (CameraPosition).
at anywheresoftware.b4a.AbsObjectWrapper.getObject(AbsObjectWrapper.java:67)
at anywheresoftware.b4a.objects.MapFragmentWrapper$CameraPositionWrapper.getZoom(MapFragmentWrapper.java:374)
at com.Flurnamenatlas.main._activity_pause(main.java:1519)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
at com.Flurnamenatlas.main.onPause(main.java:275)
at android.app.Activity.performPause(Activity.java:8383)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1510)
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:5202)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:5163)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:5114)
at android.app.servertransaction.PauseActivityItem.execute(PauseActivityItem.java:46)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
java.lang.RuntimeException: Object should first be initialized (CameraPosition).
sending message to waiting queue (activity_permissionresult)
running waiting messages (1)
Status: true
** Activity (main) Resume **
Status: true
** Activity (main) Pause, UserClosed = false **
main_activity_pause (java line: 1519)
java.lang.RuntimeException: Object should first be initialized (CameraPosition).
at anywheresoftware.b4a.AbsObjectWrapper.getObject(AbsObjectWrapper.java:67)
at anywheresoftware.b4a.objects.MapFragmentWrapper$CameraPositionWrapper.getZoom(MapFragmentWrapper.java:374)
at com.Flurnamenatlas.main._activity_pause(main.java:1519)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
at com.Flurnamenatlas.main.onPause(main.java:275)
at android.app.Activity.performPause(Activity.java:8383)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1510)
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:5202)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:5163)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:5114)
at android.app.servertransaction.PauseActivityItem.execute(PauseActivityItem.java:46)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
java.lang.RuntimeException: Object should first be initialized (CameraPosition).
sending message to waiting queue (activity_permissionresult)
sending message to waiting queue (activity_permissionresult)
running waiting messages (2)
Status: true
Status: true
LocationManager has been initialized.
** Activity (main) Resume **
Status: true
*** Service (sgps) Create ***
GPS-Status true
** Service (sgps) Start **
Status: true
Status: true
** Activity (main) Create, isFirst = true **
LocationManager has been initialized.
PERMISSION_WRITE_EXTERNAL_STORAGE= true
** Activity (main) Resume **
Status: true
Status: true
mFragment_Ready
size2
Status: true
main_mcloseapp_click (java line: 4948)
java.io.FileNotFoundException: /storage/emulated/0/Flurnamenatlas/Sicherung/Meine Punkte.txt: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
at anywheresoftware.b4a.objects.streams.File.OpenOutput(File.java:448)
at anywheresoftware.b4a.objects.streams.File.Copy(File.java:341)
at com.Flurnamenatlas.main._mcloseapp_click(main.java:4948)
at com.Flurnamenatlas.main$ResumableSub_Activity_Resume.resume(main.java:1626)
at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:267)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:207)
at anywheresoftware.b4a.BA$2.run(BA.java:387)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8367)
at libcore.io.IoBridge.open(IoBridge.java:478)
... 15 more
java.io.FileNotFoundException: /storage/emulated/0/Flurnamenatlas/Sicherung/Meine Punkte.txt: open failed: EACCES (Permission denied)
Hat jemand eine Ahnung woran es liegt?
 

DonManfred

Expert
Licensed User

Punkt 4
 

GMan

Well-Known Member
Licensed User
[/ java.lang.RuntimeException: Object should first be initialized (CameraPosition). QUOTE]
Was ist hier los ?
 

arnold steger

Member
Licensed User
Ich überprüfe bereits beim aufstarten die Berechtigungen.
B4X:
Sub Activity_Resume
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    Log ($"Status: ${rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)}"$)
  
    rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    Log ($"Status: ${rp.Check(rp.PERMISSION_ACCESS_FINE_LOCATION)}"$)

    rp.CheckAndRequest(rp.PERMISSION_ACCESS_COARSE_LOCATION)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    Log($"Status: ${rp.Check(rp.PERMISSION_ACCESS_COARSE_LOCATION)}"$)
  
    If Result Then
        MCloseApp_Click
    End If
In der Zeile wo ich dann die txt sichern möchte tritt der Fehler auf.

B4X:
Sub MCloseApp_Click

'    Eigenen Punkte sichern
    Log("Activity_Pause: Meine Punkte testen ob vorhanden")
    If File.Exists(PfadPunkte, "Meine Punkte.txt") Then
        Log("MCloseApp_Click: Meine Punkte vorhanden")
    File.Copy(PfadPunkte,"Meine Punkte.txt",PfadBackup,"Meine Punkte.txt")
        Log("MCloseApp_Click: Meine Punkte kopiert")
'    ToastMessageShow("Meine Punkte gesichert",False)
    End If
Ich versuchte bereits mit GetSafeDirDefaultExternal zu überprüfen aber warscheinlich mache ich dort einen Fehler.
B4X:
If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Then
        Log ("PERMISSION_WRITE_EXTERNAL_STORAGE= "&rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE))
        rp.GetSafeDirDefaultExternal("")
    If File.ExternalWritable Then
        PfadBackup = File.DirRootExternal & "/xxx"& "/Sicherung"
        File.MakeDir(File.DirRootExternal, "xxx"& "/Sicherung")
 
Last edited:

arnold steger

Member
Licensed User
Was ist hier los ?
Hängt mit der Standordermittlung zusammen.
Dadurch dass die App nicht richtig aufstartet denke ich mir dass sich etwas mit der Initialisierung überschneidet.
Hatte sonst keine Probleme daher denke ich dass diese Meldung dann auch wieder verschwindet.
 

DonManfred

Expert
Licensed User
Ich versuchte bereits mit GetSafeDirDefaultExternal zu überprüfen aber warscheinlich mache ich dort einen Fehler.
Ja!


B4X:
rp.GetSafeDirDefaultExternal("")
liefert einen STRING zurück. Eben den Pfad.
Warum benutzt Du den nicht?

B4X:
dim path as string = rp.GetSafeDirDefaultExternal("")
BENUTZE NICHT File.DirRootExternal! Vergiss diesen Pfad am besten gleich. Du wirst in kommenden Android-Versionen keinen Zugriff dahin haben.
 

arnold steger

Member
Licensed User
Wenn ich diesen Pfad verwende kann ich meine Datei über "Eigene Dateien" nicht finden.
Oder liegt der Fehler beim speichern?

B4X:
If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Then
        Log ("PERMISSION_WRITE_EXTERNAL_STORAGE= "&rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE))
        rp.GetSafeDirDefaultExternal("Sicherung")
        PfadBackup = GetSafeDirDefaultExternal"
        File.MakeDir(File.DirDefaultExternal, "Sicherung")
        File.Copy(PfadPunkte,"Meine Punkte.txt",PfadBackup,"Meine Punkte.txt")
 

DonManfred

Expert
Licensed User
File.MakeDir(File.DirDefaultExternal, "Sicherung")
Punkt 4. Wurde oben aber schonmal erwähnt.

Die einzig richtige Antwort ist: nutze die Externalstorage klasse. Alles andere wird bald nicht mehr funktionieren; google wird das verhindern.
 

arnold steger

Member
Licensed User
Punkt 4. Wurde oben aber schonmal erwähnt.

Die einzig richtige Antwort ist: nutze die Externalstorage klasse. Alles andere wird bald nicht mehr funktionieren; google wird das verhindern.
Das würde ich gerne. Habe mir viele male videos und andere posts angesehen, kapier aber anscheinend nicht das wesentliche.
Wichtig ist für mich nur dass ich die Datei über einen Dateimanager sehe.
Auch Fotos oder andere Dateien müsste ich auf einen Pfad ablegen können den ich dann auch sehe. Daher Internal nicht möglich.
Mein Phone hat Android11 wo ich diese Dateien nicht sehe. Ein weiteres zum Testen hat noch Android10 wo ich in diesem Pfad die Dateien finde aber zB. die Fotos in der Galerie nicht angezeigt bekomme.
Also wenn ich richtig verstanden habe muss ich hierfür keine Dir mehr anlegen und dieser Code müsste ohne ausgeklammerter Zeile funktionieren?
B4X:
If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Then
        Log ("PERMISSION_WRITE_EXTERNAL_STORAGE= "&rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE))
        rp.GetSafeDirDefaultExternal("Sicherung")
        PfadBackup = GetSafeDirDefaultExternal"
'       File.MakeDir(File.DirDefaultExternal, "Sicherung")
        File.Copy(PfadPunkte,"Meine Punkte.txt",PfadBackup,"Meine Punkte.txt")
 

arnold steger

Member
Licensed User
Hatte in dieser Zeile noch einen Fehler vom vorherigen post übernommen.
Dieser Code müsste also so funktionieren dass ich diese Datei "Meine Punkte.txt" finde?
Bei Android 11 sehe ich im Pfad Android/Data gar nichts.
B4X:
If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Then
        Log ("PERMISSION_WRITE_EXTERNAL_STORAGE= "&rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE))
        rp.GetSafeDirDefaultExternal("Sicherung")
        PfadBackup = rp.GetSafeDirDefaultExternal("Sicherung")
        File.Copy(PfadPunkte,"Meine Punkte.txt",PfadBackup,"Meine Punkte.txt")
 

arnold steger

Member
Licensed User
Ich hab mir verschiedene Lösungen angesehen für mein Speicherproblem.
Bin zu dem Beitrag gekommen.
https://www.b4x.com/android/forum/threads/externalstorage-access-sd-cards-and-usb-sticks.90238/
Kann mir irgend jemand behilflich sein beim Code wie ich das ausgewählte Bild einfach nochmal abspeichern kann unter einen andernen Namen?
Versuchte bereits verschiedenes aber vergeblich zB.
Storage.CreateNewFile(GetCurrentFolder, f.Name&"Probe.jpg")

B4X:
Private Sub ListView1_ItemClick (Position As Int, Value As Object)
    Dim f As ExternalFile = Value
    If f = UpItem Then
        'remove the current folder
        FoldersStack.RemoveAt(FoldersStack.Size - 1)
        'get the parent folder which is now the topmost folder
        Dim folder As ExternalFile = GetCurrentFolder
        'remove it and enter it again
        FoldersStack.RemoveAt(FoldersStack.Size - 1)
        EnterFolder(folder)
        
    Else
        'The ExternalFile returned from ListFiles cannot be used directly.
        'We need to first call FindFile.
        f = Storage.FindFile(GetCurrentFolder, f.Name)
        If f.IsFolder Then
            EnterFolder(f)
        Else If IsImageFile(f.Name) Then
            Dim in As InputStream = Storage.OpenInputStream(f)
            'We can open the image directly with Bitmap.Initialize2 however it will not allow us to use LoadBitmapResize
            'so instead we copy it to a temporary file.
            Dim out As OutputStream = File.OpenOutput(File.DirInternal, "temp", False)
            File.Copy2(in, out)
            out.Close
            ImageView1.SetBackgroundImage(LoadBitmapResize(File.DirInternal, "temp", ImageView1.Width, ImageView1.Height, True))
'            Storage.CreateNewFile(GetCurrentFolder, f.Name&"Probe.jpg")
        End If
    End If
End Sub
 
Top