Приложение Webview: как загрузить файл внутри приложения WebView, и внешняя ссылка должна открываться вне приложения

Я хочу загрузить конкретный файл внутри приложения веб-просмотра для Android (хотя они взяты из внешней ссылки, а не из моего URL-адреса приложения веб-просмотра), и все внешние ссылки должны открываться вне приложения веб-просмотра, что означает браузер телефона.

Для этого я использовал приведенный ниже код.

 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);
        }
    }

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

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;

Теперь,

Первое решение. Я хочу знать, как я могу загружать файлы, содержащие указанное выше расширение, внутри приложения веб-просмотра, и все ссылки, которые не содержат указанное расширение, должны открываться за пределами моего приложения веб-просмотра, что означает мобильный браузер.

Второе решение. Если это невозможно, скажите мне, когда я нажимаю на ссылку, как каждый раз показывать предупреждение / всплывающее окно (вариант выбора браузера). Как я уже упоминал, вместо того, чтобы показывать выбор браузера, ссылки для предупреждений автоматически открываются в браузере моего телефона.


person user3137451    schedule 17.08.2017    source источник


Ответы (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;

    } 

Замените код положительных и отрицательных кнопок, чтобы делать все, что вам нравится. Надеюсь, это ответ на ваш вариант использования.

person KingKongCoder    schedule 17.08.2017
comment
Отображается ошибка в (это) new AlertDialog.Builder(this) - person user3137451; 17.08.2017
comment
Можете ли вы опубликовать отчет журнала трассировки всего стека? - person KingKongCoder; 17.08.2017
comment
Хорошо, я получил второе решение отсюда (stackoverflow.com/questions/28492579/), но первое решение было бы лучше - person user3137451; 18.08.2017