Android 通过验证用户名和密码使用重定向 url 在 Web 视图中查看 .pdf 文件

Posted

技术标签:

【中文标题】Android 通过验证用户名和密码使用重定向 url 在 Web 视图中查看 .pdf 文件【英文标题】:Android view .pdf file in web view using redirect url by authenticate user name and password 【发布时间】:2019-01-27 07:58:21 【问题描述】:

我想从共享点服务器查看 pdf 文件。 网址链接:https:///sites/iConnect/Lists/FeedList/Attachments/1138/Grasim%20Talent%20Hunt.pdf

它重定向到以下链接: https://login.microsoftonline.com,一旦我登录,响应就会重定向到 pdf 文件 url。

在这个机构中,我如何处理和查看 pdf 文件到 webview。

我试过这个代码片段:

WebView webView = findViewById(R.id.webview);
webView.getSettings().setjavascriptEnabled(true);
webView.loadUrl(uri);

webView.setWebViewClient(new WebViewClient()

  @Override
  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
 
   if(request.getUrl().toString().endsWith(".pdf")) 
   
     String weburl = "https://docs.google.com/gview?embedded=true&url=" + request.getUrl().toString();
     view.loadUrl(weburl);
    
    else
    
       view.loadUrl(request.getUrl().toString());
    

    return true;
 

  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) 
    view.loadUrl(url);
    return true;
  

  @Override
  public void onPageFinished(WebView view, String url) 
     super.onPageFinished(view, url);
     CommonUtils.dismissDialog();

  

  @Override
  public void onReceivedError(WebView view, int errorCode,String description,String failingUrl) 
//super.onReceivedError(view, request, error);
  Toast.makeText(WebViewActivity.this,"Error"+description, Toast.LENGTH_SHORT).show();
  


 );

如果有任何概念,请提出建议

谢谢

拉贾拉詹

【问题讨论】:

WebView 无法显示 pdf 文件开头。 @Rajarajan 你有什么解决办法吗? 有什么解决办法吗?我们需要检测返回中的pdf内容吗? 【参考方案1】:

我使用 onPageStarted 而不是 shouldOverrideUrlLoading 并且没有任何问题。 我使用 webView.loadUrl(uri) 而不是 view.loadUrl(weburl)。试试看。

【讨论】:

【参考方案2】:

WebView 无法显示 pdf 文件。您可以使用以下代码显示 pdf

 if(url.endsWith(".pdf"))

            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "application/pdf");
            intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            startActivity(intent);
  
  else 

       view.loadUrl(url);
  

【讨论】:

您错过了有关 URL 重定向的要点。这是这里的主要挑战。否则,我们已经知道我们可以使用您指定的意图。【参考方案3】:

如果您可以在 WebView(例如 ImageView)之外呈现 PDF,并且您的目标是 Lollipop (5.0) 及更高版本,则可以使用此功能:

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer

我今天实际上正在尝试它,它对我来说效果很好。我所做的是:

创建一个带有 ImageView 的 Fragment,然后是两个按钮(一个用于后一页,一个用于前进一页) 每次用户前进或后退时,我都会使用Bitmap.createBitmap(w, h, Config.ARGB_8888) 创建一个位图,其中 w 和 h 是 ImageView 在该点的宽度/高度 我请求了给定的页码并传入了示例代码中 mBitmap 所在的新位图 我为生成的位图分配了imageView.setImageBitmap(bitmap)

瞧,效果很好。我的代码是一个原型,所以我会对其进行改进,但它可以很好地呈现几十页,而且速度相对较快。黑白页面有明显的延迟,但可能是 1/2 秒。如果我预先加载/缓存了页面,延迟可能会消失。但是,对于我的原型,这并不重要。

我强烈推荐这种方法!

【讨论】:

谢谢,但我认为您错过了有关 URL 重定向的要点。这是这里的主要挑战,而不是如何呈现 pdf。 @auspicious99 那么我认为这个问题需要澄清。是如何拦截登录后的URL吗?从技术上讲,没有提出任何问题,因此很难完全破译。不过,我仍然推荐 PdfRenderer,因为 Google PDF 查看器可以随时被 Google 删除,从而导致应用崩溃。 挑战是从服务器检索 PDF 文件以呈现它。因为向 URL 发送请求不仅会在响应中生成 PDF 文件,而且可能会重定向到身份验证。 好的,那么在我看来,解决方案是让 WebView 通过正常的身份验证流程,如果你拦截 URL 并获取“.pdf”和/或一些 mime -type 应用程序/pdf 的标头,然后保存 URL,但此时停止流。

以上是关于Android 通过验证用户名和密码使用重定向 url 在 Web 视图中查看 .pdf 文件的主要内容,如果未能解决你的问题,请参考以下文章

Flask - 如果当前用户未通过身份验证,如何重定向到登录页面?

Spring Security:如果身份验证失败,则重定向到登录页面

新注册用户将被重定向到密码重置屏幕

无需重定向的 Django 远程身份验证

Joomla 3和VM密码重置重定向到VM寄存器

使用 Azure Active Directory 身份验证而不重定向到 Microsoft