如何从应用程序内浏览器打开PDF文件?

时间:2015-07-14 01:34:44

标签: java android pdf android-intent browser

我的应用程序中有一个基本的文件浏览器,我希望它能够打开PDF文件,但出于某种原因,即使我可以点击PDF文件并打开一秒钟,它们也会消失手机给出了一个错误的Toast消息,这个Toast我没有在我的代码中的任何地方编程。这很奇怪,因为相同的PDF文件从我的其他活动中打开而没有任何问题。 (请参阅OpenPDF()方法,该方法适用于我的PDFManager类)我研究了很多关于如何解决此问题但未找到明确答案的方法。谢谢你的帮助!

  

toast错误:无法显示PDF(无法打开filename.pdf)   

OnListItemClick function from AndroidFileBrowser:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        String filename = (String) getListAdapter().getItem(position);
        if (path.endsWith(File.separator)) {
            filename = path + filename;
        } else {
            filename = path + File.separator + filename;
        }
        pdf = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/PATH/" + filename);
        Uri path = Uri.fromFile(pdf);
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setDataAndType(path, "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
        e.printStackTrace();
        }
    }

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.faraz.pdfreader"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".SimpleScannerActivity"
            android:label="@string/simple_scanner_activity"
            android:theme="@style/AppOverlayTheme">
        </activity>
        <activity android:name=".PDFManager"/>
        <activity android:name=".AndroidFileBrowser"/>
                  <!--android:screenOrientation="portrait"-->
    </application>
</manifest>

我的PDFManager类中的OpenPDF()方法

    public void openPDF() {
        File pdf = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/PATH/" + pdfname + ".pdf");
        if (pdf.exists()) {
            Uri path = Uri.fromFile(pdf);
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setDataAndType(path, "application/pdf");
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            try {
                startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Toast.makeText(PDFManager.this,
                        "No application available to view PDF!",
                        Toast.LENGTH_SHORT).show();
     /*                Intent intent = new Intent(Intent.ACTION_VIEW)
                        .setData(Uri.parse("http://docs.google.com/gview?embedded=true&url=" + url));
                startActivity(intent);
            }
     */
            }
        }
    }
 }

1 个答案:

答案 0 :(得分:1)

在OnItemClick()中:

if (path.endsWith(File.separator)) 
{
    filename = path + filename;
} 
else 
{
    filename = path + File.separator + filename;
}

pdf = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/PATH/" + filename);
Uri path = Uri.fromFile(pdf);

在初始化之前使用“path”,因此根据您的意图更改其中一个或另一个的名称,或者在if语句之前声明它而不是之后。