Italian Errore Privilegi App con Android 11

Walter Scafati

Active Member
Licensed User
Longtime User
Buongiorno, rimane un ultimo problema (spero), se installo la app da b4a (release) sul telefono con android 11 non ho problemi, ma se la installo facendo il download dal mio server, quando deve leggere la memoria interna da questo errore sempre riguardo i privilegi:


java.io.FileNotFoundException: /storage/emulated/0/Android/data/b4a.verdeco/files/1.jpg: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileInputStream.<init>(FileInputStream.java:160)
at anywheresoftware.b4a.objects.streams.File.OpenInput(File.java:215)
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize(CanvasWrapper.java:516)
at anywheresoftware.b4a.keywords.Common.LoadBitmap(Common.java:1342)
at b4a.verdeco.main._timer1_tick(main.java:3616)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
at anywheresoftware.b4a.objects.Timer$TickTack.run(Timer.java:105)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:263)
at android.app.ActivityThread.main(ActivityThread.java:8278)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
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:8160)
at libcore.io.IoBridge.open(IoBridge.java:478)
... 15 more


Il manifest l'ho modificato con tutto quello che serviva ma non capisco dove sbaglio

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: http://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="30"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetApplicationAttribute(android:usesCleartextTraffic, "true")
SetApplicationAttribute(android:requestLegacyExternalStorage, true)

'la riga successiva puo' risolvere problemi di grafica per Ver. 5.0
SetApplicationAttribute(android:theme, "@android:style/Theme.Holo")
AddManifestText(<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>)
AddManifestText(<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>)
AddManifestText(<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>)
'AddManifestText(<uses-permission android:name="android.permission.CAMERA"/>)
'End of default text.
AddManifestText(<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="19" />)
AddManifestText(<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

AddPermission(android.permission.READ_EXTERNAL_STORAGE)

AddReceiverText(eu.dgconsulting.appupdating.newinst2,
  <intent-filter>
  <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" />
  </intent-filter>)
 
  SetApplicationAttribute(android:theme, "@style/MyAppTheme")

CreateResource(values, theme.xml,
<resources>
    <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">#0098FF</item>
        <item name="colorPrimaryDark">#007CF5</item>
        <item name="colorAccent">#AAAA00</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowTranslucentNavigation">false</item>
         <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>
)

CreateResourceFromFile(Macro, Core.NetworkClearText)

AddApplicationText(
  <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="$PACKAGE$.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/provider_paths"/>
  </provider>
)

CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)
 

Star-Dust

Expert
Licensed User
Longtime User
Ma il file che vuoi caricare è interno?
In quale cartella lo hai memorizzato?
 

Walter Scafati

Active Member
Licensed User
Longtime User
java.io.FileNotFoundException: /storage/emulated/0/Android/data/b4a.verdeco/files/1.jpg: open failed: EACCES (Permission denied)

a me sembrava un problema di privilegi quel "PERMISSION DENIED"
 

Star-Dust

Expert
Licensed User
Longtime User
Ma mi sembra che punta la cartella internal la quale non richiede permessi, quindi il problema presumo che non ci sia l'assenza del file
 

Star-Dust

Expert
Licensed User
Longtime User
Scusami ma sono con il telefonino e spesso sbaglia.
Presumo che l'errore segnali l'assenza del file
java.io.FileNotFoundException

Quindi forse stai caricando un file da codice o dal design e lui non lo trova.
Questo 1.png dove lo usi?
 

Walter Scafati

Active Member
Licensed User
Longtime User
Scusami ma sono con il telefonino e spesso sbaglia.
Presumo che l'errore segnali l'assenza del file


Quindi forse stai caricando un file da codice o dal design e lui non lo trova.
Questo 1.png dove lo usi?
Questo errore mi sembra strano perché io controllo la presenza del file prima di aprirlo:
B4X:
    If File.Exists(shared,"1.jpg") Then
        ...

dove

B4X:
    Sub Process_Globals
        Private rp As RuntimePermissions
        Private shared As String
        ...
    End sub  
               
    shared = rp.GetSafeDirDefaultExternal("")

Non vorrei, invece che il problema sia quando il file è già presente e tento di riscriverlo.

Però quello che è veramente strano è che se scarico la app sul telefono utilizzando l'ambiente B4A la app funziona, se invece faccio il download dal server mi da questo errore.
 

Star-Dust

Expert
Licensed User
Longtime User
Non ci sono elementi sufficienti per capire il problema mi dispiace
 

Walter Scafati

Active Member
Licensed User
Longtime User
Però quello che è veramente strano è che se scarico la app sul telefono utilizzando l'ambiente B4A la app funziona, se invece faccio il download dal server mi da questo errore.
 

Star-Dust

Expert
Licensed User
Longtime User
Ma installi sullo stesso dispositivo?
Hai provato a disinstallare e reinstallare con b4A?
 

Walter Scafati

Active Member
Licensed User
Longtime User
Ma installi sullo stesso dispositivo?
Hai provato a disinstallare e reinstallare con b4A?
Sì, sto usando sempre lo stesso dispositivo e prima di installare disinstallo sempre.

Ho Fatto qualche prova in più e quello che ho notato è che il file 1.jpg esiste ma sembra come se la FOTOCAMERA abbia proprietà esclusiva del file.
In pratica quando acquisisco la foto creo il file 1.jpg che viene salvato in Android/data/b4a.miaapp/files.

Star-Dust said:
Ma mi sembra che punta la cartella internal la quale non richiede permessi, quindi il problema presumo che non ci sia l'assenza del file

Però io non punto alla Internal ma a shared = rp.GetSafeDirDefaultExternal("")
 

Star-Dust

Expert
Licensed User
Longtime User
Sì, sto usando sempre lo stesso dispositivo e prima di installare disinstallo sempre.

Ho Fatto qualche prova in più e quello che ho notato è che il file 1.jpg esiste ma sembra come se la FOTOCAMERA abbia proprietà esclusiva del file.
In pratica quando acquisisco la foto creo il file 1.jpg che viene salvato in Android/data/b4a.miaapp/files.

Star-Dust said:
Ma mi sembra che punta la cartella internal la quale non richiede permessi, quindi il problema presumo che non ci sia l'assenza del file

Però io non punto alla Internal ma a shared = rp.GetSafeDirDefaultExternal("")
shared si trova dentro dirInternal. anzi nel tuo caso corrispondono.
Se hai acquisito da fotocamera, forse non hai chiuso (close) il file quando lo hai salvato e cosi non puoi accedere.
 

Walter Scafati

Active Member
Licensed User
Longtime User
shared si trova dentro dirInternal. anzi nel tuo caso corrispondono.
Se hai acquisito da fotocamera, forse non hai chiuso (close) il file quando lo hai salvato e cosi non puoi accedere.
Ho verificato ma i close ci sono, a meno che il problema non sia nella classe CameraEx, però sembra corretta.

B4X:
'Saves the data received from PictureTaken event
Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String)
    Dim out As OutputStream = File.OpenOutput(Dir, FileName, False)
    out.WriteBytes(Data, 0, Data.Length)
    out.Close
End Sub

mentre nel main ho:

B4X:
Sub fotocamera_PictureTaken (Data() As Byte)
    Dim filename As String = "1.jpg"
    Dim dir As String = shared
    camEx.SavePictureToFile(Data, dir, filename)
    camEx.StartPreview 'restart preview

    ScattaFoto.Enabled = True
    camEx.Release
    CameraInScatto = False
End Sub

poi ho un timer che mi ruota l'immagine:

B4X:
Sub Timer1_Tick                '*** ogni 1 sec ***
    If File.Exists(shared,"1.jpg") And cameraAttiva Then
        Try
            '_______________________ ROTAZIONE FOTO ___________________________________
            Dim b As Bitmap = LoadBitmap(shared,"1.jpg").Rotate(RotazioneFoto)
            Dim out As OutputStream = File.OpenOutput(shared,"1.jpg",False)
            b.WriteToStream(out, 97, "JPEG")
            out.Close
            ImageView1.Visible = True
            ImageView1.Bitmap = LoadBitmap(shared,"1.jpg")
            CancFoto.Visible = True
            Timer1.Enabled = False
        Catch
            Log(LastException)
        End Try
        FotoPresente = True
    End If
End Sub

Mi sembra che l'errore avvenga sulla rotazione.
 

Walter Scafati

Active Member
Licensed User
Longtime User
Lo stesso APK installato su uno smartphone con Android 6 funziona perfettamente.

Mi pare evidente che sia un problema di privilegi sulla lettura / scrittura del file. Ma il manifest vi sembra corretto?
 

Star-Dust

Expert
Licensed User
Longtime User
Per caso stai trasferendo il file sulla memoria Root?
 

Walter Scafati

Active Member
Licensed User
Longtime User
Per caso stai trasferendo il file sulla memoria Root?
No, il file viene spedito con HttpUtils2 verso un server e poi viene cancellato.

Però perché sullo smartphone con Android 6 funziona tutto bene? E' un problema di restrizioni di Android 11 immagino
 
Top