#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