German PDF mit Standard-App anzeigen

peternmb

Active Member
Licensed User
Hallo,

ich erzeuge in meiner B4A-App ein PDF-Dokument und lasse es wahlweise anzeigen, speichern oder als Mail verschicken.
Das hat bisher seit Jahren funktioniert - jetzt auf einmal nicht mehr.
B4X:
Sub OpenPDF(FileName As String)
    Dim i As Intent 'Requires a reference to the Phone library
    i.Initialize(i.ACTION_VIEW, FileName)
    i.SetType("application/pdf")
    StartActivity(i)
End Sub
Ich kann das erzeugte Dokument problemlos mit einem PDF-Viewer öffnen - aber halt nicht aus dem Programm heraus.
Bisher war das PDF in einem von meinem Programm erzeugten Verzeichnis gespeichert, ich habe es jetzt auch mit File.DirInternal versucht bringt aber auch nichts.
 

DonManfred

Expert
Licensed User

peternmb

Active Member
Licensed User
Ich habe die App bereits notgedrungen vor einiger Zeit umgestellt auf:

<uses-sdk android:minSdkVersion="14"
android:targetSdkVersion="28" />


Gibt es denn kein Verzeichnis, das ich ohne zusätzlichen Aufwand z.B. zum Zwischenspeichern des PDF nutzen kann?
 

peternmb

Active Member
Licensed User
In meiner Manifest-Datei habe ich bereits das drin stehen:
B4X:
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" />
)
Hilft mir das irgendwie weiter?
 

peternmb

Active Member
Licensed User
Ich sehe eben, dass ich da auch bereits ein Modul "FileProvider" drin habe:
B4X:
'v1.00
Sub Class_Globals
    Public SharedFolder As String
    Public UseFileProvider As Boolean
    Private rp As RuntimePermissions
End Sub

Public Sub Initialize
    Dim p As Phone
    If p.SdkVersion >= 24 Or File.ExternalWritable = False Then
        UseFileProvider = True
        SharedFolder = File.Combine(File.DirInternal, "shared")
        File.MakeDir("", SharedFolder)
    Else
        UseFileProvider = False
        SharedFolder = rp.GetSafeDirDefaultExternal("shared")
    End If
    Log($"Using FileProvider? ${UseFileProvider}"$)
End Sub

'Returns the file uri.
Public Sub GetFileUri (FileName As String) As Object
    
    If UseFileProvider = False Then
        Dim uri As JavaObject
        Return uri.InitializeStatic("android.net.Uri").RunMethod("parse", Array("file://" & File.Combine(SharedFolder, FileName)))
    Else
        Dim f As JavaObject
        f.InitializeNewInstance("java.io.File", Array(SharedFolder, FileName))
        Dim fp As JavaObject
        Dim context As JavaObject
        context.InitializeContext
        fp.InitializeStatic("android.support.v4.content.FileProvider")
        Return fp.RunMethod("getUriForFile", Array(context, Application.PackageName & ".provider", f))
    End If
End Sub

'Replaces the intent Data field with the file uri.
'Resets the type field. Make sure to call Intent.SetType after calling this method
Public Sub SetFileUriAsIntentData (Intent As Intent, FileName As String)
    Dim jo As JavaObject = Intent
    jo.RunMethod("setData", Array(GetFileUri(FileName)))
    Intent.Flags = Bit.Or(Intent.Flags, 1) 'FLAG_GRANT_READ_URI_PERMISSION
End Sub
Nur, wie nutze ich das dann in meinem Beispielcode?
 

DonManfred

Expert
Licensed User
Die Forumsuche funktioniert bei Dir nicht?

B4X:
Dim FileName As String = "xx.pdf"
        File.Copy(File.DirAssets, FileName, Starter.Provider.SharedFolder, FileName)
        Dim in As Intent
        in.Initialize(in.ACTION_VIEW, "")
        Starter.Provider.SetFileUriAsIntentData(in, FileName)
        'Type must be set after calling SetFileUriAsIntentData
        in.SetComponent("android/com.android.internal.app.ResolverActivity")
        in.SetType("application/pdf")
        StartActivity(in)
 

peternmb

Active Member
Licensed User
Die Forumsuche funktioniert bei Dir nicht?
Ich war schon dabei, das Tutorial durchzuarbeiten ;)
Ich glaube auch, dass ich mittlerweile kapiert habe um was es geht.
Vielen Dank für die konstruktive Hilfe, jetzt funktioniert es endlich wieder 👍
 
Top