Italian Aprire un pdf da SDK >= 24 (Nougat)

Discussion in 'Italian Forum' started by Gianni Sassanelli, Aug 31, 2018.

  1. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    Ciao a tutti,
    sto avendo un problema per aprire file PDF su versioni android superiori alla 6.0
    Con le vecchie versioni facevo così:
    Code:
    Dim iPdf      As Intent 
    Dim folder   As String
    folder=
    File.DirRootExternal & "/.PDF"
    Dim filename As String
    Filename = 
    "MyPDF.PDF"
    iPdf.Initialize(ii.ACTION_VIEW, ( 
    "file://" & File.Combine(folder, filename)))

    ' mi hanno detto di sostituire file con conten ma non funziona nemmeno così
    ' iPdf.Initialize(ii.ACTION_VIEW, ( "content://" & File.Combine(folder, filename)))
    iPdf.SetType("application/pdf")
    'iPdf.WrapAsIntentChooser("Choose PDF Viewer")
    StartActivity(iPdf)
    esiste questo post ma non riesco ad applicarlo per l'utilizzo sui pdf
    https://www.b4x.com/android/forum/threads/share-txt-files.73166/#post-464921

    qualcuno può aiutarmi?
    Grazie
     
  2. Filippo

    Filippo Expert Licensed User

    Devi studiare questo thread
     
    sirjo66 and Star-Dust like this.
  3. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    ho provato ma purtroppo riesco ad uscirne.
    puoi aiutarmi?
    Grazie
     
  4. LucaMs

    LucaMs Expert Licensed User

    Ti spunta lo stesso errore indicato da Erel in quel post?
    Se alleghi un piccolo progetto di prova (quindi non quello sul quale stai lavorando) e ti dà comunque problemi, provo a darti una mano.
     
  5. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    presto fatto...:(:(:(
     

    Attached Files:

  6. LucaMs

    LucaMs Expert Licensed User

    presto risposto (almeno appena aperto il tuo progetto vedo...)

    Public rp As RuntimePermissions

    all'interno di due routine evento (click di tasti)

    1) all'interno di una routine è inutile dichiarare Public una variabile perché sarà comunque privata;
    2) quella riga va messa nella Process_Globals.

    Intanto guardo il resto...
     
  7. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    si ho fatto dei copia incolla veloci ma il problema è come lanciare la intent del pdf con il fileprovider che deve essere utilizzato da api 23 in poi

    il file c'è la intent viene lanciata ma per problemi di permessi non riesce a leggere il file.
    quest è il link dove viene spiegato qualcosa ma non riesco ad aprire il visualizzatore pdf https://www.b4x.com/android/forum/threads/share-txt-files.73166/#post-464921
     
  8. LucaMs

    LucaMs Expert Licensed User

    Seconda cosa (non hai seguito bene il tutorial riguardante le runtime permissions):

    upload_2018-8-31_12-36-2.png

    Quella sopra è evidentemente uno screenshot parziale, quindi ti riporto il codice qui sotto, così puoi copiarlo (ma sarebbe bene che studiassi il tutorial):
    Code:
    AddManifestText(
    <uses-permission
      android:name=
    "android.permission.WRITE_EXTERNAL_STORAGE"
      android:maxSdkVersion=
    "18" />
    )
     
  9. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

  10. LucaMs

    LucaMs Expert Licensed User

    E che sto facendo? Sto lavorando per te; anzi, dopo ti do il mio IBAN :p

    Mi mandi questo link ma... hai guardato il progetto allegato? Nel progetto che mi hai mandato, rispetto a quello di Erel, manca tutta la routine che crea l'URI:
    Sub CreateFileProviderUri.
     
    Filippo likes this.
  11. Star-Dust

    Star-Dust Expert Licensed User

    Dal SDK 23 devi attivare i permessi di scrittura.
    Vedi questo per un idea globale dei permessi , e in particolare quest'altro

    Dalla 24 in poi devi usare la cartella SHARe per fare quello che vuoi tu.
    Quindi metti un controllo, se hai sdk>=24 il file lo devi copiare nella cartella SHARE della tua App e poi lanciare l'intent
    Vedi questo per capire il sistema di condivisione e ricevimento, e in particolare questo per la condivisione di un tuo file con altra applicazione
     
    Filippo likes this.
  12. LucaMs

    LucaMs Expert Licensed User

    Ecco, allora visto che c'è un sostituto, mi dedico ad altro :)
     
  13. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    no ragazzi per favore ho seguito gli esempi ma non ci riesco.
     
  14. Star-Dust

    Star-Dust Expert Licensed User

    A me il tuo esempio funziona (Non funziona 1) con Android 7, su che dispositivo lo stai provando

    PS Il modo in cui chiedi i permessi è sbagliato
     
  15. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    lo sto provando su un cellulare.
    Se lo provi su un emulatore o su un dispositivo con permessi di ROOT funziona.

    Il problema è proprio la richiesta dei permessi.
    Mi dici che è sbagliato il modo di chiedere i permessi, ma mi potresti far capire come devo fare?
    Mi puoi mandare uno stralcio di codice per favore?
     
  16. Star-Dust

    Star-Dust Expert Licensed User

    Ho provato Su Samsung S6 con Android 7, non uso mai gli emulatori. Ho diversi dispositivi fisici. Adesso provo sugli altri
     
  17. Star-Dust

    Star-Dust Expert Licensed User

    Huawei Honor 9 con Android 8.1 funziona. Che dispositivo usi tu?

    Posso inviarti un esempio nel pomeriggio o stasera, adesso sto andando in pausa. Vedi nel frattempo i link che ti abbiamo indicato, ci sono molti esempi. e segui i consigli che ti hanno dato in questo thread.
     
  18. Gianni Sassanelli

    Gianni Sassanelli Member Licensed User

    io sto usando un tablet samsung android 7.1 ma anche sul mio telefono htc m9 con android 7.0
     
  19. Star-Dust

    Star-Dust Expert Licensed User

  20. Star-Dust

    Star-Dust Expert Licensed User

    1) Partiamo dal primo errore non c'è un permesso SHARED da chiedere.
    Con SHARED si intende una cartella, non un permesso. Accedere in questa cartella non richiede permessi, ma si serve l'indirizzo URI.
    Con la variabile RuntimePermissions chiedi di aprire/creare un luogo SICURO e di chiamarlo ad esempio SHARED.
    Poi lo passi come parametro alla metodo FileShared di android che restituisce un URI che potrai usare con l'Intent

    Mentre quando parliamo di permessi o meglio permessi critici per i quali è necessario chiedere autorizzazione in runtime sono i seguenti:

    upload_2018-8-31_15-48-49.png

    Nel caso della condivizione , chiedi casomai i permessi di lettura (o scrittura che includono anche la lettura) se il file da condividere (PDF,TXT o altro) non si trova dentro le cartelle dell'App ma nella memoria del dispositivo. Nella Root principale o in una delle sue cartelle o sotto cartelle.

    Nel tuo esempio il file si trova all'interno dell'App, quindi non richiede il permesso di lettura delle cartelle del dispositivo.


    ___________________________________________________________
    2) COME SI USANO I PERMESSI
    I permessi si dichiarano o nel modulo Starter o nel GLOBALS.
    Chiedi il permesso in Activity_Resume, Activity_Create() o in starter, in base a cosa hai scelto e devi aspettare che ricevi la risposta nell'Activity Result cosi:
    Code:
    Sub Activity_PermissionResult (Permission As String, Result As Boolean)
        
    If Permission=rp.PERMISSION_WRITE_EXTERNAL_STORAGE And Result Then
            PermessoDato=Result
        
    End If
    End Sub
    Prima di ogni lettura devi verificare la tua variabile (nell'esempio sopra PermessoDato) per verificare se hai il permesso altrimenti mandi un avviso all'utente e richiedi di nuovo il permesso
    Code:
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
     
    Last edited: Aug 31, 2018
    mendiburen likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice