简体   繁体   English

从Android App打开PDF

[英]Opening PDF from android App

I am using custom class for opening PDF from my android application. 我正在使用自定义类从我的Android应用程序打开PDF。 It checks whether PDF is already downloaded and then open PDF using existing PDF Viewer application. 它检查是否已经下载了PDF,然后使用现有的PDF Viewer应用程序打开PDF。 If there is no pdf viewer application then it tries to open pdf using google docs. 如果没有pdf查看器应用程序,则尝试使用google docs打开pdf。

The class was working fine till the upgrade of Android Studio 2.2.3 to 2.3.2 and Build Tool Version from 24 to 25. The target SDK is still API 24. Unable to figure out exact root cause of the issue. 在将Android Studio 2.2.3从2.2.3升级到Build Tool Version从24升级到25之前,该类运行良好。目标SDK仍是API24。无法找出问题的确切根源。

PDF Class : PDF类别

public class PDFTools {
private static final String GOOGLE_DRIVE_PDF_READER_PREFIX = "http://docs.google.com/viewer?url=";
private static final String PDF_MIME_TYPE = "application/pdf";
private static final String HTML_MIME_TYPE = "text/html";

/**
 * If a PDF reader is installed, download the PDF file and open it in a reader.
 * Otherwise ask the user if he/she wants to view it in the Google Drive online PDF reader.<br />
 * <br />
 * <b>BEWARE:</b> This method
 * @param context
 * @param pdfUrl
 * @return
 */
public static void showPDFUrl( final Context context, final String pdfUrl ) {
    if ( isPDFSupported( context ) ) {
        downloadAndOpenPDF(context, pdfUrl);
    } else {
        askToOpenPDFThroughGoogleDrive( context, pdfUrl );
    }
}

/**
 * Downloads a PDF with the Android DownloadManager and opens it with an installed PDF reader app.
 * @param context
 * @param pdfUrl
 */

public static void downloadAndOpenPDF(final Context context, final String pdfUrl) {
    // Get filename
    final String filename = pdfUrl.substring( pdfUrl.lastIndexOf( "/" ) + 1 );
    // The place where the downloaded PDF file will be put
    final File tempFile = new File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), filename );
    if ( tempFile.exists() ) {
        // If we have downloaded the file before, just go ahead and show it.
        Uri uri = null;
        File docPath = new File(context.getExternalFilesDir(null), "Download");
        File newFile = new File(docPath, filename);

        uri = FileProvider.getUriForFile( context, BuildConfig.APPLICATION_ID + ".provider", newFile );

        openPDF( context, uri);
        return;
    }

    // Show progress dialog while downloading
    final ProgressDialog progress = ProgressDialog.show( context, context.getString( R.string.pdf_show_local_progress_title ),
            context.getString( R.string.message_please_wait ), true );

    // Create the download request
    DownloadManager.Request r = new DownloadManager.Request( Uri.parse( pdfUrl ) );
    r.setDestinationInExternalFilesDir( context, Environment.DIRECTORY_DOWNLOADS, filename );
    final DownloadManager dm = (DownloadManager) context.getSystemService( Context.DOWNLOAD_SERVICE );
    BroadcastReceiver onComplete = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if ( !progress.isShowing() ) {
                return;
            }
            context.unregisterReceiver( this );

            progress.dismiss();
            long downloadId = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, -1 );
            Cursor c = dm.query( new DownloadManager.Query().setFilterById( downloadId ) );

            if ( c.moveToFirst() ) {
                int status = c.getInt( c.getColumnIndex( DownloadManager.COLUMN_STATUS ) );
                if ( status == DownloadManager.STATUS_SUCCESSFUL ) {
                    Uri uri = null;
                    try {
                        uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", tempFile );

                    }catch (IllegalArgumentException iae) {
                        iae.printStackTrace();
                    }
                    if (uri !=null) {
                        openPDF(context, uri);
                    }
                }
            }
            c.close();
        }
    };
    context.registerReceiver( onComplete, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE ) );

    // Enqueue the request
    dm.enqueue( r );
}

/**
 * Show a dialog asking the user if he wants to open the PDF through Google Drive
 * @param context
 * @param pdfUrl
 */
public static void askToOpenPDFThroughGoogleDrive( final Context context, final String pdfUrl ) {
    new AlertDialog.Builder( context )
            .setTitle( R.string.pdf_show_online_dialog_title )
            .setMessage( R.string.pdf_show_online_dialog_question )
            .setNegativeButton( R.string.pdf_show_online_dialog_button_no, null )
            .setPositiveButton( R.string.pdf_show_online_dialog_button_yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    openPDFThroughGoogleDrive(context, pdfUrl);
                }
            })
            .show();
}

/**
 * Launches a browser to view the PDF through Google Drive
 * @param context
 * @param pdfUrl
 */
public static void openPDFThroughGoogleDrive(final Context context, final String pdfUrl) {
    Intent i = new Intent( Intent.ACTION_VIEW );
    i.setDataAndType(Uri.parse(GOOGLE_DRIVE_PDF_READER_PREFIX + pdfUrl ), HTML_MIME_TYPE );
    context.startActivity( i );
}
/**
 * Open a local PDF file with an installed reader
 * @param context
 * @param localUri
 */
public static final void openPDF(Context context, Uri localUri ) {
    Intent i = new Intent( Intent.ACTION_VIEW );
    i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    i.setDataAndType( localUri, PDF_MIME_TYPE );
    context.startActivity( i );
}
/**
 * Checks if any apps are installed that supports reading of PDF files.
 * @param context
 * @return
 */
public static boolean isPDFSupported( Context context ) {
    Intent i = new Intent( Intent.ACTION_VIEW );
    final File tempFile = new File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "test.pdf" );
    i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    try {
        i.setDataAndType( FileProvider.getUriForFile( context, BuildConfig.APPLICATION_ID + ".provider" ,tempFile ), PDF_MIME_TYPE );
    }catch (IllegalArgumentException iae ) {
    }
    return context.getPackageManager().queryIntentActivities( i, PackageManager.MATCH_DEFAULT_ONLY ).size() > 0;
}

} }

It throws an error as 它抛出一个错误

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/<PACKAGE>/files/Download/javascript_pdf_version.pdf

I have taken this sample from stack overflow itself. 我已经从堆栈溢出本身中获取了此样本。 Appreciate your help on this. 感谢您的帮助。

Try something like this to download: 试试这样的东西下载:

WebService using RestTemplate: 使用RestTemplate的WebService:

public PdfByteArrayObject getPrintjob(String empId) {
    PdfByteArrayObject pdfByteArrayObject = null;
    try {
        getUrl();
        RestTemplate restTemplate = new RestTemplate();            
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

        pdfByteArrayObject = restTemplate.getForObject("pdfURL" + empId, PdfByteArrayObject.class);


    } catch (Exception e) {
      e.printStackTrace();            
      Log.e("webser======", e.toString());
    }
    return pdfByteArrayObject;
}

The getUrl method(for File conversion & storage): getUrl方法(用于文件转换和存储):

public void getUrl() {
    StringBuffer stringBuffer = new StringBuffer();
    String aDataRow = "";
    String aBuffer = "";
    try {
        File serverPath = new File(Environment.getExternalStorageDirectory(), "ServerUrl");

        if (serverPath.exists()) {
            FileInputStream fIn = new FileInputStream(serverPath);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));

            while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow;
            }
            RestUrl = aBuffer;
            Log.e("RestUrl", RestUrl + "--");
            myReader.close();
        } else {
            Log.e("RestUrl", "File not found");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    // Toast.makeText(getApplicationContext(),aBuffer,Toast.LENGTH_LONG).show();
}

And the object: 和对象:

public class PdfByteArrayObject {

private byte[] pdffile;

public byte[] getPdffile() {
    return pdffile;
}

public void setPdffile(byte[] pdffile) {
    this.pdffile = pdffile;
}
}

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM