How to open a PDF via Intent from SD card How to open a PDF via Intent from SD card android android

How to open a PDF via Intent from SD card


Try this code, display pdf file From /sdcard

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf");Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(file), "application/pdf");intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);startActivity(intent);


For Android Nougat and above some more work have to be done otherwise the app won't be able to open the .pdf file. We have to set a temporary permission to URI using the FileProvider:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {     File file=new File(mFilePath);     Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);     intent = new Intent(Intent.ACTION_VIEW);     intent.setData(uri);     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);     startActivity(intent); } else {     intent = new Intent(Intent.ACTION_VIEW);     intent.setDataAndType(Uri.parse(mFilePath), "application/pdf");     intent = Intent.createChooser(intent, "Open File");     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     startActivity(intent); }


Download source code from here (Open pdf file from sdcard in android programmatically)

Add this dependency:

compile ‘com.github.barteksc:android-pdf-viewer:2.0.3

activity_main.xml:

<?xml version=”1.0″ encoding=”utf-8″?><RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;xmlns:tools=”http://schemas.android.com/tools&#8221;android:id=”@+id/activity_main”android:layout_width=”match_parent”android:layout_height=”match_parent”android:background=”#efefef”><ListViewandroid:layout_width=”match_parent”android:id=”@+id/lv_pdf”android:divider=”#efefef”android:layout_marginLeft=”10dp”android:layout_marginRight=”10dp”android:layout_marginTop=”10dp”android:layout_marginBottom=”10dp”android:dividerHeight=”5dp”android:layout_height=”wrap_content”></ListView></RelativeLayout>

MainActivity.java:

package com.pdffilefromsdcard;import android.Manifest;import android.app.ProgressDialog;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class MainActivity extends AppCompatActivity {ListView lv_pdf;public static ArrayList<File> fileList = new ArrayList<File>();PDFAdapter obj_adapter;public static int REQUEST_PERMISSIONS = 1;boolean boolean_permission;File dir;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {lv_pdf = (ListView) findViewById(R.id.lv_pdf);dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath());fn_permission();lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Intent intent = new Intent(getApplicationContext(), PdfActivity.class);intent.putExtra(“position”, i);startActivity(intent);Log.e(“Position”, i + “”);}});}public ArrayList<File> getfile(File dir) {File listFile[] = dir.listFiles();if (listFile != null && listFile.length > 0) {for (int i = 0; i < listFile.length; i++) {if (listFile[i].isDirectory()) {getfile(listFile[i]);} else {boolean booleanpdf = false;if (listFile[i].getName().endsWith(“.pdf”)) {for (int j = 0; j < fileList.size(); j++) {if (fileList.get(j).getName().equals(listFile[i].getName())) {booleanpdf = true;} else {}}if (booleanpdf) {booleanpdf = false;} else {fileList.add(listFile[i]);}}}}}return fileList;}private void fn_permission() {if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {} else {ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_PERMISSIONS);}} else {boolean_permission = true;getfile(dir);obj_adapter = new PDFAdapter(getApplicationContext(), fileList);lv_pdf.setAdapter(obj_adapter);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_PERMISSIONS) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {boolean_permission = true;getfile(dir);obj_adapter = new PDFAdapter(getApplicationContext(), fileList);lv_pdf.setAdapter(obj_adapter);} else {Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show();}}}}

activity_pdf.xml:

<?xml version=”1.0″ encoding=”utf-8″?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;android:layout_width=”match_parent”android:background=”#ffffff”android:layout_height=”match_parent”android:orientation=”vertical”><com.github.barteksc.pdfviewer.PDFViewandroid:id=”@+id/pdfView”android:layout_margin=”10dp”android:layout_width=”match_parent”android:layout_height=”match_parent” /></LinearLayout>

PdfActivity.java:

package com.pdffilefromsdcard;

import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import com.github.barteksc.pdfviewer.PDFView;import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;import com.shockwave.pdfium.PdfDocument;import java.io.File;import java.util.List;public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener {PDFView pdfView;Integer pageNumber = 0;String pdfFileName;String TAG=”PdfActivity”;int position=-1;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pdf);init();}private void init(){pdfView= (PDFView)findViewById(R.id.pdfView);position = getIntent().getIntExtra(“position”,-1);displayFromSdcard();}private void displayFromSdcard() {pdfFileName = MainActivity.fileList.get(position).getName();pdfView.fromFile(MainActivity.fileList.get(position)).defaultPage(pageNumber).enableSwipe(true).swipeHorizontal(false).onPageChange(this).enableAnnotationRendering(true).onLoad(this).scrollHandle(new DefaultScrollHandle(this)).load();}@Overridepublic void onPageChanged(int page, int pageCount) {pageNumber = page;setTitle(String.format(“%s %s / %s”, pdfFileName, page + 1, pageCount));}@Overridepublic void loadComplete(int nbPages) {PdfDocument.Meta meta = pdfView.getDocumentMeta();printBookmarksTree(pdfView.getTableOfContents(), “-“);}public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {for (PdfDocument.Bookmark b : tree) {Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx()));if (b.hasChildren()) {printBookmarksTree(b.getChildren(), sep + “-“);}}}}

Thanks!