Загрузка файла с JSF на WebView Android

#android #jsf #webview #download

#Android #jsf #webview #Скачать

Вопрос:

У меня есть веб-приложение Java, которое использует JSF и PrimeFaces. В качестве резервного компонента я загружаю локальный файл PDF или документа:

 public void download() throws FileNotFoundException, IOException {  

    File file = new File("C:/file.pdf"); 

    FacesContext facesContext = FacesContext.getCurrentInstance();

    HttpServletResponse response = 
            (HttpServletResponse) facesContext.getExternalContext().getResponse();

    response.reset();
    response.setHeader("Content-Type", "application/pdf");

    OutputStream responseOutputStream = response.getOutputStream();

    InputStream fileInputStream = new FileInputStream(file);

    byte[] bytesBuffer = new byte[2048];
    int bytesRead;
    while ((bytesRead = fileInputStream.read(bytesBuffer)) > 0) 
    {
        responseOutputStream.write(bytesBuffer, 0, bytesRead);
    }

    responseOutputStream.flush();

    fileInputStream.close();
    responseOutputStream.close();

    facesContext.responseComplete();
}
  

Вот как я вызываю метод загрузки в xhtml:

 <p:commandButton action="#{mybean.download()}" value="Download File" ajax="false" >
  

И я создал простое приложение для Android для своего Java-приложения, просто вызвав его URL-адрес внутри WebView:

 mWebView.loadUrl("http://myappurl.com");
  

Затем я прослушиваю загрузки в WebView, используя событие DownloadListener:

 mWebView.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition, String mimetype,
                                    long contentLength) {
            DownloadManager.Request request = new DownloadManager.Request(
                    Uri.parse(url));

            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, url);
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
            intent.addCategory(Intent.CATEGORY_OPENABLE); 
            intent.setType("*/*");
            Toast.makeText(getApplicationContext(), "Downloading File",
                    Toast.LENGTH_LONG).show();
        }
    });
  

Проблема в том, что событие DownloadListener для WebView не вызывается, когда я нажимаю кнопку загрузки. Он отлично работает, получая доступ к URL-адресу приложения из браузера телефона, но не в приложении для Android, которое я создал.

Это также работает в приложении Android, если я помещаю PDF-файл в каталог приложения и вызываю его с помощью простого <a href="/file.pdf" download> , но это не то, что я хочу, потому что файлы pdf будут находиться в каталоге сервера, а не в приложении.

Что я пробовал:

  • Использование PrimeFaces p: FileDownload — получил тот же результат, при нажатии кнопки ничего не происходит;
  • Я заглянул в онлайн-просмотрщик документов Google, но я не могу его использовать, потому что мои файлы являются локальными;
  • Я пытался PDF.js , но эта же кнопка загрузки будет использоваться для всех видов документов, а не только для pdf, поэтому мне действительно не нужно просматривать файл, мне просто нужно загрузить и сохранить его на устройстве.

Пожалуйста, помогите мне. Заранее спасибо.

Редактировать

Я попробовал Chrome Custom Tabs, который заменяет Android WebView, он отлично работает, моя загрузка JSF была распознана, и файл был загружен, мне ничего не нужно было делать. Единственная проблема заключается в том, что невозможно удалить панель инструментов с пользовательских вкладок Chrome, потому что я хочу, чтобы мое приложение выглядело как собственное приложение, а не веб-страница.

Комментарии:

1. Значит, он работает в обычном браузере на рабочем столе?

2. Да, в браузере на рабочем столе и в браузере телефона тоже, просто не в WebView приложения Android