【问题标题】:Get filename before download下载前获取文件名
【发布时间】:2014-08-09 13:48:31
【问题描述】:

我想使用我自己的 webview 下载一些文件,但是当我使用下载管理器时,我无法在下载之前获取文件的默认名称。

我试过了,但它不起作用

String fileName = url.substring(url.lastIndexOf('/') + 1);

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName );

有什么想法吗?

你需要什么:

@Override
        public boolean shouldOverrideUrlLoading(WebView view, String url2) {


            if(url2.startsWith("http://www.youtube-mp3.org/get?ab=")){


            if(isDownloadManagerAvailable(MainActivity.this)){


                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url2));


                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                }


                request.setMimeType("audio/MP3");
                DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);


//Get file name as string


                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, -----);//put it here


                manager.enqueue(request);




            }
            }
            else{
                view.loadUrl(url2);

                }
            return false;
        }

【问题讨论】:

  • 我认为你也可以使用 Uri.getLastPathSegment() : developer.android.com/reference/android/net/… 。不过不确定。无论如何,变量“url”和“fileName”等于什么?
  • 因为url不像www。 ........../audio.mp3 这就是为什么它找不到文件名
  • 那么 URL 值是多少?当您尝试从那里下载文件时,网络浏览器(例如)能否知道文件名是什么?
  • 可以,es文件下载器可以。
  • 你试过“URLUtil.guessFileName()”吗?

标签: android download-manager


【解决方案1】:

使用类似的东西(可能需要更少的代码):

  public class MainActivity extends ActionBarActivity
      {
      @Override
      protected void onCreate(final Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final WebView webView=(WebView)findViewById(R.id.webView1);
        final WebSettings webSettings=webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setUseWideViewPort(true);
        webView.setWebViewClient(new WebViewClient()
          {
            @Override
            public boolean shouldOverrideUrlLoading(final WebView view,final String url)
              {
              return false;
              }
          });
        webView.setDownloadListener(new DownloadListener()
          {
            @Override
            public void onDownloadStart(final String url,final String userAgent,final String contentDisposition,final String mimetype,final long contentLength)
              {
              final String fileName=URLUtil.guessFileName(url,contentDisposition,mimetype);
              android.util.Log.d("Applog","fileName:"+fileName);
              // start downloading:
            //  final Intent i=new Intent(Intent.ACTION_VIEW);
            //  i.setData(Uri.parse(url));
           //   startActivity(i);


  DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            }


            request.setMimeType("audio/MP3");
            DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);





            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);


            manager.enqueue(request); 
              }
          });
        webView.setWebChromeClient(new WebChromeClient()
          {});
        webView.loadUrl("http://www.youtube-mp3.org/get?ab=128&video_id=KMU0tzLwhbE&h=1c1f479c948bb9cfb495605c7214cb49&r=1407775588334.1531971212");
        }
      }

【讨论】:

  • 从我在服务器日志中看到的内容来看,这个解决方案实际上触发了对服务器上相同 URL 的 2 次调用:一个是在进入 onDownloadStart(...) 方法之前进行的,第二个是由 manager.enqueue(. ..) :(
  • 这对我很有帮助:final String fileName=URLUtil.guessFileName(url,contentDisposition,mimetype);
  • 这对我不起作用。返回一个混乱的文件名,导致文件不被保存
  • @easazade 这取决于它得到什么。它的功能被命名为“guessFileName”是有原因的......它不能保证任何东西......你从那里得到什么输入,你看到它被搞砸了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2013-06-29
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多