Создание браузера на java
Android позволяет создать собственное окно для просмотра веб-страниц или даже создать свой клон браузера при помощи элемента WebView. Сам элемент использует движок WebKit и имеет множество свойств и методов. Мы ограничимся базовым примером создания приложения, с помощью которого сможем просматривать страницы в интернете. В последних версиях используется движок от Chromium, но большой разницы в этом нет для простых задач.
Создадим новый проект MyBrowser и сразу заменим код в файле разметки res/layout/activity_main.xml:
Теперь откроем файл активности MainActivity.java и объявим компонент WebView, а также инициализируем его - включим поддержку JavaScript и укажем страницу для загрузки.
Так как приложение будет использовать интернет, необходимо установить разрешение на доступ к интернету в файле-манифесте.
Там же в манифесте модифицируем строчку для экрана, удалив заголовок из нашего приложения (выделено жирным):
Запустим приложение. В нашем распоряжении появился простейший вьювер веб-страниц, но с одним недостатком. Если вы щёлкнете на любой ссылке, то у вас автоматически запустится браузер по умолчанию и новая страница отобразится уже там. Точнее так было раньше. На новых устройствах при запуске приложения сразу открывается браузер.
Чтобы решить данную проблему и открывать ссылки в своей программе, нужно переопределить класс WebViewClient и позволить нашему приложению обрабатывать ссылки. Добавим в коде вложенный класс:
Затем в методе onCreate() определим экземпляр MyWebViewClient. Он может находиться в любом месте после инициализации объекта WebView:
Теперь в нашем приложении создан WebViewClient, который позволяет загружать любой указанный URL, выбранный в WebView, в сам контейнер WebView, а не запускать браузер. За данную функциональность отвечает метод shouldOverrideUrlLoading(WebView, String), в котором мы указываем текущий WebView и нужный URL. Возвращаемое значение true говорит о том, что мы не нуждаемся в запуске стороннего браузера, а самостоятельно загрузим контент по ссылке. В версии API 24 добавили перегруженную версию метода, учитывайте это обстоятельство.
Мы должны проверить, что WebView поддерживает навигацию на предыдущую страницу. Если условие верно, тогда вызывается метод goBack(), который возвращает нас на предыдущую страницу на один шаг назад. Если таких страниц набралось несколько, то мы можем последовательно вернуться к самой первой странице. При этом метод всегда будет возвращать значение true. Когда мы вернёмся на самую первую страницу, с которой начали путешествие по интернету, то вернётся значение false и обработкой нажатия кнопки BACK займётся уже сама система, которая закроет экран приложения.
Запустите приложение ещё раз. У вас появился свой собственный веб-браузер, позволяющий ходить по ссылкам и возвращаться на предыдущую страницу. Изучив документацию, вы можете оснастить приложение и другим вкусными плюшками для своего браузера.
Если вам нужно часть ссылок, ведущих на ваш сайт открывать в браузере, а локальные ссылки открывать в приложении, то применяйте условие с разными возвращаемыми значениями.
Универсальный метод, который все локальные ссылки откроет в приложении, остальные в браузере (меняем одну строчку):
А сейчас немного усложним пример, чтобы у пользователя появилась альтернатива стандартным браузерам.
Чтобы было понятнее, переделаем пример следующим образом. Создайте две активности. На первой активности разместите кнопку для перехода на вторую активность, а на второй активности разместите компонент WebView.
В манифесте прописываем у второй активности фильтр.
Код для кнопки для перехода на вторую активность.
Мы создали собственное намерение с указанием фильтра и предоставили данные - адрес сайта.
Вторая активность должна принять данные:
В фильтре для второй активности мы указали два действия.
Это означает, что любые активности (читай, приложения) могут вызвать вашу активность с мини-браузером по такому же принципу. Запустите в студии в отдельном окне любой старый проект или создайте новый и добавьте в него кнопку и пропишите тот же код, который мы использовали для щелчка кнопки.
Запустите второе приложение (первое приложение можно закрыть) и нажмите на кнопку. У вас запустится не первое приложение с начальным экраном, а сразу вторая активность с мини-браузером. Таким образом, любое приложение может запустить браузер, не зная имени класса вашей активности, а используя только строку "ru.alexanderklimov.Browser", передаваемую в Intent. При этом ваша активность с браузером должна иметь категорию по умолчанию и данные. Напомню:
Вы можете представить свою строку в виде строковой константы и сообщить всем потенциальным пользователям вашего браузера, как они могут запустить его у себя. Но в Android уже есть такая готовая константа ACTION_VIEW, которая по справке документации представляет собой следующее:
Перепишем код для кнопки у второго приложения
Что произойдёт на этот раз? Мы помним, что у нас прописано два действия, включая и android.intent.action.VIEW. А значит наше первое приложение с браузером тоже должно распознавать эту команду, когда какое-то приложение у пользователя использует этот код. На эмуляторе как минимум есть одна такая программа "Browser", и теперь к ней добавилась наша вторая активность из первого приложения. На экране появится выбор из двух приложений.
А если удалить все альтернативные браузеры и оставить только вашу программу, то и выбора не будет. Ваш браузер станет основным. И если какое-то приложение захочет запустить веб-страницу указанным способом, то откроется ваша программа.
Небольшое замечание. Если заменить последнюю строчку на такую:
То в окне выбора программы вместо верхней строки "Open with" или её локального перевода появится ваша строка. Но не это главное. Если по каким-то причинам на устройстве не окажется ни одного браузера, то данный вариант кода не вызовет краха приложения, в отличие от первоначального варианта. Поэтому используйте предложенный вариант ради надёжности.
Относительно недавно увидел новый способ открытия ссылок вне браузера. Необходимо использовать флаг FLAG_ACTIVITY_REQUIRE_NON_BROWSER.
Освоить возможности реализации средствами языка Java простейшего браузера. Изучить возможности и функции браузера. Познакомиться с системой навигации по сайтам. Дополнительные источники информации [13].
Краткие теоретические сведения
Для создания браузера как объекта необходимо к базовому классу подключить интерфейс HyperiinkListener. Браузер будет открывать указываемый ему сайт на панели jEditorPane, используя параметр-объект типа URL (Universal Resource Locator — универсальный адрес ресурсов):
URL url=new URL(String initialUrl);
JEditorPane htmlPane= new JEditorPane(url); htmlPane.setPage(url);
Для навигации по гиперссылкам необходимо подключить прослушиватель:
Данный прослушиватель реагирует на событие, связанное со сменой документов.
Мы будем выполнять навигацию так: набираем в текстовом поле новый URL, щелкаем по текстовому полю мышью и обрабатываем событие от текстового поля так, как показано далее:
Public void actionPerformed(Actionevent ae)
JOptionPane. showMessageDialog(null, "url="+url); try
catch (IOException io)
В этом примере использован объект htmiPane класса jEditor- Pane, который открывает HTML-документ с помощью команды setPage(URL url). Класс JEditorPane описан в пакете javax.swing. Открытие в окне документа и есть реализация функций простейшего браузера. Класс jEditorPane позволяет отображать только текстовую информацию HTML-документа, но не предоставляет взможности отображать, например, рисунки. В приложении мы снабжаем объект jEditorPane полосой вертикальной прокрутки для просмотра больших сайтов. Это делается так:
JScrollPane sp= new JScrollPane(htmlPane); // полоса
// прокрутки для больших сайтов getContentPane().add(sp, BorderLayout.CENTER);
После набора в текстовом поле нового URL и нажатия клавиши будет открыт новый документ. Заметим, что адрес документа следует записывать с указанием слова fiie в самом начале:
Нажатие клавиши в активном текстовом поле обеспечивает cpa- батываение метода интерфейса ActionListener:
// Обработчик событий от кнопки и текстового поля: public void actionPerformed(ActionEvent ae)
if(ae.getSource()==urlField) // Событие возникло при нажатии
// клавиши для активного // текстового поля // с адресом URL
// Смена сайта по этой команде: htmlPane.setPage(new URL(urlField.getText()));
catch (IOException ioe)
if(hle.getSource()== HyperlinkEvent.EventType.ACTIVATED) JOptionPane.showMessageDialog(null,"NewURLLoaded");
Теперь приведем полный текст программы, в котором вам уже будет нетрудно разобраться (листинг 2.34).
Листинг 2.34. Простой браузер
import javax.swing.*; import javax.swing.event.*; import java.awt.*;
public class Browser extends JFrame
implements HyperlinkListener, ActionListener // Подключение
public static void main(String[]args)
Browser br= new Browser("file:/c:/Sun/l.html");
// Указываем, какой сайт открыть
br.setBackground(new Color(100,200,200)); br.setVisible(true);
private JButton Ы; // Кнопка для завершения приложения private JTextField urlField; // Текстовое поле для ввода url private JEditorPane htmlPane; // Панель для отображения сайта private String initialUrl; public Browser(String initurl)
JPanel topPanel = new JPanel(); // Панель для размещения
// кнопки и текстового поля
urlField.setText(this.initialUrl); // Адрес сайта
// в текстовое поле urlField.addActionListener(this); // Нажатие кнопки вызывает
topPanel.add(urlField); bl= new JButton("EXIT");
Container knt=getContentPane(); knt.add(topPanel,BorderLayout.NORTH); try
JOptionPane.showMessageDialog(null,"Try to create URL"); URL url = new URL(this.initialUrl);
// Команда toExternalForm() преобразует url в строку htmlPane= new JEditorPane(url); // htmlPane отображает
htmlPane.setEditable(false); // Содержимое сайта нельзя
// редактировать htmlPane.addHyperlinkListener(this); // Этот
// прослушиватель // реагирует на смену // сайтов
htmlPane.setBackground(new Color(200,200,200)); htmlPane.setPage(url); // Отображаем сайт этой командой JScrollPane sp= new JScrollPane(htmlPane); // Полоса
// прокрутки // для больших // сайтов
public void actionPerformed(ActionEvent ae) // Обработчик // событий от кнопки и текстового поля
if(ae.getSource()==urlField) // Событие возникло при нажатии // клавиши для активного текстового поля с адресом URL
htmlPane.setPage(new URL(urlField.getText())); // Смена
// сайта // по этой команде
catch (IOException ioe)
Окно созданного браузера и результат отображения документа приведены на рис. 2.23.
Рис. 2.23. Окно простейшего браузера
Резюмируя материал занятия, обратим внимание на два обстоятельства.
□ При указании пути к сайту нужно помещать префикс fiie:/ , например:
□ Созданный нами браузер отображает текстовую информацию и не отображает рисунки.
Изменить программу так, чтобы в новом ее варианте стало две панели для открытия сайтов (на каждой панели можно было бы открыть свой сайт).
Is it possible to use Java to build a web browser like Internet Explorer that will open all the web pages and display all the contents?
8 Answers 8
The only valid answer to that question is:
Yes, it's possible to use Java to build a web browser.
However, a web browser is an exceptionally complex piece of software. Even Google, when building its Google Chrome browser, used existing technology to do it, rather than inventing their own browser from scratch.
If your goal is anything other than building and marketing your own browser, you may want to reconsider what exactly you want to accomplish, in order to find a more direct approach.
@prasad: not to sound harsh or to demotivate you, but this is a hell lot of work. It wil involve years, if not a decade to achieve the level of MSIE/FF. If you're looking for partners to work on it from scratch, you're here at the wrong place. Your question is answered: it's possible. If you take a step back and elaborate a bit more about the functional requirement for which you thought that homegrowing a webbrowser is the solution, you'll probably get better suited answers how to achieve it the best way.
@ VoteyDisciple Can you please tell why a web browser is an exceptionally complex piece of software ?
I advise you to take a look at the Lobo Browser project, an open-source java-written web browser. Take a look at the source and see how they did it.
Yes, it is possible. JWebPane is a work in progress migration of Webkit. It is supposed to be included in JDK7 but I wouldn't hold my breath.
Thank u. But i did not find the setup for jdk 7. The link what u gave took me to a winrar file of jre7.. I extracted it but what should be done next.
That's actually an alpha release, is not intended for final users. In that link there's another for source code. You can download it and read it through. Probably it would be better to wait to the formal release of JDK7 which will have a setup.
Yes, it's possible, and here's what you would need to start looking at.
First, search for an HTML renderer in Java. An example would be JWebEngine. You can start by manually downloading HTML pages and verifying that you can view them.
Edit: Just to add one more thought, you should be honest with yourself about why you would work on this project. If it's to rebuild IE, FF, that is unrealistic. However, what you might get out of it is learning what the major issues are with browser development, and that may be worthwhile.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago .
Is there a way to embed a browser in Java? more specifically, is there a library that can emulate a browser?
JxBrowser library provides Swing/JavaFX lightweight component based on the latest Chromium engine. The web pages are rendered by Chromium engine off-screen and displayed in the lightweight Swing/JavaFX component. It's very easy to use. It's free for Open-Source and Academic projects.
15 Answers 15
Since JavaFX 2.0 you can use now webview
shitty thing ever possible. worst performance, javascript seldom works, unwanted behavior. Can never be used in any good project
Just tried out WebView (Jan 9, 2021), and it is now very performant! (on macOS) Very nice overall and I think I will be making GUIs via this method (also lets me embed nice javascript widgets)
I believe JWebPane is going to be the official way to embed a browser into a java app. Its based on the open sourced engine - WebKit, which is used in Apples Safari and Googles Chrome browsers.See this blog for details.
April 2011, almost, still no sign, just like JMF too, for video mission is like mission impossible. Firefox 4 is launched yesterday.
Is WebView in JavaFX truly standalone cross platform or does it depend on any platform specific native components? More importantly, how does it stack up to rendering pages? It is powered by WebKit but is this as close to having a real browser when it comes to rendering websites?
Its very good to have something atleast. But its very slow and the graphics is very bad compared to Chrome or Firefox 4
Stay away from JDIC, its not multiplatform, i am not sure but development might be stopped or not active. Use DJ Native Swing, you will get regular updates, better api and more stable.
You could use SWT for your GUI. Its Browser control allows you to embed IE, Mozilla or Safari (depending on the platform you're running in) with little pain.
The return values of browser.evaluate() are limited to a view types. The JavaFx WebEngine can handle all kinds of return types by wrapping the return value in JSObject.
By far the most robust embeddable browser I am familiar with is the one in SWT. In fact, it is so flexible that the JavaDoc hover you can see in Eclipse is actually a browser, and the JavaDoc view actually supports things like animation!
The only risk with using SWT is that there are different versions of the SWT library for different platforms. I'm not sure if there is a singl jar you could include to cover everyone.
JxBrowser has not been mentionned yet. It embed either Mozilla Firefox (Gecko), Apple Safari (WebKit) or Internet Explorer. Programmer's Guide
I've been looking for a real answer to this question for years, and JxBrowser version 4 is really a game changer. It is exactly what you'd hope a swing browser component would be.
Now JxBrowser allows embedding Google Chromium engine into Java Swing/JavaFX applications. It supports two rendering modes: lightweight (off-screen) and heavyweight (GPU-accelerated). It's free for Open-Source projects.
На первом экране приложения у нас будет кнопка, отправляющая Intent. На втором экране будет WebView.
Project name: P0321_SimpleBrowser
Build Target: Android 2.3.3
Application name: SimpleBrowser
Package name: ru.startandroid.develop.p0321simplebrowser
Create Activity: MainActivity
Рисуем main.xml
На экране просто кнопка
Кодим MainActivity.java:
Код немного непривычен. Обратите внимание я нигде не описываю объект класса Button. Метод findViewById возвращает View, и это View поддерживает метод setOnClickListener, который я вызываю. А в методе setOnClickListener я создаю объект, реализующий интерфейс OnClickListener и в нем пишу код в onClick. Также я создаю объект Intent не отдельно, а прямо в методе startActivity. Кода меньше получилось, чем обычно. Может быть вам подойдет такой вариант.
Создадим второе Activity. Сначала layout-файл browser.xml:
На экране компонент WebView.
Создаем BrowserActivity.java:
Определяем WebView, читаем data из Intent и передаем строку в WebView.
Не забываем про Category = Default. Label для BrowserActivity укажите, например, MyBrowser.
Также в манифесте надо добавить Uses Permission = android.permission.INTERNET на вкладке Permissions. Чтобы система дала приложению доступ в интернет.
Выбираем наше MyBrowser и видим страницу.
Мы увидели, что Activity в наших приложениях могут обрабатывать не только наши придуманные action, но и системные. И, тем самым, создавать альтернативу системным приложениям.
Т.е. для Activity можно создать Intent Filter, который будет сообщать системе, что приложение умеет что-то, но, при этом, внутри Activity будет какая-нибудь ерунда. Это уже вопросы программерской этики, здравого смысла и адекватности )
Полный код манифест-файла:
На следующем уроке:
- хранение данных с помощью Preferences
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Читайте также: