Android Question FileProvider and Opening PDF Application List

tsteward

Well-Known Member
Licensed User
Longtime User
My App downloads a PDF then using FileProvider it uses share to open the PDF. But the list applications offered does not include any pdf viewers which are installed on the device.

How can I show the PDF apps to select.

I have added to my Manifest
Code: Copy
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" />
)

Then my app is as follows
Code: Copy
If job1.Success Then
                       
                    Dim out As OutputStream = File.OpenOutput(Starter.Provider.SharedFolder, fname, False)
                    File.Copy2(job1.GetInputStream, out)
                    out.Close
                    ProgressDialogHide
                    If foMenu.IsInitialized Then
                        If foMenu.MenuIsVisible Then
                            foMenu.HideFan
                        End If
                    End If
                    Log("file://" & Starter.Provider.SharedFolder & "/" & fname)
                    Dim in As Intent
                    in.Initialize(in.ACTION_SEND, "")
                    in.SetType("application/pdf")
                    in.PutExtra("android.intent.extra.STREAM", Starter.Provider.GetFileUri(fname))
                    in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION
                    StartActivity(in)
                End If

When executed I get the list below to choose from :( no pdf applications in list.
 

Attachments

  • Screenshot_20190507-195002_Android System.jpg
    Screenshot_20190507-195002_Android System.jpg
    112.5 KB · Views: 892
this can help.

Code: Copy
        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)
 
Upvote 0
this can help.

Code: Copy
        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)
Thats perfect thank you!!!
 
Upvote 0
Thats perfect thank you!!!
Hello,
I'm trying to do the same thing that you have done, except my app does not download the files from a server like you did, but DropBox.
Any chance of sharing what the solution is on opening a file (pdf, doc, or docx) from the device itself?

My app downloads the files (song charts) from another persons Dropbox (which I have access to) and they are saved/copied manually to a folder I created on the tablet device.
From there the filenames are displayed in a ListView.
Touching on a ListView row gets the filename, which is used in code to try and open and view the file.
I've tried a few things but none have opened the file.

Would sure appreciate you sharing something that would work for me.

Regards,
Mark Stuart
 
Upvote 0
it is as above, except you don't need the parts that refer to the download "job".
you already have the file; just copy it to your fileprovider like member almora did
(from wherever it is that you have it stored).
 
Upvote 0
Hi,
It worked. This is what I did...
Built a new project..
1. Selected a PDF file and added it to the project "MyFile.pdf" (in the Files section)
2. Added the above ApplicationText to the Manifest, from post #1.
3. Added a button to the layout - btnOpenFile
4. Selected the FileProvider library
5. Added this to the Process_Globals - Private Provider As FileProvider
6. Initialized the variable in the Activity_Create - Provider.Initialize
7. and added the following code for the button...
B4X: Copy
Private Sub btnOpenFile_Click
    Dim Filename As String = "MyFile.pdf"
    File.Copy(File.DirAssets,Filename,Provider.SharedFolder,Filename)
    Dim in As Intent
    in.Initialize(in.ACTION_VIEW,"")
    Provider.SetFileUriAsIntentData(in,Filename)
    'in.SetComponent("android/com.android.internal.app.ResolverActivity")    'you can uncomment this line for the user to select which app will open and view the PDF file
    in.SetType("application/pdf")
    StartActivity(in)
End Sub

Now I just got to get it to work for viewing files NOT in the File.DirAssests, but for files already on the device.

Thanx to all here for helping.
Mark Stuart
 
Upvote 0
Back
Top