Italian permessi accesso cartelle foto

3394509365

Active Member
Licensed User
Longtime User
Buongiorn sto usando questo codice per accedere alle cartelle delle foto per visualizzarla poi in una ImageView.

codice di caricamento foto:
Sub ButtonGetImage_Click
    
    CC.Show("image/*", "Choose image")
    'CC.Show("audio/*", "Choose audio file")
    
End Sub

Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
    
    If Success = True Then
        ImageView1.Bitmap = LoadBitmap(Dir,FileName)
    Else
        ToastMessageShow("No Success :(",True)
    End If
        
End Sub

Se lancio l' app sul mio telefonino con Android 8.0 tutto ok ma se uso il tablet con la versione 4 mi da il seguente errore.



** Activity (main) Pause, UserClosed = false **
sending message to waiting queue (OnActivityResult)
running waiting messages (1)
Error occurred on line: 66 (Main)
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/2329 from pid=2630, uid=10211 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1472)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:148)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:684)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1063)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904)
at android.content.ContentResolver.openInputStream(ContentResolver.java:629)
at anywheresoftware.b4a.objects.streams.File.OpenInput(File.java:211)
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize(CanvasWrapper.java:516)
at anywheresoftware.b4a.keywords.Common.LoadBitmap(Common.java:1343)
at b4a.example.contentchooser.main._cc_result(main.java:435)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:348)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:176)
at anywheresoftware.b4a.phone.Phone$ContentChooser$1.ResultArrived(Phone.java:865)
at anywheresoftware.b4a.BA$4.run(BA.java:568)
at anywheresoftware.b4a.BA.setActivityPaused(BA.java:442)
at b4a.example.contentchooser.main$ResumeMessage.run(main.java:306)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5584)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
** Activity (main) Resume **



ho provato a caricatre la runtimepermission e mi da il seguente errore.:

1583589211629.png


Cosa devo fare?

Grazie
 

Sagenut

Expert
Licensed User
Longtime User
Difficile da capire così.
A quale cartella tenti di accedere?
Forse non è presente in quella versione di android o sul tablet?
Tenti di accedere alla SD esterna e non è presente sul tablet?
Può sembrare un problema di permessi, ma se dici che su Android 8 funziona..............poi però dici di non riuscire ad inserire il RuntimePermission quindi viene da pensare che non hai richiesto i permessi.
Serve un pò di chiarezza e qualche info in più. ;)
 

drgottjr

Expert
Licensed User
Longtime User
dovresti aggionare il sdk manager. support-4v ne fa parte
 

Attachments

  • support.png
    support.png
    27.7 KB · Views: 252

3394509365

Active Member
Licensed User
Longtime User
Sagenut, ti spiego, se lo installo su android 8 funziona senza avere permessi su android 4 non funzione.

Poi invece se tento di caricare la libreria dei permessi mi da quell' errore anche se ho aggiornato sdk manager. support-4v
 

drgottjr

Expert
Licensed User
Longtime User
android 4 è una bestia strana. permesso di leggere external_storage (como dice piì in alto) è necessario . l'hai chiesto nel manifest?
 

Sagenut

Expert
Licensed User
Longtime User
Puoi mostrarci con un LOG il contenuto della variabile "dir" per capire a quale cartella tenti di accedere?
Comunque è importante aggiornare correttamente anche l'SDK.
Domanda: che versione di B4A usi?
Se non lo hai ancora fatto puoi (dovrei quasi dirti DEVI ? ) passare a B4A 9.80 ora che è gratuito.
Se provieni da una versione precedente alla 9.30 devi sapere che c'è un nuovo SDK ora (AndroidX) e quello vecchio non verrà più aggiornato.
Quì trovi le istruzioni per il passaggio al nuovo SDK:
Passaggio ad AndroidX
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Sì ora è gratis per tutti.
 

3394509365

Active Member
Licensed User
Longtime User
comunque il problema con la repository non l' ho risolto , le sto provando tutte

Maven artifact not found: com.android.support/support-v4

mi succede quando importo la libreria runtimepermissions che mi serve per le autorizzazioni.

Prima me lo faceva anche con la libreria GPS ma in seguito a tutti gli aggiornamenti che ho fatto adesso non lo fa più
 

Sagenut

Expert
Licensed User
Longtime User
Hai provato a usare il riquadro Cerca nel SDK Manager e cercare esattamente quel componente per forzare l'installazione?
Dopo quello ne troverai probabilmente altri.
Non so se sono ancora necessari con il nuovo AndroidX o se sono stati sostituiti da altri.
Però intanto forza la ricerca di quelli di cui ti segnala la mancanza.
 

3394509365

Active Member
Licensed User
Longtime User
L' errore Maven risolto, puntavo ad un sdk vecchio.

Tornando alle autorizzazioni, ho seguito i tutorial ed ho costruito questo che naturalmente funziona su android superiori ai 6, nel senso che sul mio vecchio tablet 4.0 non mi chiede nulla ed invece sul mio cell con Andr 8 mi chiede questo.


1583688453540.png



Ottimo

B4X:
Dim rp As RuntimePermissions
    
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    
    If Result Then
   
    Activity.LoadLayout("Layout1")

' qui poi faccio quello che devo fare con le foto

    CC.Initialize("CC")


Avrei tre domande:

1-é giusto mettere il messaggio prima che parta l' Activity?

2-Nell' editor Manifest non ho dovuto scrivere nulla. Perchè nei tutorial di Erel si doveva intervenire anche sul Manifest?

3-Se devo usare la fotocamera per acttuarre la foto, vale lo stesso permesso?

Grazie
 

Sagenut

Expert
Licensed User
Longtime User
Nel manifest il codice và aggiunto.
In pratica nel manifest dichiari i permessi di cui hai bisogno e poi da codice li devi richiedere.
La pratica migliore è di fare la richiesta di un determinato permesso solo nel momento che ti serve.
Quindi quello del tuo esempio lo dovresti mettere nelle routine dove leggi o scrivi Files.
Non è un problema il fatto che venga richiesto il permesso più volte.
La schermata di richiesta non apparirà più all'utente una volta che lo ha concesso.
Per la fotocamera sicuramente serve un altro permesso.
In B4A in basso a destra vedrai un pulsante List Permissions.
Li vedrai tutti i permessi di cui ha bisogno la tua app.
Quelli con l'asterisco sono quelli che richiedono un permesso esplicito.
 
Last edited:

3394509365

Active Member
Licensed User
Longtime User
di nuovo all' opera.

non riesco a trovare il testo da scrivere nel manifest per questo:

B4X:
  rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
   Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
 

Sagenut

Expert
Licensed User
Longtime User
Runtime Permissions

Per il Manifest
Runtime Permission WRITE EXTERNAL STORAGE:
AddManifestText(
<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  android:maxSdkVersion="28" />
)
 

3394509365

Active Member
Licensed User
Longtime User
grazie,

Ma dove si prende, se mi servono altri permessi dove li trovo ?


nel video tutorial ho visto che uno simile veniva copiato in fase di scrittura del codice.
 
Top