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

Gianni Sassanelli

Active Member
Licensed User
Longtime 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ì:
B4X:
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
 

Gianni Sassanelli

Active Member
Licensed User
Longtime 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.

presto fatto...:(:(:(
 

Attachments

  • PDF_VIEW.zip
    183 KB · Views: 350

LucaMs

Expert
Licensed User
Longtime 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...
 

Gianni Sassanelli

Active Member
Licensed User
Longtime 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...
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
 

LucaMs

Expert
Licensed User
Longtime 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):
B4X:
AddManifestText(
<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  android:maxSdkVersion="18" />
)
 

LucaMs

Expert
Licensed User
Longtime User
dai aiutami
E che sto facendo? Sto lavorando per te; anzi, dopo ti do il mio IBAN :p

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
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.
 

Star-Dust

Expert
Licensed User
Longtime 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
 

Star-Dust

Expert
Licensed User
Longtime User
no ragazzi per favore ho seguito gli esempi ma non ci riesco.
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
 

Gianni Sassanelli

Active Member
Licensed User
Longtime 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?
 

Star-Dust

Expert
Licensed User
Longtime 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?
Ho provato Su Samsung S6 con Android 7, non uso mai gli emulatori. Ho diversi dispositivi fisici. Adesso provo sugli altri
 

Star-Dust

Expert
Licensed User
Longtime User
Ho provato Su Samsung S6 con Android 7, non uso mai gli emulatori. Ho diversi dispositivi fisici. Adesso provo sugli altri
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.
 

Star-Dust

Expert
Licensed User
Longtime User
ezgif-4-d4adc2d8e1.gif
 

Star-Dust

Expert
Licensed User
Longtime User
1) Partiamo dal primo errore non c'è un permesso SHARED da chiedere.
intent viene lanciata ma per problemi di permessi non riesce a leggere il file
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:
B4X:
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
B4X:
rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
 
Last edited:
Top