В этом уроке вы увидите, как сделать простейший браузер, который отобразит страницу в интернете по http-адресу. Для этого надо создать Intent, настроить Intent Filter и использовать WebView.
Исходный код классов – под видео:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/btnWeb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="web"> </Button> </LinearLayout>
package info.fandroid.simplebrowser; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); (findViewById(R.id.btnWeb)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://fandroid.info"))); } }); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="info.fandroid.simplebrowser.BrowserActivity"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView"> </WebView> </LinearLayout>
package info.fandroid.simplebrowser; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebView; public class BrowserActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_browser); WebView webView = (WebView)findViewById(R.id.webView); Uri data = getIntent().getData(); webView.loadUrl(data.toString()); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="info.fandroid.simplebrowser"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".BrowserActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <data android:scheme="http"></data> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> </application> </manifest>
Больше уроков:
Уроки Android Studio: тут
Инструменты android разработчика: тут
Дизайн android приложений: тут
Уроки создания игр для android: тут
Основы программирования на JAVA: тут
<<Урок 31. Вызываем браузер, звонилку, карты с помощью intent с атрибутом data – Uri
Урок 33. SharedPreferences – сохранение данных в приложениях | Уроки Android Studio>>
import java.io.File;
import android.R.menu;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.KeyguardManager;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import android.webkit.WebBackForwardList;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Toast;
import android.graphics.Bitmap;
import android.webkit.URLUtil;
public class MainActivity extends Activity {
//Логическая переменная для статуса соединения
Boolean isInternetPresent = false;
ConnectionDetector cd;
private WebChromeClient.CustomViewCallback mFullscreenViewCallback;
private FrameLayout mFullScreenContainer;
private View mFullScreenView;
private WebView mWebView;
String urload;
int cache = 1;
SharedPreferences sPref;
final Activity activity = this;
public Uri imageUri;
private static final int FILECHOOSER_RESULTCODE = 2888;
private ValueCallback<Uri> mUploadMessage;
private Uri mCapturedImageURI = null;
private DownloadManager downloadManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Создаем пример класса connection detector:
cd = new ConnectionDetector(getApplicationContext());
// создаём кнопу home
final ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
// ловим intent что файл загружен и оповещаем
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
loadEnd();
}
}
};
// ловим intent что файл загружен
registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
mWebView = (WebView) findViewById(R.id.web_view);
mFullScreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container);
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.loadUrl("http://yandex.ru");
handleIntent(getIntent());
class HelloWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
findViewById(R.id.progress1).setVisibility(View.VISIBLE);
setTitle(url);
urload=mWebView.getUrl();
ConnectingToInternet ();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// запускаем ссылки на маркет
Uri uri = Uri.parse(url);
if (uri.getScheme().equals("market")) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(uri);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем email
if (uri.getScheme().equals("mailto")) {
Intent i = new Intent(android.content.Intent.ACTION_SEND);
i.setType("text/html");
i.putExtra(Intent.EXTRA_SUBJECT, "Введите тему");
i.putExtra(Intent.EXTRA_TEXT, "Введите текст");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{url});
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем звонилку
if (uri.getScheme().equals("tel")) {
Intent i = new Intent(android.content.Intent.ACTION_DIAL);
i.setData(uri);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем лoкцию
if (uri.getScheme().equals("geo")) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(uri);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
findViewById(R.id.progress1).setVisibility(View.GONE);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
ConnectingToInternet ();
mWebView.loadUrl("file:///android_asset/error.png");
}
}
mWebView.setWebViewClient(new HelloWebViewClient());
// загрузка файлов на устройство
mWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart( final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
final String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);
final AlertDialog.Builder downloadDialog = new AlertDialog.Builder(MainActivity.this);
downloadDialog.setTitle("Менеджер загрузок");
downloadDialog.setMessage("Загрузить этот файл в папку Donwload ?" + 'n' + mimetype + 'n' + url);
downloadDialog.setPositiveButton("Да", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
doDownload( url, fileName);
dialogInterface.dismiss();
}
});
downloadDialog.setNegativeButton("Нет", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
}
});
downloadDialog.show();
}
});
}
// ****************************************
//*****************************************
//*****************************************
public void ConnectingToInternet (){
//Получаем статус Интернет соединения
isInternetPresent = cd.ConnectingToInternet();
//Проверяем Интернет статус:
if (isInternetPresent) {
//Интернет соединение есть
//делаем HTTP запросы:
} else {
//Интернет соединения нет
Toast.makeText(this, " Интернет отвалился !!!", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("SetJavaScriptEnabled")
@Override // настройки
public void onResume(){
super.onResume();
SharedPreferences sPref =
PreferenceManager.getDefaultSharedPreferences(this);
if (sPref.getBoolean("img", false)) {
mWebView.getSettings().setLoadsImagesAutomatically(false);
} else {
mWebView.getSettings().setLoadsImagesAutomatically(true);
}
if (sPref.getBoolean("js", false)) {
mWebView.getSettings().setJavaScriptEnabled(false);
} else {
mWebView.getSettings().setJavaScriptEnabled(true);
}
if (sPref.getBoolean("cache", false)) {
cache = 2;
} else {
cache = 1;
}
}
// пишем закладку
public void saveBm(String urlPage1, String urlTitle1) {
Intent intent = new Intent(this, SaveBmActivity.class);
intent.putExtra("urlTitle", urlTitle1);
intent.putExtra("urlPage", urlPage1);
startActivity(intent);
}
public void pref() { // настройки
Intent intent = new Intent(this, PreferencesActivity.class);
startActivity(intent);
}
// чистим кэш и историю
private void clCache(){
clearCache(activity);
mWebView.clearCache(true);
mWebView.clearHistory();
Toast.makeText(this, "Кеш и История очищены", Toast.LENGTH_SHORT).show();
}
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {// кнопка назад
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
mWebView.canGoBack();
{
mWebView.goBack();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
// ловим url запустившей программы
private boolean handleIntent(Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
String url = intent.getDataString();
Toast.makeText(this, url, Toast.LENGTH_SHORT).show();
mWebView.loadUrl(url);// грузим страницу
return true;
}
return false;
}
// менеджер загрузки
private void doDownload(String url,String fileName) {
Uri uriOriginal = Uri.parse(url);
try {
Toast.makeText(MainActivity.this, "Downloading " + fileName, Toast.LENGTH_LONG).show();
Request request = new DownloadManager.Request(Uri.parse(url));
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(request);
} catch (Exception e) {
Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
Log.e("", "Problem downloading: " + uriOriginal, e);
}
}
// тянем видео на весь экран
private final WebChromeClient mWebChromeClient = new WebChromeClient() {
@Override
@SuppressWarnings("deprecation")
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
onShowCustomView(view, callback);
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (mFullScreenView != null) {
callback.onCustomViewHidden();
return;
}
mFullScreenView = view;
mWebView.setVisibility(View.GONE);
mFullScreenContainer.setVisibility(View.VISIBLE);
mFullScreenContainer.addView(view);
mFullscreenViewCallback = callback;
}
@Override
public void onHideCustomView() {
super.onHideCustomView();
if (mFullScreenView == null) {
return;
}
mWebView.setVisibility(View.VISIBLE);
mFullScreenView.setVisibility(View.GONE);
mFullScreenContainer.setVisibility(View.GONE);
mFullScreenContainer.removeView(mFullScreenView);
mFullscreenViewCallback.onCustomViewHidden();
mFullScreenView = null;
}
// ********************************************* грузим файлы в сеть
// openFileChooser for Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
// Сообщение об обновлении
mUploadMessage = uploadMsg;
try {
// Создать AndroidExampleFolder в sdcard
File imageStorageDir = new File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES)
, "AndroidExampleFolder");
if (!imageStorageDir.exists()) {
// Создать AndroidExampleFolder в sdcard
imageStorageDir.mkdirs();
}
// Создать камеру захваченное изображение путь к файлу и имя
File file = new File(
imageStorageDir + File.separator + "IMG_"
+ String.valueOf(System.currentTimeMillis())
+ ".jpg");
mCapturedImageURI = Uri.fromFile(file);
// Камера захвата изображения intent
final Intent captureIntent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
// Создать файл селектора intent
Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
// Установить камеры намерении выбора файлов
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS
, new Parcelable[]{captureIntent});
// На выбор изображения обхода метода onactivityresult вызов метода активности
startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
} catch (Exception e) {
Toast.makeText(getBaseContext(), "Exception:" + e,
Toast.LENGTH_LONG).show();
}
}
// openFileChooser for Android < 3.0
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
//
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg,
String acceptType,
String capture) {
openFileChooser(uploadMsg, acceptType);
}
public boolean onConsoleMessage(ConsoleMessage cm) {
onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
return true;
}
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
//Log.d("androidruntime", "Show console messages, Used for debugging: " + message);
};
};// End setWebChromeClient
// Получаем результат
@SuppressWarnings("unused")
private Object data; @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (data == null) {
return;
}
String urlPage2 = data.getStringExtra("urlPage2");
mWebView.loadUrl(urlPage2);
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == this.mUploadMessage) {
return;
}
Uri result = null;
try {
if (resultCode != RESULT_OK) {
result = null;
} else {
// извлечь из собственной переменной, если намерение состоит в нуль
result = data == null ? mCapturedImageURI : data.getData();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "activity :" + e,
Toast.LENGTH_LONG).show();
}
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
//*****************************
public void loadEnd () {
Toast.makeText(this, "Файл Загружен в папку Donwload", Toast.LENGTH_SHORT).show();
}
// меню
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// *******************************************************
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:// кнопка home
mWebView.loadUrl("http://yandex.ru");
return true;
case R.id.item1:// назад
mWebView.canGoBack();
{
mWebView.goBack();
}
return true;
case R.id.item2:
// вперёд
mWebView.canGoForward();
{
mWebView.goForward();
}
return true;
case R.id.item3:
// перезагрузка
mWebView.reload();
{
mWebView.reload();
}
return true;
case R.id.item4:// чистим кеш
mWebView.clearCache(true);
clearCache(activity);
Toast.makeText(this, "Кэш чист.", Toast.LENGTH_SHORT).show();
return true;
case R.id.item5:
mWebView.clearHistory();// чистим историю
Toast.makeText(this, "История чиста.", Toast.LENGTH_SHORT).show();
return true;
case R.id.item6:
saveBm(mWebView.getUrl(), mWebView.getTitle());// пишим закладку
return true;
case R.id.item7:// панель закладок
Intent intent1 = new Intent(this, SaveBmActivity.class);
startActivityForResult(intent1, 1);
return true;
case R.id.item8:
// стоп загрузка
mWebView.stopLoading();
return true;
case R.id.item9:
pref();// настройки
return true;
case R.id.item10:
// пока пусто
return true;
case R.id.item11:// выход
if (cache == 2) {
clCache();
}
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@SuppressWarnings("deprecation")
@Override
public void onDestroy() {
super.onDestroy();
mWebView.stopLoading();
mWebView.clearCache(true);
mWebView.clearView();
mWebView.freeMemory();
mWebView.destroy();
mWebView = null;
}
// чистим кеш
void clearCache(Context context)
{
clearCacheFolder(context.getCacheDir());
}
void clearCacheFolder(final File dir)
{
if (dir!= null && dir.isDirectory())
{
try
{
for (File child:dir.listFiles())
{
//рекурсивно чистим сначала каталоги
if (child.isDirectory())
clearCacheFolder(child);
else //потом собственно файлы
child.delete();
}
}
catch(Exception e)
{
}
}
}
}
Давайте создадим новое приложение — браузер для android устройств, своими руками, это будет интересно, и кода будет не очень много.
Содержание:
- Приложение-браузер для android
- Добавление разрешений в манифест
- Кодим логику на Java
- Запуск приложения в эмуляторе
- Полный текст AndroidManifest.xml
- Полный текст main.xml
- Полный текст MainActivity.java
- Видео версия статьи
Запустим android studio и создадим новый проект, application name My Site, company domain по своему усмотрению, я вписал домен сайта maxfad.ru. жмем Next, на следующей вкладке оставляем все без изменения, жмем next, далее уже выбрана Empty Activity, ее и оставим, затем в последней вкладке изменим Layout Name с activity_main на main, и нажмем финиш.
Android Studio подготовит файлы проекта, это займет некоторое время. В главном окне будет открыты два файла, main.xml и MainActivity.java, начнем работать в последнем. Изменим extended AppCompactActivity на Activity, сохранимся.
Добавление разрешений в манифест
Затем откроем файл AndroidManifest.xml и добавим после первой секции пользовательское разрешение user-permission,
<user-permission android:name="android.permission.INTERNET"/>
что бы наше приложение имело доступ в интернет. Сохраним и закроем AndroidManifest.xml.
Перейдем в файл Main.xml, он находится по пути res/layout/main.xml, удалим строку android:text=»Hello Word!» полностью, изменим TextView на WebView, из свойств основного слоя RelativeLayout уберем ненужные отступы (paddingBottom, paddingLeft, paddingRight,paddingTop).
Для WebView добавим свойство android:id=»@+id/webView»,изменим android:layout_width=»wrap_content» и android:layout_height=»wrap_content» на android:layout_width=»match_parent» и android:layout_height=»match_parent», для того, что бы наш элемент WebView был на весь экран.
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:layout_centerHorizontal="true" />
Кодим логику на Java
С файлом main.xml мы закончили, перейдем к MainActivity.java. Добавим переменную wv типа WebView, присвоим ей элемент, найдя его с помощью функции findViewById(), опишем настройки wv, в частности разрешим в WebView выполнять java скрипты, укажем адрес загрузки сайта в наш браузер, я для примера запущу Яндекс, применив функцию loadUrl(«http://ya.ru»).
public class MainActivity extends Activity { WebView wv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); wv = (WebView)findViewById(R.id.webView); WebSettings settings = wv.getSettings(); settings.setJavaScriptEnabled(true); wv.loadUrl("https://maxfad.ru"); wv.setWebViewClient(new WebViewClient()); }
Так же ниже напишем обработку нажатия кнопки назад на устройстве.
@Override public void onBackPressed(){ if(wv.canGoBack()){ wv.goBack(); }else{ super.onBackPressed(); } }
Запуск приложения в эмуляторе
Нажмем кнопку Start, это зеленый треугольник на панели инструментов AndroidStudio, запустится наш эмулятор, и если все сделано правильно, через некоторое время в браузере запустится поиск Яндекс, можно понажимать на виртуальную клавиатуру и что-то поискать, все работает хорошо.
Закроем программу, не закрывая сам эмулятор, нажав на красный прямоугольник, это Stop вместо Start, изменим адрес на произвольный, я «пропиарю» свой сайт «https://maxfad.ru»,
нажму сохранить и снова запущу программу, на этот раз все произойдет быстрее, поброжу по сайту, в разделе Программирование для андроид есть статьи и видео как установить и настроить AndroidStudio, сделать эмулятор android и простые примеры программ.
Полный текст AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.maxfad.mysite"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Полный текст main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ru.maxfad.mysite.MainActivity"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout>
Полный текст MainActivity.java
package ru.maxfad.mysite; import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { WebView wv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); wv = (WebView)findViewById(R.id.webView); WebSettings settings = wv.getSettings(); settings.setJavaScriptEnabled(true); wv.loadUrl("https://maxfad.ru"); wv.setWebViewClient(new WebViewClient()); } @Override public void onBackPressed(){ if(wv.canGoBack()){ wv.goBack(); }else{ super.onBackPressed(); } } }
В этом видео подробно показано как создать приложение-браузер для android устройств:
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
В этом уроке:
— пишем простой браузер
На прошлом уроке мы увидели, что если вызвать Intent с action = ACTION_VIEW и data = Uri-объект с http-адресом, то запускается браузер и отображает содержимое страницы по этому http-адресу. Мы можем самостоятельно сделать простейший браузер, который будет реагировать на такой Intent и просто отобразит страницу. Для этого надо настроить Intent Filter и использовать компонент WebView.
На первом экране приложения у нас будет кнопка, отправляющая 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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/btnWeb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="web"> </Button> </LinearLayout>
На экране просто кнопка
Кодим MainActivity.java:
package ru.startandroid.develop.p0321simplebrowser; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); (findViewById(R.id.btnWeb)).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.ya.ru"))); } }); } }
Код немного непривычен. Обратите внимание я нигде не описываю объект класса Button. Метод findViewById возвращает View, и это View поддерживает метод setOnClickListener, который я вызываю. А в методе setOnClickListener я создаю объект, реализующий интерфейс OnClickListener и в нем пишу код в onClick. Также я создаю объект Intent не отдельно, а прямо в методе startActivity. Кода меньше получилось, чем обычно. Может быть вам подойдет такой вариант.
Итак, мы по нажатию на кнопку запускаем Intent, который означает, что мы хотим просмотреть сайт http://www.ya.ru.
Создадим второе Activity. Сначала layout-файл browser.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"> </WebView> </LinearLayout>
На экране компонент WebView.
Создаем BrowserActivity.java:
package ru.startandroid.develop.p0321simplebrowser; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.webkit.WebView; public class BrowserActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.browser); WebView webView = (WebView) findViewById(R.id.webView); webView.setWebViewClient(new WebViewClient()); Uri data = getIntent().getData(); webView.loadUrl(data.toString()); } }
Определяем WebView, читаем data из Intent и передаем строку в WebView.
Теперь пропишем Activity в манифесте. К нему нам надо будет добавить Intent Filter, в нем указать action = ACTION_VIEW. А для data мы видим несколько параметров, используем Scheme = http.
Это значит, что Uri объект в Intent должен содержать http-адрес.
Не забываем про Category = Default. Label для BrowserActivity укажите, например, MyBrowser.
Также в манифесте надо добавить Uses Permission = android.permission.INTERNET на вкладке Permissions. Чтобы система дала приложению доступ в интернет.
Все сохраним и запустим приложение. Жмем кнопку и видим выбор: система предлагает нам на выбор системный браузер и наш, только что сделанный. Т.е. Intent c запросом на просмотр http-адреса нашел в системе два Activity, которые в своих Intent Filter заявили, что умеют отображать http-адреса.
Выбираем наше MyBrowser и видим страницу.
Мы увидели, что Activity в наших приложениях могут обрабатывать не только наши придуманные action, но и системные. И, тем самым, создавать альтернативу системным приложениям.
Но, как вы понимаете, мы запросто могли в нашем Activity не использовать WebView и не показывать страницу. Можно было использовать TextView и в нем просто отобразить в виде текста адрес из data. Или накодить http-запрос, который скачал бы эту страницу и отобразил ее html-содержимое. Мы могли вообще забить на http-адрес и показать какую-нибудь картинку левую или просто темный экран.
Т.е. для Activity можно создать Intent Filter, который будет сообщать системе, что приложение умеет что-то, но, при этом, внутри Activity будет какая-нибудь ерунда. Это уже вопросы программерской этики, здравого смысла и адекватности )
Полный код манифест-файла:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.startandroid.develop.p0321simplebrowser" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10"></uses-sdk> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> <activity android:label="MyBrowser" android:name="BrowserActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <data android:scheme="http"></data> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> </application> </manifest>
На следующем уроке:
— хранение данных с помощью Preferences
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Изучать программирование под Андроид я начал не так давно. После того, как Eclips выдал мой первый Hello Word, сразу захотелось большего: возникло много планов и грандиозных идей. Одной такой идеей было написание своего Браузера. Думаю, у многих начинающих программистов возникало такое желание. Вот какие требования были мной поставлены и что получилось в итоге.
- Программа должна открывать ссылки глобальной сети, свободно переходить по страничкам вперёд и назад;
- Иметь возможность скачивать файлы и загружать обратно в сеть;
- Создавать закладки и сохранять их;
- Иметь возможность загружать ссылки, отправленные с других приложений;
- Должна быть кнопка домашней страницы, меню с различными настройками и т.д.
В общем, полноценный браузер своими руками. Воплотим это в код.
Программа написана на основе стандартного webview, входящего в Android. В качестве стартовой страницы использую Яндекс, это дело вкуса. В качестве основного Activity будет MainActivity.
Первым делом задаём разметку xml файла -activity_main.xml. В качестве главного контейнера используем LinearLayout — в него заворачиваем ProgressBar для отображения процесса загрузки. Далее создаём ещё один контейнер LinearLayout — в него заворачиваем наш Webview и FrameLayout (его используем для растягивания воспроизводимого видео на весь экран).
Посмотреть код
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ProgressBar
android:id="@+id/progress1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:indeterminateDrawable="@drawable/spinner_png"
android:indeterminateOnly="true"
android:layout_gravity="center_horizontal"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/fullscreen_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
Начнём писать код в MainActivity
Полный код MainActivity.
Посмотреть полный код
import java.io.File;
import android.R.menu;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.KeyguardManager;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import android.webkit.WebBackForwardList;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Toast;
import android.graphics.Bitmap;
import android.webkit.URLUtil;
public class MainActivity extends Activity {
//Логическая переменная для статуса соединения
Boolean isInternetPresent = false;
ConnectionDetector cd;
private WebChromeClient.CustomViewCallback mFullscreenViewCallback;
private FrameLayout mFullScreenContainer;
private View mFullScreenView;
private WebView mWebView;
String urload;
int cache = 1;
SharedPreferences sPref;
final Activity activity = this;
public Uri imageUri;
private static final int FILECHOOSER_RESULTCODE = 2888;
private ValueCallback<Uri> mUploadMessage;
private Uri mCapturedImageURI = null;
private DownloadManager downloadManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Создаем пример класса connection detector:
cd = new ConnectionDetector(getApplicationContext());
// создаём кнопу home
final ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
// ловим intent что файл загружен и оповещаем
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
loadEnd();
}
}
};
// ловим intent что файл загружен
registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
mWebView = (WebView) findViewById(R.id.web_view);
mFullScreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container);
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.loadUrl("http://yandex.ru");
handleIntent(getIntent());
class HelloWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
findViewById(R.id.progress1).setVisibility(View.VISIBLE);
setTitle(url);
urload=mWebView.getUrl();
ConnectingToInternet ();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// запускаем ссылки на маркет
Uri uri = Uri.parse(url);
if (uri.getScheme().equals("market")) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(uri);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем email
if (uri.getScheme().equals("mailto")) {
Intent i = new Intent(android.content.Intent.ACTION_SEND);
i.setType("text/html");
i.putExtra(Intent.EXTRA_SUBJECT, "Введите тему");
i.putExtra(Intent.EXTRA_TEXT, "Введите текст");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{url});
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем звонилку
if (uri.getScheme().equals("tel")) {
Intent i = new Intent(android.content.Intent.ACTION_DIAL);
i.setData(uri);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
// запускаем лoкцию
if (uri.getScheme().equals("geo")) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(uri);
startActivity(i);
mWebView.canGoBack();
{
mWebView.goBack();
}
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
findViewById(R.id.progress1).setVisibility(View.GONE);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
ConnectingToInternet ();
mWebView.loadUrl("file:///android_asset/error.png");
}
}
mWebView.setWebViewClient(new HelloWebViewClient());
// загрузка файлов на устройство
mWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart( final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
final String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);
final AlertDialog.Builder downloadDialog = new AlertDialog.Builder(MainActivity.this);
downloadDialog.setTitle("Менеджер загрузок");
downloadDialog.setMessage("Загрузить этот файл в папку Donwload ?" + 'n' + mimetype + 'n' + url);
downloadDialog.setPositiveButton("Да", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
doDownload( url, fileName);
dialogInterface.dismiss();
}
});
downloadDialog.setNegativeButton("Нет", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
}
});
downloadDialog.show();
}
});
}
// ****************************************
//*****************************************
//*****************************************
public void ConnectingToInternet (){
//Получаем статус Интернет соединения
isInternetPresent = cd.ConnectingToInternet();
//Проверяем Интернет статус:
if (isInternetPresent) {
//Интернет соединение есть
//делаем HTTP запросы:
} else {
//Интернет соединения нет
Toast.makeText(this, " Интернет отвалился !!!", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("SetJavaScriptEnabled")
@Override // настройки
public void onResume(){
super.onResume();
SharedPreferences sPref =
PreferenceManager.getDefaultSharedPreferences(this);
if (sPref.getBoolean("img", false)) {
mWebView.getSettings().setLoadsImagesAutomatically(false);
} else {
mWebView.getSettings().setLoadsImagesAutomatically(true);
}
if (sPref.getBoolean("js", false)) {
mWebView.getSettings().setJavaScriptEnabled(false);
} else {
mWebView.getSettings().setJavaScriptEnabled(true);
}
if (sPref.getBoolean("cache", false)) {
cache = 2;
} else {
cache = 1;
}
}
// пишем закладку
public void saveBm(String urlPage1, String urlTitle1) {
Intent intent = new Intent(this, SaveBmActivity.class);
intent.putExtra("urlTitle", urlTitle1);
intent.putExtra("urlPage", urlPage1);
startActivity(intent);
}
public void pref() { // настройки
Intent intent = new Intent(this, PreferencesActivity.class);
startActivity(intent);
}
// чистим кэш и историю
private void clCache(){
clearCache(activity);
mWebView.clearCache(true);
mWebView.clearHistory();
Toast.makeText(this, "Кеш и История очищены", Toast.LENGTH_SHORT).show();
}
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {// кнопка назад
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
mWebView.canGoBack();
{
mWebView.goBack();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
// ловим url запустившей программы
private boolean handleIntent(Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
String url = intent.getDataString();
Toast.makeText(this, url, Toast.LENGTH_SHORT).show();
mWebView.loadUrl(url);// грузим страницу
return true;
}
return false;
}
// менеджер загрузки
private void doDownload(String url,String fileName) {
Uri uriOriginal = Uri.parse(url);
try {
Toast.makeText(MainActivity.this, "Downloading " + fileName, Toast.LENGTH_LONG).show();
Request request = new DownloadManager.Request(Uri.parse(url));
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(request);
} catch (Exception e) {
Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
Log.e("", "Problem downloading: " + uriOriginal, e);
}
}
// тянем видео на весь экран
private final WebChromeClient mWebChromeClient = new WebChromeClient() {
@Override
@SuppressWarnings("deprecation")
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
onShowCustomView(view, callback);
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (mFullScreenView != null) {
callback.onCustomViewHidden();
return;
}
mFullScreenView = view;
mWebView.setVisibility(View.GONE);
mFullScreenContainer.setVisibility(View.VISIBLE);
mFullScreenContainer.addView(view);
mFullscreenViewCallback = callback;
}
@Override
public void onHideCustomView() {
super.onHideCustomView();
if (mFullScreenView == null) {
return;
}
mWebView.setVisibility(View.VISIBLE);
mFullScreenView.setVisibility(View.GONE);
mFullScreenContainer.setVisibility(View.GONE);
mFullScreenContainer.removeView(mFullScreenView);
mFullscreenViewCallback.onCustomViewHidden();
mFullScreenView = null;
}
// ********************************************* грузим файлы в сеть
// openFileChooser for Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
// Сообщение об обновлении
mUploadMessage = uploadMsg;
try {
// Создать AndroidExampleFolder в sdcard
File imageStorageDir = new File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES)
, "AndroidExampleFolder");
if (!imageStorageDir.exists()) {
// Создать AndroidExampleFolder в sdcard
imageStorageDir.mkdirs();
}
// Создать камеру захваченное изображение путь к файлу и имя
File file = new File(
imageStorageDir + File.separator + "IMG_"
+ String.valueOf(System.currentTimeMillis())
+ ".jpg");
mCapturedImageURI = Uri.fromFile(file);
// Камера захвата изображения intent
final Intent captureIntent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
// Создать файл селектора intent
Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
// Установить камеры намерении выбора файлов
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS
, new Parcelable[]{captureIntent});
// На выбор изображения обхода метода onactivityresult вызов метода активности
startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
} catch (Exception e) {
Toast.makeText(getBaseContext(), "Exception:" + e,
Toast.LENGTH_LONG).show();
}
}
// openFileChooser for Android < 3.0
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
//
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg,
String acceptType,
String capture) {
openFileChooser(uploadMsg, acceptType);
}
public boolean onConsoleMessage(ConsoleMessage cm) {
onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
return true;
}
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
//Log.d("androidruntime", "Show console messages, Used for debugging: " + message);
};
};// End setWebChromeClient
// Получаем результат
@SuppressWarnings("unused")
private Object data; @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (data == null) {
return;
}
String urlPage2 = data.getStringExtra("urlPage2");
mWebView.loadUrl(urlPage2);
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == this.mUploadMessage) {
return;
}
Uri result = null;
try {
if (resultCode != RESULT_OK) {
result = null;
} else {
// извлечь из собственной переменной, если намерение состоит в нуль
result = data == null ? mCapturedImageURI : data.getData();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "activity :" + e,
Toast.LENGTH_LONG).show();
}
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
//*****************************
public void loadEnd () {
Toast.makeText(this, "Файл Загружен в папку Donwload", Toast.LENGTH_SHORT).show();
}
// меню
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// *******************************************************
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:// кнопка home
mWebView.loadUrl("http://yandex.ru");
return true;
case R.id.item1:// назад
mWebView.canGoBack();
{
mWebView.goBack();
}
return true;
case R.id.item2:
// вперёд
mWebView.canGoForward();
{
mWebView.goForward();
}
return true;
case R.id.item3:
// перезагрузка
mWebView.reload();
{
mWebView.reload();
}
return true;
case R.id.item4:// чистим кеш
mWebView.clearCache(true);
clearCache(activity);
Toast.makeText(this, "Кэш чист.", Toast.LENGTH_SHORT).show();
return true;
case R.id.item5:
mWebView.clearHistory();// чистим историю
Toast.makeText(this, "История чиста.", Toast.LENGTH_SHORT).show();
return true;
case R.id.item6:
saveBm(mWebView.getUrl(), mWebView.getTitle());// пишим закладку
return true;
case R.id.item7:// панель закладок
Intent intent1 = new Intent(this, SaveBmActivity.class);
startActivityForResult(intent1, 1);
return true;
case R.id.item8:
// стоп загрузка
mWebView.stopLoading();
return true;
case R.id.item9:
pref();// настройки
return true;
case R.id.item10:
// пока пусто
return true;
case R.id.item11:// выход
if (cache == 2) {
clCache();
}
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@SuppressWarnings("deprecation")
@Override
public void onDestroy() {
super.onDestroy();
mWebView.stopLoading();
mWebView.clearCache(true);
mWebView.clearView();
mWebView.freeMemory();
mWebView.destroy();
mWebView = null;
}
// чистим кеш
void clearCache(Context context)
{
clearCacheFolder(context.getCacheDir());
}
void clearCacheFolder(final File dir)
{
if (dir!= null && dir.isDirectory())
{
try
{
for (File child:dir.listFiles())
{
//рекурсивно чистим сначала каталоги
if (child.isDirectory())
clearCacheFolder(child);
else //потом собственно файлы
child.delete();
}
}
catch(Exception e)
{
}
}
}
}
Проект можно скачать отсюда.
Автор: orex5
Источник
Мы уже начали полноценно обеспечивать себя личным софтом, вспомните наши чудесные калькулятор и конвертер. И в этом уроке мы научимся создавать простой браузер, с помощью которого будет бороздить просторы интернета. Согласитесь, серфить сеть на своем собственном браузере — это в разы приятнее чем делать это на Opera или Chrome (вряд ли удобнее, но приятнее :)). Создаем новый проект, названия традиционно выбирайте сами. Лично я вообще не создаю каждый раз все с нуля, а просто открываю, что есть, и зачищаю весь код до исходного состояния Blank Activity. Делайте, как вам удобней.
Итак, кратко очертим объем и специфику последующей работы. Нам нужно создать элемент <WebView>, в котором будет все происходить, написать код, создающий наш личный Веб-обозреватель, обустроить его базовыми функциями, прописать разрешение на использование Internet нашим приложением в файле манифеста, и написать обработчик нажатия аппаратной кнопки «Назад» на устройстве (то есть, что будет происходить в нашем браузере при нажатии на эту кнопку).
Начнем. Открываем файл activity_main.xml. Создаем там один единственный элемент <WebView>, которого нам вполне достаточно для реализации веб-обозревателя:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/web"/>
Окно разметки будет выглядеть так:
После этого давайте сразу разберемся с файлом AndroidManifest.xml. Открываем его и добавляем туда две строчки, одна — это разрешение для приложения использовать Интернет, другая — изменение стиля приложения, а точнее сокрытие панели «Title» приложения (панели с заголовком приложения) с той целью, чтобы предоставить окну браузера больше пространства для отображения страниц.
Пишем строку разрешения использовать интернет до открытия тега <application>…</application>:
<uses-permission android:name="android.permission.INTERNET"/>
Теперь добавим к строке настройки нашего Activity команду для скрытия заголовка (нижняя строка, выделенная жирным, это также находиться в AndroidManifest.xml):
<activity
android:name=".MainActivity"
android:label="Браузер"
android:theme="@android:style/Theme.NoTitleBar">
Теперь переходим к самой важной и ответственной части работы — написанию java кода. Открываем файл MainActivity.java и пишем так следующее (объяснения даны в коде после знаков //, кто не заметил):
package home.myapplication;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
public class MainActivity extends Activity {
// Объявляем переменную типа WebView
private WebView mWeb;
// Создаем класс типа Веб-обозреватель (WebViewClient), которому настраиваем
// по умолчанию разрешение обрабатывать все ссылки внутри этого класса,
// не обращаясь к сторонним программам:
private class WebViewer extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url)
{
view.loadUrl(url);
return true;
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Привязываем объявленную переменную типа WebView к созданному нами
// элементу WebView в файле activity_main.xml:
mWeb=(WebView)findViewById(R.id.web);
// Подключаем для этого элемента поддержку Java скриптов:
mWeb.getSettings().setJavaScriptEnabled(true);
// Настраиваем страницу, которая будет загружать при запуске, можете ввести любую:
mWeb.loadUrl("http://developeroleg.ucoz.ru/");
// Настраиваем обозреватель для нашего элемента WebView, подключаем созданный нами выше
// Веб-клиент, с помощью которого будет проходить просмотр страниц:
mWeb.setWebViewClient(new WebViewer());
}
// Пишем код обработки нажатия кнопки назад на устройстве, что позволит нам при нажатии
// на кнопку "Назад" перейти к предыдущей странице, а не просто закрывать приложения.
// Оно будет закрываться кнопкой "Назад" лишь в том случае, если мы находимся на стартовой
// странице, которую указали выше:
@Override
public void onBackPressed() {
if (mWeb.canGoBack()) {
mWeb.goBack();}
else {
super.onBackPressed();
}
}
}
Вот и все! На самом деле все довольно просто и после недолгих трудов у нас есть собственный браузер, конечно он довольно прост и не имеет никаких опций, но для понимания сути создания подобных приложений этого вполне достаточно.
Оригинальная статья вот тут. Мне показалось нужным слепить растерянные по всей странице обрывки кода в плотненькую программку:).