Java Android-在webview中加载PDF

Java Android-在webview中加载PDF,java,android,pdf,webview,webviewclient,Java,Android,Pdf,Webview,Webviewclient,我有这个webview代码,我想让用户点击PDF链接时打开PDF文件成为可能。这是代码,你能告诉我我必须把什么放在这个PDF区域吗?我尝试了许多不同的方法,但我根本无法查看PDF。谢谢你的帮助 webview.setWebViewClient ( new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { // do your handling code

我有这个webview代码,我想让用户点击PDF链接时打开PDF文件成为可能。这是代码,你能告诉我我必须把什么放在这个PDF区域吗?我尝试了许多不同的方法,但我根本无法查看PDF。谢谢你的帮助

webview.setWebViewClient ( new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        if (url.startsWith("tel:")) {
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
        } else if (url.startsWith("mailto:")) {
            url = url.replaceFirst("mailto:", "");
            url = url.trim();
            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL,
                    new String[]{url});
            startActivity(i);

        } else if (url.startsWith("geo:")) {
            try {
            } catch (Exception e) {
                System.out.println(e);
            }

        } else if (url.endsWith("pdf")) {

            try {

            } catch (Exception e) {
                System.out.println(e);
            }

        } else {
            view.loadUrl(url);
        }
        return true;
        // then it is not handled by default action
    }
});
WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);

这可以简单到:

try
{
 Intent intentUrl = new Intent(Intent.ACTION_VIEW);
 intentUrl.setDataAndType(url, "application/pdf");
 intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 myActivity.startActivity(intentUrl);
}
catch (ActivityNotFoundException e)
{
 Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
}
WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
虽然我还没试过

WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
在我们的应用程序中,我们将PDF下载到应用程序文件系统,使其具有全球可读性,然后传递路径以打开PDF查看应用程序(例如Acrobat Reader)。请注意,您还需要关注清理这些下载的PDF

WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
在你的推铅球中

new DownloadPDFTask().execute(url);
WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
下载PDFTASK类别:

public class DownloadPDFTask extends AsyncTask<String, Void, Integer> 
{
    protected ProgressDialog mWorkingDialog;    // progress dialog
    protected String mFileName;         // downloaded file
    protected String mError;            // for errors

    @Override
    protected Integer doInBackground(String... urls)
    {

     try
     {
      byte[] dataBuffer = new byte[4096];
          int nRead = 0;

          // set local filename to last part of URL
          String[] strURLParts = urls[0].split("/");
          if (strURLParts.length > 0)
            mFileName = strURLParts[strURLParts.length - 1];
          else
                mFileName = "REPORT.pdf";

          // download URL and store to strFileName

          // connection to url
      java.net.URL urlReport = new java.net.URL(urls[0]);
          URLConnection urlConn = urlReport.openConnection();
          InputStream streamInput = urlConn.getInputStream();
          BufferedInputStream bufferedStreamInput = new BufferedInputStream(streamInput);
          FileOutputStream outputStream = myActivity.openFileOutput(mFileName,Context.MODE_WORLD_READABLE); // must be world readable so external Intent can open!
          while ((nRead = bufferedStreamInput.read(dataBuffer)) > 0)
                outputStream.write(dataBuffer, 0, nRead);
          streamInput.close();
          outputStream.close();
      }
      catch (Exception e)
      {
       Log.e("myApp", e.getMessage());
       mError = e.getMessage();
       return (1);
      }

     return (0);
    }

    //-------------------------------------------------------------------------
    // PreExecute - UI thread setup
    //-------------------------------------------------------------------------

    @Override
    protected void onPreExecute()
    {
     // show "Downloading, Please Wait" dialog
     mWorkingDialog = ProgressDialog.show(myActivity, "", "Downloading PDF Document, Please Wait...", true);
     return;
    }

    //-------------------------------------------------------------------------
    // PostExecute - UI thread finish
    //-------------------------------------------------------------------------

    @Override
    protected void onPostExecute (Integer result)
    {
         if (mWorkingDialog != null)
      {
       mWorkingDialog.dismiss();
       mWorkingDialog = null;
      }

         switch (result)
         {
         case 0:                            // a URL

            // Intent to view download PDF
            Uri uri  = Uri.fromFile(myActivity.getFileStreamPath(mFileName));

            try
            {
                Intent intentUrl = new Intent(Intent.ACTION_VIEW);
                intentUrl.setDataAndType(uri, "application/pdf");
                intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                myActivity.startActivity(intentUrl);
            }
            catch (ActivityNotFoundException e)
            {
                Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
            }

            break;

        case 1:                         // Error

            Toast.makeText(myActivity, mError, Toast.LENGTH_LONG).show();
            break;

        }

    }

}
WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
公共类下载PDFTASK扩展异步任务
{
受保护的ProgressDialog mWorkingDialog;//进度对话框
受保护的字符串mFileName;//下载的文件
受保护的字符串mError;//用于查找错误
@凌驾
受保护的整数doInBackground(字符串…URL)
{
尝试
{
字节[]数据缓冲=新字节[4096];
int nRead=0;
//将本地文件名设置为URL的最后一部分
字符串[]strURLParts=URL[0]。拆分(“/”;
如果(strURLParts.length>0)
mFileName=strURLParts[strURLParts.length-1];
其他的
mFileName=“REPORT.pdf”;
//下载URL并存储到strFileName
//连接到url
java.net.URL urlReport=新的java.net.URL(URL[0]);
URLConnection urlConn=urlReport.openConnection();
InputStreamInput=urlConn.getInputStream();
BufferedInputStream bufferedStreamInput=新的BufferedInputStream(streamInput);
FileOutputStream outputStream=myActivity.openFileOutput(mFileName,Context.MODE_WORLD_READABLE);//必须是世界可读的,以便可以打开外部意图!
而((nRead=bufferedStreamInput.read(dataBuffer))>0)
write(dataBuffer,0,nRead);
streamInput.close();
outputStream.close();
}
捕获(例外e)
{
Log.e(“myApp”,e.getMessage());
mError=e.getMessage();
申报表(1);
}
返回(0);
}
//-------------------------------------------------------------------------
//预执行-UI线程设置
//-------------------------------------------------------------------------
@凌驾
受保护的void onPreExecute()
{
//显示“正在下载,请稍候”对话框
mWorkingDialog=ProgressDialog.show(myActivity,“,“正在下载PDF文档,请稍候…”,true);
返回;
}
//-------------------------------------------------------------------------
//PostExecute-UI线程完成
//-------------------------------------------------------------------------
@凌驾
受保护的void onPostExecute(整数结果)
{
if(mWorkingDialog!=null)
{
mWorkingDialog.Disclose();
mWorkingDialog=null;
}
开关(结果)
{
案例0://一个URL
//意图查看下载PDF
Uri=Uri.fromFile(myActivity.getFileStreamPath(mFileName));
尝试
{
Intent intentur=新意图(Intent.ACTION\u视图);
intentUrl.setDataAndType(uri,“application/pdf”);
intentur.setFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
myActivity.startActivity(强度);
}
捕获(ActivityNotFounde异常)
{
Toast.makeText(myActivity,“未安装PDF查看器”,Toast.LENGTH_LONG.show();
}
打破
案例1://错误
Toast.makeText(myActivity,mError,Toast.LENGTH_LONG).show();
打破
}
}
}

任何对“myActivity”的引用都必须替换为对活动类的引用

我正试图处理完全相同的场景。我想出的解决办法如下

public boolean shouldOverrideUrlLoading(WebView view, String url) {
            String cleanUrl = url;
            if (url.contains("?")) {
                // remove the query string
                cleanUrl = url.substring(0,url.indexOf("?"));
            }

            if (cleanUrl.endsWith("pdf")) {

                try {
                    Uri uriUrl = Uri.parse(cleanUrl);
                    Intent intentUrl = new Intent(Intent.ACTION_VIEW, uriUrl);
                    startActivity(intentUrl);
                    return true;

                } catch (Exception e) {
                    System.out.println(e);
                    Toast.makeText(context,"No PDF Viewer Installed", Toast.LENGTH_LONG).show();
                }
            }

            return false;
        }
WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);

我需要确保它能够处理pdf链接,即使有查询字符串。尽管cleanUrl需要以“pdf”结尾,但还是有点黑客味,但只要这是真的,它就应该可以工作。如果您通过php脚本或其他方式提供pdf,您可能需要更深入地挖掘,根据MIME类型或其他方式处理问题。

FWIW,mozilla有一个apache许可的。如果你不介意加码的话,也许值得一看。这样,您就可以在浏览器中执行所有操作,而不必依赖第三方PDF阅读器。

在网络视图中加载PDF:

WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);

mUrl-将成为您的pdf链接

请在webview中查看处理重定向URL的示例,并在不下载的情况下打开pdf

WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);
private void init()
{
    WebView webview = (WebView) findViewById(R.id.webview);
    WebSettings settings = webview.getSettings();
    settings.setJavaScriptEnabled(true);
    webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

    PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview);
    pdfWebViewClient.loadPdfUrl(
                "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjgwIfp3KXSAhXrhFQKHQqEDHYQFggZMAA&url=http%3A%2F%2Fwww.orimi.com%2Fpdf-test.pdf&usg=AFQjCNERYYcSfMLS5ukBcT2Qy11YxEhXqw&cad=rja");
}

private class PdfWebViewClient extends WebViewClient
{
    private static final String TAG = "PdfWebViewClient";
    private static final String PDF_EXTENSION = ".pdf";
    private static final String PDF_VIEWER_URL = "http://docs.google.com/gview?embedded=true&url=";

    private Context mContext;
    private WebView mWebView;
    private ProgressDialog mProgressDialog;
    private boolean isLoadingPdfUrl;

    public PdfWebViewClient(Context context, WebView webView)
    {
        mContext = context;
        mWebView = webView;
        mWebView.setWebViewClient(this);
    }

    public void loadPdfUrl(String url)
    {
        mWebView.stopLoading();

        if (!TextUtils.isEmpty(url))
        {
            isLoadingPdfUrl = isPdfUrl(url);
            if (isLoadingPdfUrl)
            {
                mWebView.clearHistory();
            }

            showProgressDialog();
        }

        mWebView.loadUrl(url);
    }

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url)
    {
        return shouldOverrideUrlLoading(url);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl)
    {
        handleError(errorCode, description.toString(), failingUrl);
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
    {
        final Uri uri = request.getUrl();
        return shouldOverrideUrlLoading(webView, uri.toString());
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public void onReceivedError(final WebView webView, final WebResourceRequest request, final WebResourceError error)
    {
        final Uri uri = request.getUrl();
        handleError(error.getErrorCode(), error.getDescription().toString(), uri.toString());
    }

    @Override
    public void onPageFinished(final WebView view, final String url)
    {
        Log.i(TAG, "Finished loading. URL : " + url);
        dismissProgressDialog();
    }

    private boolean shouldOverrideUrlLoading(final String url)
    {
        Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

        if (!isLoadingPdfUrl && isPdfUrl(url))
        {
            mWebView.stopLoading();

            final String pdfUrl = PDF_VIEWER_URL + url;

            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    loadPdfUrl(pdfUrl);
                }
            }, 300);

            return true;
        }

        return false; // Load url in the webView itself
    }

    private void handleError(final int errorCode, final String description, final String failingUrl)
    {
        Log.e(TAG, "Error : " + errorCode + ", " + description + " URL : " + failingUrl);
    }

    private void showProgressDialog()
    {
        dismissProgressDialog();
        mProgressDialog = ProgressDialog.show(mContext, "", "Loading...");
    }

    private void dismissProgressDialog()
    {
        if (mProgressDialog != null && mProgressDialog.isShowing())
        {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    private boolean isPdfUrl(String url)
    {
        if (!TextUtils.isEmpty(url))
        {
            url = url.trim();
            int lastIndex = url.toLowerCase().lastIndexOf(PDF_EXTENSION);
            if (lastIndex != -1)
            {
                return url.substring(lastIndex).equalsIgnoreCase(PDF_EXTENSION);
            }
        }
        return false;
    }
}

是否可以只在webview中显示PDF文件而不运行异步下载任务?否,与iOS上的UIWebView不同,Android webview不显示PDF内容。您可以尝试直接调用intent(即,无AsyncDownloadTask),尽管无论发生什么情况,您都会离开活动。嗯,所以在android中,最好的方法是调用async来下载文件并保存它。您知道该进程是否可以自动找到文件名并在SD卡上另存为该名称吗?我在使用时总是指定名称。谢谢我会尝试将您的http://{file}.pdf url传递给intent,我认为pdf查看器程序(例如Acrobat)会处理其余的内容。如果没有,下载任务应该给你一个好的起点。这部分代码处理文件命名,它从URL://将本地文件名设置为URL字符串[]strURLParts=URL[0]的最后一部分提取文件名。拆分(“/”;如果(strURLParts.length>0)mFileName=strURLParts[strURLParts.length-1];else mFileName=“REPORT.pdf”;