2017-08-17 50 views
1

我想下载android webview应用程序中的特定文件(尽管它们来自外部链接而不是来自我的webview应用程序URL)以及所有外部链接应该打开外部webview应用程序的手机浏览器。Webview应用程序:如何在webview应用程序和外部链接下载文件应该在应用程序外部打开

我用下面的代码来做到这一点。

wv.setWebViewClient(new WebViewClient(){ 


     public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      boolean value = true; 
      String extension = MimeTypeMap.getFileExtensionFromUrl(url); 
      if (extension != null) { 
       MimeTypeMap mime = MimeTypeMap.getSingleton(); 
       String mimeType = mime.getMimeTypeFromExtension(extension); 
       if (mimeType != null) { 
        if (mimeType.toLowerCase().contains("pdf") 
          || extension.toLowerCase().contains("ppt") 
          || extension.toLowerCase().contains("doc") 
          || extension.toLowerCase().contains("rar") 
          || extension.toLowerCase().contains("rtf") 
          || extension.toLowerCase().contains("exe") 
          || extension.toLowerCase().contains("apk") 
          || extension.toLowerCase().contains("jpeg") 
          || extension.toLowerCase().contains("png") 
          || extension.toLowerCase().contains("xls") 
          || extension.toLowerCase().contains("zip") 
          || extension.toLowerCase().contains("jpg")) { 
         DownloadManager mdDownloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); 
         DownloadManager.Request request = new DownloadManager.Request(
           Uri.parse(url)); 
         String name= URLUtil.guessFileName(url,null,MimeTypeMap.getFileExtensionFromUrl(url)); 
         File destinationFile = new File(Environment.getExternalStorageDirectory(),name); 
         request.setDescription("Downloading..."); 
         request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
         // request.setDestinationUri(Uri.fromFile(destinationFile)); 
         request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,name); 
         mdDownloadManager.enqueue(request); 
         //value = false; 
        } 
       } 
       if (value) { 
        view.loadUrl(url); 
       } 

       if (!url.contains("my site url")) { // Could be cleverer and use a regex 
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
        startActivity(intent); 
        return true; 
       } 
       return false; 
      } 
      return false; 

     } 


     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      wv.loadUrl(mypage_error); 
     } 
    } 

当我点击上面包含任何扩展链接,web视图的应用程序(这是确定)内,但在同一时间链接自动打开了我的手机浏览器的文件开始下载。我知道这是因为这个代码。

if (!url.contains("my site url")) { // Could be cleverer and use a regex 
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
        startActivity(intent); 
        return true; 
       } 
       return false; 

现在,

首先解决我想知道我怎么可以下载包含上述扩展的WebView应用程序和所有链接中的文件不包含上述延期应我的WebView应用程序外打开,这意味着移动浏览器。

其次解决方案 如果是不可能的,那么告诉我,当我点击链接如何显示警报/弹出(浏览器选择选项)每次。正如我所提到的,而不是显示浏览器选择警报链接自动打开到我的手机浏览器。

回答

1
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

     boolean value = true; 
     String extension = MimeTypeMap.getFileExtensionFromUrl(url); 
     if (extension != null) { 
      MimeTypeMap mime = MimeTypeMap.getSingleton(); 
      String mimeType = mime.getMimeTypeFromExtension(extension); 
      if (mimeType != null) { 
       if (mimeType.toLowerCase().contains("pdf") 
         || extension.toLowerCase().contains("ppt") 
         || extension.toLowerCase().contains("doc") 
         || extension.toLowerCase().contains("rar") 
         || extension.toLowerCase().contains("rtf") 
         || extension.toLowerCase().contains("exe") 
         || extension.toLowerCase().contains("apk") 
         || extension.toLowerCase().contains("jpeg") 
         || extension.toLowerCase().contains("png") 
         || extension.toLowerCase().contains("xls") 
         || extension.toLowerCase().contains("zip") 
         || extension.toLowerCase().contains("jpg")) { 
        DownloadManager mdDownloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); 
        DownloadManager.Request request = new DownloadManager.Request(
          Uri.parse(url)); 
        String name= URLUtil.guessFileName(url,null,MimeTypeMap.getFileExtensionFromUrl(url)); 
        File destinationFile = new File(Environment.getExternalStorageDirectory(),name); 
        request.setDescription("Downloading..."); 
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
        // request.setDestinationUri(Uri.fromFile(destinationFile)); 
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,name); 
        mdDownloadManager.enqueue(request); 
        //value = false; 
       } 
      } 
      if (value) { 
       view.loadUrl(url); 
      } 

      if (!url.contains("my site url")) { // Could be cleverer and use a regex 
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       startActivity(intent); 
       return true; 
      }else{ 
      new AlertDialog.Builder(this) 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setTitle("Exit!") 
      .setMessage("Are you sure you want to close?") 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

        finish(); 

       } 

      }) 
      .setNegativeButton("No", null) 
      .show(); 
       } 
      return false; 
     } 
     return false; 

    } 

替换正面和负面的按钮代码来做任何你喜欢的事情。 我希望这能解答你的用例。

+0

在**(this)显示错误**'新的AlertDialog.Builder(this)' – user3137451

+0

您可以发布整个堆栈跟踪日志报告 –

+0

好吧,我从这里获得了第二个解决方案**(https:// stackoverflow.com/questions/28492579/give-the-option-to-always-choose-a-browser-to-open-a-link)但**第一个解决方案**会更好 – user3137451

相关问题