Pišemo potpuni preglednik za Android. WebView - kreirajte vlastiti preglednik Pokretanje aplikacije u emulatoru

💖 Sviđa li vam se? Podijelite vezu sa svojim prijateljima

Nedavno sam počeo učiti Android programiranje. Nakon što je Eclips proizveo moju prvu Hello Word, odmah sam poželio više: pojavilo se mnogo planova i grandioznih ideja. Jedna takva ideja bila je napisati vlastiti preglednik. Mislim da su mnogi programeri početnici imali tu želju. Evo kakve sam zahtjeve postavio i što se na kraju dogodilo.

  • Program bi trebao otvarati poveznice globalna mreža, slobodno se kretati naprijed i natrag kroz stranice;
  • Biti u mogućnosti preuzimati datoteke i postavljati ih natrag na mrežu;
  • Stvorite oznake i spremite ih;
  • Biti u mogućnosti preuzeti poveznice poslane iz drugih aplikacija;
  • Mora postojati gumb početna stranica, izbornik s raznim postavkama itd.

Općenito, punopravni preglednik "uradi sam". Stavimo ovo u kod.

Program je napisan na temelju standardnog webviewa uključenog u Android. Kao početna stranica Ja koristim Yandex, to je stvar ukusa. Glavna aktivnost će biti MainActivity.

Prije svega, postavili smo oznaku xml datoteka-aktivnost_glavna.xml. Koristimo LinearLayout kao glavni spremnik - omotamo ProgressBar u njega za prikaz procesa učitavanja. Zatim stvaramo još jedan spremnik LinearLayout - omotavamo naš Webview i FrameLayout u njega (koristimo ga za rastezanje reproduciranog videa na cijeli zaslon).

Pogledaj kod

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">

Počnimo pisati kod u MainActivity

Puni kod MainActivity.

Pogledajte cijeli kod

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; javna klasa MainActivity extends Activity ( //Boolean varijabla za status veze 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; konačna aktivnost = this; public Uri imageUri; private static int FILECHOOSER_RESULTCODE = 2888; private ValueCallback mUploadMessage; privatni Uri mCapturedImageURI = null; privatni DownloadManager downloadManager; @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Stvorite primjer klase detektora veze: cd = new ConnectionDetector(getApplicationContext()); // stvorite početnu gumb final ActionBar(); actionBar.setHomeButtonEnabled(true); context, Intent intent) ( String action = intent.getAction(); if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) (loadEnd(); ) )); // uhvati namjeru da je datoteka preuzeta registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); mWebView = (WebView) findViewById(R.id.web_view); mFullScreenContainer = (FrameLayout) findViewId(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 url) ( view.loadUrl(url); // pokretanje veza na tržište Uri = Uri.parse( url); (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.goBack(); ) // pokretanje e-pošte if (uri.getScheme().equals("mailto")) ( Intent i = new Intent(android.content. Namjera .ACTION_SEND); i.putExtra(Intent.EXTRA_TEXT, "Unesi tekst"); EXTRA_EMAIL , novi String(url)); mWebView.canGoBack(); ( mWebView.goBack(); ) ) // pokretanje birača if (uri.getScheme().equals("tel")) ( Intent i = new Intent(android.content.Intent.ACTION_DIAL); i.setData(uri ) ; startActivity(i); mWebView.goBack(); ) // pokretanje lokacije if (uri.getScheme().equals("geo")) ( Intent i = new Intent(android) .sadržaj . Namjera.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()); // preuzimanje datoteka na uređaj 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(MainActivity.this); downloadDialog.setMessage("Preuzeti ovu datoteku u mapu Donwload?" + "n" + mimetype + " n" + url); downloadDialog.setPositiveButton("Da", new DialogInterface.OnClickListener() ( public void onClick(DialogInterface dialogInterface, int i) ( doDownload(url, fileName); dialogInterface.dismiss(); ) )) ; downloadDialog .setNegativeButton("Ne", new DialogInterface.OnClickListener() ( public void onClick(DialogInterface dialogInterface, int i) ( ) )); downloadDialog.show()); ) // ************************************************* * //***** ************************************ //**** ******** ***************************** public void ConnectingToInternet ()( //Dohvati status Internetska veza isInternetPresent = cd.ConnectingToInternet(); / /Provjeri internetski status: if (isInternetPresent) ( //Postoji internetska veza //do HTTP zahtjevi: ) else ( //Nema internetske veze Toast.makeText(this, "Internet je pao!!!", Toast.LENGTH_SHORT).show(); ) ) @SuppressLint("SetJavaScriptEnabled") @Override // postavke javne 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; ) ) // napiši knjižnu oznaku public void saveBm(String urlPage1, String urlTitle1) ( Intent intent = new Intent( this, SaveBmActivity. class); intent.putExtra("urlTitle", urlPage1); this, klasa PreferencesActivity); startActivity(namjera); ) // brisanje predmemorije i povijesti private void clCache())( clearCache(activity); mWebView.clearCache(true); mWebView.clearHistory(); Toast.makeText(ovo, "Predmemorija i povijest izbrisani", Toast.LENGTH_SHORT) .show ();) @Override protected void onUserLeaveHint() ( super.onUserLeaveHint(); ) @Override public boolean onKeyDown(int keyCode, KeyEvent event) (// gumb za povratak if ((keyCode == KeyEvent.KEYCODE_BACK)) ( mWebView(); (mWebView.goBack();) return super.onKeyDown(keyCode, event); .getAction(); (Intent.ACTION_VIEW.equals(action)) ( String url = intent.getDataString(); Toast.makeText(this, url, Toast.LENGTH_SHORT).show(); mWebView.loadUrl(url); // učitavanje stranice return true;) return false; ) // upravitelj preuzimanja private void doDownload(String url,String fileName) ( Uri uriOriginal = Uri.parse(url); try ( Toast.makeText(MainActivity.this, "Downloading) " + naziv datoteke, tost. LENGTH_LONG).show(); Zahtjev za zahtjev= novi DownloadManager.Request(Uri.parse(url)); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, naziv datoteke); final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); dm.enqueue(zahtjev); ) catch (Iznimka e) ( Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); Log.e("", "Problem pri preuzimanju: " + uriOriginal, e); ) ) // povucite video full screen 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( Pregled pogleda, povratni poziv CustomViewCallback) ( if (mFullScreenView != null) ( callback.onCustomViewHidden(); return; ) mFullScreenView = pogled; 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; ) // ************************************************* ******** Prijenos datoteka na mrežu // openFileChooser za Android 3.0+ public void openFileChooser(ValueCallback uploadMsg, String acceptType) ( // Poruka ažuriranja mUploadMessage = uploadMsg; pokušaj ( // Stvori AndroidExampleFolder u sdcard File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) , "AndroidExampleFolder"); if (!imageStorageDir.exists( ) ) ( // Stvori AndroidExampleFolder u sdcard imageStorageDir.mkdirs(); ) // Stvori putanju i naziv datoteke slike snimljene kamerom Datoteka datoteke= nova datoteka (imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); mCapturedImageURI = Uri.fromFile(file); // Namjera kamere za snimanje slike final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); Namjera i = nova namjera(Namjera.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("slika/*"); // Kreirajte datoteku selektora namjere Intent ChoorIntent = Intent.createChooser(i, "Birač slike"); // Postavi namjeru kamere za odabir datoteka chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS , new Parcelable(captureIntent)); // Za odabir slike zaobići metodu onactivityresult, pozovite metodu aktivnosti startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); ) catch (Iznimka e) ( Toast.makeText(getBaseContext(), "Iznimka:" + e, Toast.LENGTH_LONG).show(); ) ) // openFileChooser za Android< 3.0 @SuppressWarnings("unused") public void openFileChooser(ValueCallbackuploadMsg) ( openFileChooser(uploadMsg, ""); ) // @SuppressWarnings("unused") public void openFileChooser(ValueCallback 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", "Prikaži poruke konzole, Koristi se za otklanjanje pogrešaka: " + poruka); ); );// End setWebChromeClient // Dobivanje rezultata @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 rezultat = null; try ( if (resultCode != RESULT_OK) ( result = null; ) else ( // dohvaćanje iz vlastite varijable ako je namjera null rezultat = data == null ? mCapturedImageURI: data.getData(); ) catch (Exception e) ( Toast.makeText(getApplicationContext(), "activity:" + e, Toast.LENGTH_LONG).show(); ) mUploadMessage .onReceiveValue (rezultat); mUploadMessage = null; ) //******************************** public void loadEnd () ( Toast .makeText(this, "File Uploaded to Donwload", Toast.LENGTH_SHORT).show(); ) // izbornik @Override public boolean onCreateOptionsMenu(izbornik izbornika) ( // Naduvajte izbornik; ovo dodaje stavke na akcijsku traku ako je prisutna.getMenuInflater().inflate(R.menu.main, menu); vratiti istinito; ) // ************************************************* ******** @Override public boolean onOptionsItemSelected(MenuItem item) ( switch (item.getItemId()) ( case android.R.id.home:// početni gumb mWebView.loadUrl("http://yandex.ru"); vratiti istinito; case R.id.item1:// back mWebView.canGoBack(); ( mWebView.goBack(); ) return true; case R.id.item2: // naprijed mWebView.canGoForward(); ( mWebView.goForward(); ) return true; case R.id.item3: // ponovno učitaj mWebView.reload(); ( mWebView.reload(); ) return true; case R.id.item4:// brisanje predmemorije mWebView.clearCache(true); clearCache(aktivnost); Toast.makeText(this, "Cache clear.", Toast.LENGTH_SHORT).show(); vratiti istinito; case R.id.item5: mWebView.clearHistory();// brisanje povijesti Toast.makeText(this, "Povijest je jasna.", Toast.LENGTH_SHORT).show(); vratiti istinito; case R.id.item6: saveBm(mWebView.getUrl(), mWebView.getTitle());// pisanje knjižne oznake return true; case R.id.item7:// traka oznaka Namjera namjera1 = nova namjera(ovo, SaveBmActivity.class); startActivityForResult(intent1, 1); vratiti istinito; case R.id.item8: // zaustavi učitavanje mWebView.stopLoading(); vratiti istinito; case R.id.item9: pref();// postavke vraćaju true; case R.id.item10: // za sada prazno return true; case R.id.item11:// exit if (cache == 2) ( clCache(); ) finish(); vratiti istinito; zadano: 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;) // očisti predmemoriju void clearCache(Context context) ( clearCacheFolder(context.getCacheDir()); ) void clearCacheFolder(final File dir) ( if (dir!= null && dir.isDirectory() ). ) ) uhvati (Iznimka e) ( ) ) ) )

Projekt se može preuzeti

Android vam omogućuje stvaranje vlastitog prozora za pregledavanje web stranica ili čak stvaranje vlastitog klona preglednika pomoću elementa. Sam element koristi WebKit mehanizam i ima mnogo svojstava i metoda. Ograničit ćemo se na osnovni primjer izrade aplikacije pomoću koje možemo pregledavati stranice na internetu. U najnovije verzije Koristi se Chromiumov motor, ali u tome nema velike razlike za jednostavne zadatke.

Kreirajmo novi projekt Moj preglednik i odmah zamijenite kod u datoteci za označavanje res/layout/activity_main.xml:

Sada otvorimo datoteku aktivnosti MainActivity.java i deklarirajte komponentu, a također je inicijalizirajte - omogućite JavaScript podršku i navedite stranicu za učitavanje.

Privatni WebView webView; public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); // omogući JavaScript podršku webView.getSettings().setJavaScriptEnabled(true) ; // navedite stranicu za preuzimanje webView.loadUrl("http://site/android");

Budući da će aplikacija koristiti internet, morate postaviti dopuštenje za pristup internetu u datoteci manifesta.

Tamo u manifestu mijenjamo redak za ekran uklanjanjem naslova iz naše aplikacije (podebljano):

android:theme="@style/Theme.AppCompat.NoActionBar">

Pokrenimo aplikaciju. Sada imamo na raspolaganju jednostavan preglednik web stranica, ali s jednim nedostatkom. Ako kliknete bilo koju vezu, automatski će se pokrenuti vaš zadani preglednik i tamo će se prikazati nova stranica. Točnije, tako je bilo i prije. Na novim uređajima, kada pokrenete aplikaciju, preglednik se odmah otvara.

Da biste riješili ovaj problem i otvorili veze u svom programu, morate nadjačati klasu WebViewClient i neka naša aplikacija obrađuje veze. Dodajmo ugniježđenu klasu u kod:

Privatna klasa MyWebViewClient proširuje WebViewClient ( @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) ( view.loadUrl(request.getUrl().toString()); return true; ) // Za stari uređaji @Override public boolean shouldOverrideUrlLoading(WebView view, String url) ( view.loadUrl(url); return true; ) )

Zatim u metodi onCreate() definirajmo instancu MyWebViewClient. Može se nalaziti bilo gdje nakon inicijalizacije objekta:

WebView.setWebViewClient(novi MyWebViewClient());

Sada u našoj aplikaciji stvorena WebViewClient, koji omogućuje učitavanje bilo kojeg navedenog URL-a odabranog u sam spremnik, umjesto pokretanja preglednika. Za ovu funkcionalnost odgovorna je metoda u kojoj specificiramo trenutni i željeni URL. Povratna vrijednost pravi znači da ne moramo pokretati preglednik treće strane, već ćemo samostalno preuzeti sadržaj s poveznice. U verziji API-ja 24 dodana je preopterećena verzija metode, uzmite to u obzir.

Ponovno pokrenite program i provjerite jesu li veze sada učitane u samoj aplikaciji. Ali sada se pojavio još jedan problem. Ne možemo se vratiti na prethodnu stranicu. Ako pritisnemo tipku NATRAG na svom uređaju, jednostavno ćemo zatvoriti našu aplikaciju. Da bismo riješili novi problem, moramo pritisnuti tipku NATRAG. Dodajte novu metodu:

@Override public void onBackPressed() ( if(webView.canGoBack()) ( webView.goBack(); ) else ( super.onBackPressed(); ) )

Moramo provjeriti što podržava navigaciju na prethodnu stranicu. Ako je uvjet istinit tada se poziva metoda vrati se natrag(), što nas vraća korak natrag na prethodnu stranicu. Ako postoji nekoliko takvih stranica, tada se možemo redom vratiti na prvu stranicu. U ovom slučaju, metoda će uvijek vratiti vrijednost pravi. Kada se vratimo na prvu stranicu s koje smo započeli svoje putovanje internetom, vrijednost će se vratiti lažno a pritisak tipke NATRAG obradit će sam sustav, čime će se zatvoriti zaslon aplikacije.

Ponovno pokrenite aplikaciju. Sada imate vlastiti web preglednik koji vam omogućuje da slijedite veze i vratite se na prethodnu stranicu. Nakon proučavanja dokumentacije, možete opremiti aplikaciju s drugim ukusnim poslasticama za vaš preglednik.

Ako trebate da se neke od poveznica koje vode do vaše stranice otvore u pregledniku, a lokalne veze da se otvore u aplikaciji, tada koristite uvjet s različitim povratnim vrijednostima.

Javna klasa MyWebViewClient proširuje WebViewClient ( @Override public boolean shouldOverrideUrlLoading(WebView view, String url) ( if(Uri.parse(url).getHost()..ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity (namjera); return true;

Univerzalna metoda koja će otvoriti sve lokalne poveznice u aplikaciji, ostale u pregledniku (mijenjamo jedan red):

Javna klasa MyAppWebViewClient proširuje WebViewClient ( @Override public boolean shouldOverrideUrlLoading(WebView view, String url) ( if(Uri.parse(url).getHost().length() == 0)( return false; ) Namjera namjere = nova namjera(Namjera.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(namjera); vratiti istinito; ) )

Sada malo zakomplicirajmo primjer tako da korisnik ima alternativu standardnim preglednicima.

Da bi bilo jasnije, preuredimo primjer na sljedeći način. Kreirajte dvije aktivnosti. Na prvu aktivnost postavite gumb za odlazak na drugu aktivnost, a na drugu aktivnost postavite komponentu.

U manifestu navodimo filtar za drugu aktivnost.

Kod za gumb za odlazak na drugu aktivnost.

Public void onClick(View view) ( Intent intent = new Intent("ru.alexanderklimov.Browser"); intent.setData(Uri.parse("http://site/android/")); startActivity(intent); )

Filterom smo kreirali vlastitu namjeru i dali podatke - adresu web stranice.

Druga aktivnost treba primiti podatke:

Paket ru.alexanderklimov.testapplication; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; javna klasa SecondActivity proširuje AppCompatActivity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Uri url = getIntent().getData(); WebView webView = findViewById(R.id.webView); webView.setWebViewClient(novi povratni poziv()); webView.loadUrl(url.toString()); ) private class Callback extends WebViewClient ( @Override public boolean shouldOverrideUrlLoading (WebView view, String url) ( return(false); ) ) )

U filtru za drugu aktivnost naveli smo dvije akcije.

To znači da bilo koja aktivnost (čitaj: aplikacija) može pokrenuti aktivnost vašeg mini-preglednika na isti način. Pokrenite bilo koji stari projekt u studiju u zasebnom prozoru ili napravite novi i dodajte mu gumb te napišite isti kod koji smo koristili za klik na gumb.

Pokrenite drugu aplikaciju (prvu aplikaciju možete zatvoriti) i kliknite na gumb. Nećete pokrenuti prvu aplikaciju s početnim zaslonom, već odmah drugu aktivnost s mini-preglednikom. Na ovaj način bilo koja aplikacija može pokrenuti preglednik bez znanja naziva klase vaše aktivnosti, već koristeći samo niz "ru.alexanderklimov.Preglednik", preneseno na Namjera. U tom slučaju aktivnost vašeg preglednika trebala bi imati zadanu kategoriju i podatke. Da vas podsjetim:

Možete predstaviti svoj niz kao konstantu niza i reći svim potencijalnim korisnicima vašeg preglednika kako ga mogu sami pokrenuti. Ali Android već ima takvu gotovu konstantu ACTION_VIEW, a koja prema dokumentaciji glasi:

Javni statički konačni java.lang.String ACTION_VIEW = "android.intent.action.VIEW";

Napišimo ponovno kod za gumb u drugoj aplikaciji

Namjera(android.content.Intent.ACTION_VIEW, Uri.parse("http://site/android/")); startActivity(namjera);

Što će se dogoditi ovaj put? Sjećamo se da imamo propisane dvije radnje, uključujući android.intent.action.VIEW. To znači da naša prva aplikacija s preglednikom također mora prepoznati ovu naredbu kada neka korisnička aplikacija koristi ovaj kod. Emulator ima najmanje jedan takav program “Browser”, a sada mu je dodana naša druga aktivnost iz prve aplikacije. Na ekranu će se pojaviti izbor između dvije aplikacije.

A ako izbrišete sve alternativne preglednike i ostavite samo svoj program, tada neće biti izbora. Vaš preglednik će postati glavni. A ako neka aplikacija želi pokrenuti web stranicu na navedeni način, otvorit će se vaš program.

Mala napomena. Ako zadnji red zamijenite ovim:

StartActivity(Intent.createChooser(intent, "Mijau..."));

Tada će se u prozoru za odabir programa umjesto gornjeg retka "Otvori s" ili njegovog lokalnog prijevoda pojaviti vaš redak. Ali to nije glavna stvar. Ako iz nekog razloga na uređaju nema niti jednog preglednika, tada ova verzija koda neće uzrokovati rušenje aplikacije, za razliku od izvorne verzije. Stoga upotrijebite predloženu opciju radi pouzdanosti.

Napravimo vlastitim rukama novu aplikaciju - preglednik za Android uređaje, bit će zanimljivo i neće biti puno koda.

Aplikacija preglednika za android

Pokrenimo android studio i izradimo novi projekt, naziv aplikacije My Site, domena tvrtke po vlastitom nahođenju, unio sam web mjesto domene web stranice. kliknemo Dalje, na sljedećoj kartici ostavimo sve nepromijenjeno, kliknemo dalje, tada je već odabrana sljedeća Prazna aktivnost, ostavit ćemo ga, zatim ćemo u posljednjoj kartici promijeniti naziv izgleda iz activity_main u main i kliknuti završi.

Android Studioće pripremiti datoteke projekta, to će potrajati neko vrijeme. U glavnom prozoru otvorit će se dvije datoteke, glavni.xml I MainActivity.java, počnimo raditi u potonjem. Promijenimo proširenu AppCompactActivity u Activity i spremimo.

Dodavanje dopuštenja u manifest

Zatim otvorite datoteku AndroidManifest.xml i dodajte prilagođenu dozvolu nakon prvog odjeljka korisničko dopuštenje,

tako da naša aplikacija ima pristup Internetu. Spremimo i zatvorimo AndroidManifest.xml.

Idemo na datoteku Main.xml, nalazi se na stazi res/layout/main.xml, izbrišite liniju android:text="Hello Word!" potpuno, promijenite TextView u WebView, uklonite nepotrebne ispune (paddingBottom, paddingLeft, paddingRight, paddingTop) iz svojstava glavnog sloja RelativeLayout.

Za WebView dodajte svojstvo android:id="@+id/webView", promijenite android:layout_width="wrap_content" i android:layout_height="wrap_content" u android:layout_width="match_parent" i android:layout_height="match_parent" , tako da naš element WebView ispunjava cijeli zaslon.

Logika koda u Javi

Završili smo s datotekom main.xml, idemo dalje MainActivity.java. Dodajmo varijablu wv tip WebView, dodijelit ćemo mu element, pronaći ga pomoću funkcije findViewById(), opisati wv postavke, posebno, dopustiti WebViewu da izvršava java skripte, navesti adresu za učitavanje stranice u naš preglednik, na primjer, Pokrenut ću Yandex pomoću funkcije loadUrl("http:// ya.ru").

javna klasa MainActivity proširuje aktivnost ( 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..setWebViewClient(new WebViewClient());

U nastavku ćemo napisati i obradu pritiska na tipku za povratak na uređaju.

@Override public void onBackPressed())( if(wv.canGoBack())( wv.goBack(); )else( super.onBackPressed(); ) )

Pokretanje aplikacije u emulatoru

Pritisnite gumb Start, to je zeleni trokut na alatnoj traci AndroidStudio, naš emulator će se pokrenuti, i ako je sve učinjeno ispravno, nakon nekog vremena će se pokrenuti Yandex pretraga u pregledniku, možete kliknuti na virtualnu tipkovnicu i tražiti nešto, sve radi dobro.

Zatvorimo program bez zatvaranja samog emulatora klikom na crveni pravokutnik, ovo je Stop umjesto Start, promijenite adresu u proizvoljnu, ja ću "promovirati" svoju stranicu "https://site",

Kliknut ću spremiti i ponovo pokrenuti program, ovaj put će se sve dogoditi brže, lutat ću po stranici, u odjeljku Programiranje za Android nalaze se članci i videi o tome kako instalirati i konfigurirati AndroidStudio, napraviti Android emulator i jednostavni primjeri programa.

Cijeli tekst AndroidManifest.xml

Cijeli tekst main.xml

Cijeli tekst MainActivity.java

paket ru.maxfad.mysite; import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; javna klasa MainActivity proširuje aktivnost ( WebView wv; @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.main); wv = (WebView)findViewById(R.id.webView); WebSettings postavke = wv.getSettings(); settings.setJavaScriptEnabled(true); wv..setWebViewClient()); ; )else( super.onBackPressed(); ) ) )

Ovaj videozapis detaljno prikazuje kako izraditi aplikaciju preglednika za Android uređaje:

Već smo se počeli u potpunosti snabdjevati osobnim softverom; sjetite se našeg prekrasnog kalkulatora i pretvarača. U ovoj lekciji naučit ćemo kako napraviti jednostavan preglednik pomoću kojeg možete surfati internetom. Slažem se, surfanje internetom u vlastitom pregledniku mnogo je puta ugodnije nego u Operi ili Chromeu (jedva zgodnije, ali ugodnije :)). Kreiramo novi projekt, tradicionalno imena birajte sami. Osobno, ne stvaram svaki put sve ispočetka, već jednostavno otvorim ono što imam i očistim sav kod do početno stanje Prazna aktivnost. Učinite ono što vam je najprikladnije.

Dakle, ukratko ocrtajmo opseg i specifičnosti daljnjeg rada. Moramo stvoriti element , u kojem će se sve dogoditi, napisati kod koji kreira naš osobni web preglednik, urediti ga osnovne funkcije, registrirajte dopuštenje za našu aplikaciju za korištenje interneta u datoteci manifesta i napišite rukovatelj klikom na hardverski gumb "Leđa" na uređaju (odnosno što će se dogoditi u našem pregledniku kada kliknemo na ovaj gumb).

Započnimo. Otvorite datoteku aktivnost_glavna.xml. Tamo stvaramo jedan jedini element , što nam je sasvim dovoljno za implementaciju web preglednika:

< WebView xmlns: android= "http://schemas.android.com/apk/res/android" android: layout_height= "match_parent" android: layout_width= "match_parent" android: id= "@+id/web" />

Prozor izgleda izgledat će ovako:

Nakon toga, odmah se pozabavimo datotekom AndroidManifest.xml. Otvorite ga i dodajte dva retka, jedan je dopuštenje aplikaciji za korištenje interneta, drugi je promjena stila aplikacije, odnosno sakrivanje panela “Naslov” aplikacije (ploča s naslovom aplikacije) kako bi kako biste prozoru preglednika dali više prostora za prikazivanje stranica.

Pišemo red za dopuštenje za korištenje interneta prije početna oznaka ...:

< uses- permission android: name= "android.permission.INTERNET" / >

Sada dodajmo našu liniju postavki Aktivnost naredba za skrivanje zaglavlja (donja linija podebljana, ovo je također u AndroidManifest.xml):

< activity android: name= ".MainActivity" android: label= android: tema= "@android:style/Theme.NoTitleBar" >

Sada prijeđimo na najvažniji i najodgovorniji dio posla - pisanje java koda. Otvorite datoteku MainActivity.java i napišite sljedeće (objašnjenja su data u kodu iza znakova //, za one koji nisu primijetili):

paket home.myapplication ; import android.app.Activity ; import android.app.AlertDialog ; uvoz android.content.ContentValues ​​​​; import android.content.Intent ; import android.database.Cursor ; uvoz android.database.sqlite.SQLiteDatabase; uvoz android.database.sqlite.SQLiteOpenHelper; uvoz 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 ; javna klasa MainActivity proširuje aktivnost ( // Deklarirajte varijablu tipa WebView privatni WebView mWeb; // Kreiramo klasu tipa Web preglednik (WebViewClient), koju konfiguriramo // prema zadanim postavkama dopuštenje za obradu svih veza unutar ove klase, // bez pristupa programi trećih strana: privatna klasa WebViewer extends WebViewClient ( (WebView pogled , String url ) ( pogled. loadUrl(url); return true ; ) ) public void onCreate (Bundle savedInstanceState ) ( super. onCreate(savedInstanceState); setContentView(R . layout. activity_main); // Povežite deklariranu varijablu tipa WebView s onom koju smo stvorili // na element WebView u datoteci activity_main.xml: mWeb= (WebView )findViewById(R . id. web); // Omogućujemo podršku za Java skripte za ovaj element: mWeb. getSettings(). setJavaScriptEnabled(true); // Postavite stranicu koja će se učitavati pri pokretanju, možete unijeti bilo koji: mWeb. loadUrl( "http://developeroleg.ucoz.ru/"); // Postavite preglednik za naš element WebView, povežite onaj koji smo izradili iznad // Web klijent s kojim će se stranice pregledavati: mWeb. setWebViewClient(novi WebViewer()); ) // Pišemo kod za obradu klika gumba za povratak na uređaju, koji će nam omogućiti da pritisnemo // koristite gumb "Natrag" za povratak na prethodnu stranicu, umjesto da samo zatvarate aplikacije. // Zatvorit će se tipkom "Natrag" samo ako smo na početnoj stranici // gore navedena stranica:@Override public void onBackPressed() ( if (mWeb. canGoBack()) ( mWeb. goBack();) else ( super. onBackPressed(); ) ) )

To je sve! Zapravo, sve je vrlo jednostavno i nakon malo rada imamo svoj vlastiti preglednik, naravno da je prilično jednostavan i nema nikakvih opcija, ali ovo je sasvim dovoljno da shvatimo bit stvaranja takvih aplikacija.

Standardni preglednici na Android uređajima često ne zadovoljavaju svakodnevne potrebe zahtjevnih korisnika. U ovom operacijski sustav Postoji mnogo kvalitetnih i funkcionalnih internetskih preglednika. Prikupili smo najbolji preglednici za Android u ovom članku.

Firefox s pravom nosi titulu jednog od najboljih mobilnih preglednika na Androidu. Tijekom godina prisutnosti na ovom operativnom sustavu, Mozillin razvoj stekao je puno funkcija i dobio poboljšano moderno sučelje. Firefox za Android je ravnoteža funkcionalnosti, praktičnosti i brzine korištenja. Mobilni preglednik iz Mozille je inferioran u brzini od istog Google Chrome, ali mnoge značajke Firefoxa su mnogo ugodnije i praktičnije.

Firefoxov vlastiti Gecko engine podržava gotovo sve moderne web standarde, a za njega postoje i proširenja s dodatnim funkcijama, baš kao iu desktop verziji preglednika. Među glavnim funkcijama Fiefoxa: sinkronizacija svih podataka između preglednika pomoću posebnog računa, sigurno surfanje, praktična početna ploča, puno proširenja, način čitanja.



Najpopularniji preglednik ne samo na računalima, već i na Mobilni uredaji ah je Google Chrome. Nije iznenađujuće, budući da je gotovo uvijek unaprijed instaliran na najpopularniji mobilni OS. Chrome je zasluženo stekao svoju popularnost - brz je, relativno funkcionalan, jednostavan i praktičan, a također je dobro integriran s Google usluge i desktop verzija preglednika (postoji potpuna sinkronizacija podataka i kartica). Integracija s Googleovim uslugama ponekad može biti korisna, na primjer - prevođenje teksta na stranicama s koristeći Google Prevoditelj ili glasovno pretraživanje.

Chrome također brine o sigurnosti korisnika - preglednik ima ugrađen filter za stranice koje mogu biti opasne za Android uređaje. Postoji neka vrsta tehnologije kompresije podataka. Nije tako savršen kao Opera, ali svejedno štedi puno podataka koji se prenose preko Wi-Fi-ja i mobilnog interneta. Postoji anonimni način rada za anonimno posjećivanje stranica. Možda jedini nedostatak Chromea na ovaj trenutak- nedostatak podrške za proširenje. Za one koji prvo žele isprobati sve nove značajke, tu su Chrome Beta i Dev. Ove verzije preglednika ažuriraju se brže i češće - u njima se testiraju sve inovacije.



Mobilni preglednici norveške tvrtke Opera također su jedni od najpopularnijih, funkcionalnih i najbrže rastućih na tržištu. Android platforma. Tijekom dugogodišnjeg rada ovi su momci definitivno uspjeli doći do formule za gotovo savršen internetski preglednik za pametne telefone i tablete. Opera ima gotovo sve što vam treba prosječnom korisniku: brzo surfanje, praktična klasična ekspresna ploča, sinkronizacija podataka s desktop verzijom, anonimni način rada, prikladna pretraga sa savjetima s adresne ploče, a jedna od glavnih značajki je kompresija prometa.

Dečki iz Opere dali su sve od sebe oko tehnologija za uštedu prometa. Mobile Opera s aktiviranim Turbo modom može smanjiti troškove mobilnog interneta dva ili čak tri puta. Za one kojima je potrošnja prometa posebno važna, tu je Opera Mini - u njoj je spremanje uključeno prema zadanim postavkama, ali ponekad pati od toga izgled stranice. Također, mini verzija je puno lakša i brža od obične Opere. Još jedna jača strana istoimenog preglednika je njegov lijep i ugodan izgled. Opera je oduvijek bila poznata po jednom od najelegantnijih sučelja u preglednicima. Ako želite komprimirati sav promet na svom uređaju, obratite pozornost na aplikaciju.



Dolphin je alternativni preglednik za Android s puno dodatnih značajki i funkcionalnosti odmah po otvaranju. Među njima vrijedi istaknuti podršku za Adobe Flash, koji su gotovo svi napustili, ali se još uvijek koristi na mnogim mjestima, korištenje raznih tema za promjenu sučelja, podršku za jedinstvene dodatke i upravljanje praktičnim i jednostavnim gestama . Sve je to dostupno odmah - nema dodatne postavke. Dolphin je također brz, siguran, besplatan i uvijek ažuran - programeri objavljuju ažuriranja preglednika gotovo svaki tjedan.


Puffin je mobilni web preglednik koji je po konceptu sličan Dolphinu. Ovdje također postoji lijepo i praktično sučelje, ima mnogo mogućnosti, a Puffin je brz kao "delfin". U osnovi, preglednik Puffin prikladan je za slabe uređaje, budući da pruža posebnu tehnologiju za "lagano" surfanje webom - stranice se prvo učitavaju na usluga u oblaku Puffin, tamo su optimizirani i pojavljuju se u svijetlom obliku na zaslonu uređaja. U isto vrijeme, kvaliteta i izgled stranica praktički ne pate od slomljenog izgleda ili smanjene kvalitete.

Također vrijedno pažnje u Puffinu su brojne dodatne značajke:

  • puna Adobe Flash podrška za igre (virtualni joystick na ekranu);
  • enkripcija prometa putem usluge u oblaku;
  • emulacija miša;
  • mogućnost učitavanja datoteka prvo u oblak, a zatim na uređaj;
  • instaliranje ekstenzija;
  • teme sučelja.
Preglednik Puffin izvrstan je izbor za slabe uređaje, no funkcionalnost u ovom internetskom pregledniku nije ograničena.



Ruska tvrtka Yandex uspjela je kreirati vlastiti preglednik za Android mobilne uređaje. Yandex.Browser za ovu platformu izvrsno je rješenje za korisnike iz CIS-a. Ovaj internetski preglednik apsolutno je prožet integracijom s uslugama samog Yandexa i drugih lokalnih društvene mreže/ portali. Na primjer, traka za pretraživanje u pregledniku predlaže potrebna mjesta i savršeno razumije upite, a unutar aplikacije također možete vidjeti informacije o vremenu i prometnim gužvama.



reci prijateljima