Как написать браузер для андроид

В этом уроке вы увидите, как сделать простейший браузер, который отобразит страницу в интернете по 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»,

Приложение-браузер для android устройств

нажму сохранить и снова запущу программу, на этот раз все произойдет быстрее, поброжу по сайту, в разделе Программирование для андроид есть статьи и видео как установить и настроить 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();
 }
}
}

Вот и все! На самом деле все довольно просто и после недолгих трудов у нас есть собственный браузер, конечно он довольно прост и не имеет никаких опций, но для понимания сути создания подобных приложений этого вполне достаточно.

Оригинальная статья вот тут. Мне показалось нужным слепить растерянные по всей странице обрывки кода в плотненькую программку:).

Понравилась статья? Поделить с друзьями:
  • Как написать боту viber
  • Как написать ботов для игр
  • Как написать ботнет
  • Как написать бота через питон
  • Как написать бота телеграм на джаве