Development Example – Document Viewer Applet

The document viewer can be used by third party applications. These applications can launch the document viewer application directly and pass in a document or image to view. In order to launch a document the application passes the location of the file they wish to open. This document must be saved locally on the device

Applications broadcast Intent.ACTION_VIEW with the file’s URI and Mime type.

 File document = 
      new File(Environment.getExternalStorageDirectory(), "document.pdf"); 
 String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension( 
      MimeTypeMap.getFileExtensionFromUrl(document.toURI().toString())); 

 if (mimeType != null) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.addCategory(Intent.CATEGORY_DEFAULT); 
      intent.setDataAndType(Uri.fromFile(document), mimeType); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
 }
 startActivity(intent)

IMPORTANT: For compatibility with HMT-1 Release 10 and above, you need to implement a FileProvider to handle URI creation instead of Uri.fromFile().

The FileProvider must be specified in the AndroidManifest.xml file, with the following attributes:

     
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
     <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

 

As the directories used by the FileProvider must be specified beforehand, one or more child elements of the <paths> element should be added to the res/xml/file_paths.xml file.

<paths>
      <external-files-path name="my_documents" path="Documents" /> 
</paths>

 

This path component must correspond to the path used to create the output file in the java code. In this case the File that corresponds is the following:

final File mediaStorageDir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);

 

Finally, to invoke the camera intent, the URI is given by the FileProvider and passed into the intent.

File document = new File(mediaStorageDir, "document.pdf");

String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
      MimeTypeMap.getFileExtensionFromUrl(document.toURI().toString())); 

final Uri contentUri = FileProvider.getUriForFile(
                    getApplicationContext(),
                    getApplicationContext().getPackageName() + ".fileprovider",
                    document);

if(mimeType != null){
	final Intent viewIntent = new Intent(Intent.ACTION_VIEW); 
	viewIntent.addCategory(Intent.CATEGORY_DEFAULT);
	viewIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
	viewIntent.setDataAndType(contentUri, mimeType); 
    viewIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

	startActivity(viewIntent);
}

 

Bundle Extras

There are a few additional Extras you can include with your View intent to customize the user experience upon launching the DocumentViewer:

KeyArgument TypeDescription
‘page’intUse to specify which page to open first. Default: 1
‘zoom’intUse to specify which zoom level should be active upon opening document. Default: 1

 

View Full Source Code