Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to open PDF file from internal storage in Oreo?

I try to open PDF file in Oreo but it does not open. I don't get any error. What is the issue? PDF file does not open. Only black screen is shown. In logcat no errors show. What is wrong?

How Can I resolve this issue? I referred many links but did not get solution. I also tried many codes but no help.

My Code is:

   File file11 = new File(Environment.getExternalStorageDirectory().
   getAbsolutePath(), 
   "AtmiyaImages/" + nameoffile1);
    Intent target = new Intent(Intent.ACTION_VIEW);
    target.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if(Build.VERSION.SDK_INT>24){
        Uri uri=FileProvider.getUriForFile(AssignmentActivity.this,
        getPackageName()+".provider",file11);
        target.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        target.putExtra(Intent.EXTRA_STREAM,uri);
        target.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        target.setType("application/pdf");
        Intent intent=Intent.createChooser(target,"Open File");
        try
        {
        startActivity(intent);
        }
        catch(ActivityNotFoundException e)
        {
        Toast.makeText(AssignmentActivity.this,"No Apps 
       can performs This acttion",Toast.LENGTH_LONG).show();
        }
        }

        else
        {
        target.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        target.setDataAndType(Uri.fromFile(file11),"application/pdf");
        target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        Intent intent=Intent.createChooser(target,"Open File");
        try
        {
        startActivity(intent);
        }
        catch(ActivityNotFoundException e)
        {
        Toast.makeText(AssignmentActivity.this,"No Apps can performs This 
        acttion",Toast.LENGTH_LONG).show();
        }

        }

In Manifest I also add

   <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.infinity.infoway.atmiya.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
       </provider>

And My Xml code is:

 <?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
 name="Phonestorage"
path="/storage/emulated/0/AtmiyaImages"/>
</paths>
like image 632
Darshi Patel Avatar asked Oct 13 '18 04:10

Darshi Patel


People also ask

How do I open a PDF from internal storage on Android?

Opening a PDF file in Android using WebView All you need to do is just put WebView in your layout and load the desired URL by using the webView. loadUrl() function. Now, run the application on your mobile phone and the PDF will be displayed on the screen.

How do I list files in internal storage on Android?

Head to Settings > Storage > Other and you'll have a full list of all the files and folders on your internal storage.


2 Answers

Replace your path value with "." - Look at below:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

Inside Manifest, "provider" code is like this, your one is also true.

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

For access proper file path follow this code:

File  pdfFile = new File(getExternalFilesDir(GlobalUtils.AppFolder), fileName);
     Uri path = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", pdfFile);
                Log.e("create pdf uri path==>", "" + path);

                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(path, "application/pdf");
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    startActivity(intent);
                    finish();
                } catch (ActivityNotFoundException e) {
                    Toast.makeText(getApplicationContext(),
                            "There is no any PDF Viewer",
                            Toast.LENGTH_SHORT).show();
                    finish();
                }

Hope this will help you.

like image 85
Bhoomika Patel Avatar answered Nov 04 '22 12:11

Bhoomika Patel


Some tweaks to Bhoomika's answer worked for me

xml/providers_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="."/>
</paths>

AndroidManifest.xml

<provider
         android:name="androidx.core.content.FileProvider"
         android:authorities="APPLICATION_ID.provider"
         android:exported="false"
         android:grantUriPermissions="true">
         <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
</provider>

A Kotlin Extension function to open the PDF from an activity

fun Activity.openPdf(filename: String?) {
    val file =  File(filesDir, filename)

    if(file.exists()) {
        Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(FileProvider.getUriForFile(this@openPdf, BuildConfig.APPLICATION_ID + ".provider", file), "application/pdf")
            flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            try {
                startActivity(this)
            } catch (e: Exception) {
                showErrorDialog(unable_to_open_doc)
            }
        }
    } else {
        showErrorDialog(file_doesnt_exist)
    }
}
like image 29
Vishak A Kamath Avatar answered Nov 04 '22 13:11

Vishak A Kamath