Android WebView: скачивайте файлы, как это делают браузеры

Я работаю над приложением для Android с веб-представлением, указывающим на динамический веб-сайт другой команды.
Когда я скачиваю файл (в основномдинамически перенаправляется PDF и ZIP)все, что я получаю, это файл в папке загрузок, содержащий некоторый HTML-код с сообщением типа «пользователю не разрешено читать файл»независимо от того, как я осуществляю загрузку, я пытался:

Менеджер загрузки
Намерение (позволить внешнему браузеру управлять загрузкой)
«от руки» (AsyncTask и httpconnection ...)

все с одинаковыми результатами.

Навигация с помощью обычных загрузок в браузерах работает нормально как на настольных ПК, так и на устройствах Android и iOS..

Почему веб-просмотр не должен иметь доступ к файлам?

Может быть проблема сессия? http порт?
Мне действительно нужны некоторые идеи ...

Еще один совет: при загрузке файла дважды по одной и той же ссылке, ссылка будет перенаправлена ​​на один и тот же файл, но в результате появятся два разных имени файла ...


РЕДАКТИРОВАТЬВместо того, чтобы указывать webView на веб-приложение, я попытался указать на общую веб-страницу с перенаправлением ссылки для загрузки другого файла, ну, просто, это работает.


Вотwebview.setDownloadListener - onDownloadStart() параметры:

 userAgent=Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36

 contentDisposition=attachment;
 filename=correct_filename.pdf,      
 url=http://www.xxx.xx/site/downloadfile.wplus?REDIRECTFILE=D-507497120&ID_COUNTOBJ=ce_5_home&TYPEOBJ=CExFILE&LN=2

 mimeType=application/octet-stream

Вот код

    wv.getSettings().setSupportMultipleWindows(true);
    wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    wv.getSettings().setAllowFileAccess(true);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setBuiltInZoomControls(true);
    wv.getSettings().setDisplayZoomControls(false);
    wv.getSettings().setLoadWithOverviewMode(true);
    wv.getSettings().setUseWideViewPort(true);
    wv.setDownloadListener(new DownloadListener() {
        @Override           
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength){ 
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

            request.setDescription("Download file...");
            request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimetype));
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimetype));
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
            Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
        } 
    }



РЕДАКТИРОВАТЬ II

Вот код, который я использую при попытке загрузить файлы «вручную»:

onDownloadStart (), где я вызываю downloadFileAsync ():

        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
            String fileName;
            try {
                fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
                downloadFileAsync(url, fileName);
            }catch (Exception e){

            }
        }

и это AsyncTask:

private void downloadFileAsync(String url, String filename){

    new AsyncTask<String, Void, String>() {
        String SDCard;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                HttpURLConnection urlConnection = null;
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setDoOutput(true);
                urlConnection.connect();
                int lengthOfFile = urlConnection.getContentLength();
                //SDCard = Environment.getExternalStorageDirectory() + File.separator + "downloads";
                SDCard = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"";
                int k = 0;
                boolean file_exists;
                String finalValue = params[1];
                do {
                    if (k > 0) {
                        if (params[1].length() > 0) {
                            String s = params[1].substring(0, params[1].lastIndexOf("."));
                            String extension = params[1].replace(s, "");

                            finalValue = s + "(" + k + ")" + extension;
                        } else {
                            String fileName = params[0].substring(params[0].lastIndexOf('/') + 1);
                            String s = fileName.substring(0, fileName.lastIndexOf("."));
                            String extension = fileName.replace(s, "");
                            finalValue = s + "(" + k + ")" + extension;
                        }
                    }
                    File fileIn = new File(SDCard, finalValue);
                    file_exists = fileIn.exists();
                    k++;
                } while (file_exists);

                File file = new File(SDCard, finalValue);
                FileOutputStream fileOutput = null;
                fileOutput = new FileOutputStream(file, true);
                InputStream inputStream = null;
                inputStream = urlConnection.getInputStream();
                byte[] buffer = new byte[1024];
                int count;
                long total = 0;
                while ((count = inputStream.read(buffer)) != -1) {
                    total += count;
                    //publishProgress(""+(int)((total*100)/lengthOfFile));
                    fileOutput.write(buffer, 0, count);
                }
                fileOutput.flush();
                fileOutput.close();
                inputStream.close();
            } catch (MalformedURLException e){
            } catch (ProtocolException e){
            } catch (FileNotFoundException e){
            } catch (IOException e){
            } catch (Exception e){
            }
            return params[1];
        }
        @Override
        protected void onPostExecute(final String result) {

        }

    }.execute(url, filename);
}

взято изКак скачать PDF с динамического URL в веб-просмотре
Thanx

Ответы на вопрос(1)

Ваш ответ на вопрос