Webview notları

Android ile webview uygulaması yaparken karşılaştığım problemlerin çözümünü ekliyorum.

import

import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import android.app.ProgressDialog;
import java.io.IOException;

class içerisindeki değişkenlerimiz

public static WebView webView;
private WebSettings webSettings;
public ProgressDialog progressDialog;

activity_main.xml dosysın da eklediğim webview id değeri: android:id="@+id/webview"

normalde webview uygulamaları telefonu veya tableti dönderdiğiniz de yeniden yükleme yapar bu işlem single page app larda sorun oluşturabilir. ilk öncelik ile bu problemi aşmak için AndroidManifest.xml dosyasın da application tagı içerisin de webview eklediğiniz activity alanına yeni attribute (android:configChanges="orientation|screenSize") eklememiz problemimizi çözecektir. Benim webview eklediğim activity adı .MainActivity tam olarak mainfest dosyamın içerisindeki application alanı şu şekilde.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Uygulamamız javascript çalıştırması ve https ile çalışan bir alanda http bağlantılarını da kullanabilmesi gibi ayarları WebSettings objesinden yapabiliyoruz.

webView = (WebView) findViewById(R.id.webview);
webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setAllowContentAccess(true);

Webview çalışır hale getirmek için WebViewClient ve WebChromeClient set etmemiz gerekli, bu işlemlerden sonra mailto:, tel: ve dosya download işlemleri ve webview için yapılan isteklerdeki url adresleri ile nasıl işlem yapabiliriz bunun ile ilgili de yapabildiğim kadar kod ve açıklama eklemeye çalışacağım.

ilk önce basit bir şekilde client işlmeleri şu şekilde:

webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient());

normalde sadece bu şekilde eklediğiniz de sayfanız görüntülenecektir taki tel, mail ve download linklerinden birine denk gelene kadar. Bu problemleri aşmak için öncelik ile WebViewClient set işlemini özgünleştirelim ve ilgili methodları ekleyelim.

webView.setWebViewClient(new WebViewClient()); bu alanı alttaki şekildeki gibi değiştirelim.

webView.setWebViewClient(new WebViewClient(){
    //bu method ile request isteğini yakalyabiliyor ve uygulamamıza gelen istekler karşısın da nasıl davranacağını belirtebiliyoruz.
    public boolean shouldOverrideUrlLoading(WebView view, String url){  

        if (url.contains("mailto:")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        }
        else if (url.contains("tel:")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        }
        else if(url.contains("sonradan_belirle"))
        {
            //webview içerisinde bir sayfaya girilmeden önce haberdar olmak veya farklı bir işlem yapmak isterseniz
            //sonradan_belirle dediğim yere linkinizi veya bir kısmını ekleyerek bu if içerisine girmesini sağlayabilirsiniz
            // burada string url değerini başka bir methoda parametre verebilir, kullanıcıyı başka bir sayfaya yönlendirebilir veya
            //veri tabanı işlemleri yapabilirsiniz, hayal gücünüze kalmış bir durum. 
            //Attta sosyal ağlar için bir örnek elseif görebilirsiniz
            return true;
        }
        else if(url.contains("facebook") || url.contains("instagram"))
        {
            Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(i);
        }
        else {
            view.loadUrl(url);
            return true;
        }
    }

    //sayfa yüklenme sırasında load ekranı göster
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        if (progressDialog == null) {
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setMessage("Loading...");
            progressDialog.show();
        }
    }
    //sayfa yüklenme bittiğinde load ekranını kaldır
    public void onPageFinished(WebView view, String url) {
        try {
            // Close progressDialog
            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                progressDialog = null;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
});

bu kodları ekledikten sonra web webview için gidilecek adresi tanımlamak :

webView.loadUrl("https://mavitm.com"); //google.com

sayfadan download isteklerin de hiç bir tepkime olmuyor ise,download listener kodu ekleyip download işlemlerini tarayıcıya gönderebiliriz.

webView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        startActivity(i);

        try {
            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                progressDialog = null;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }

    }
});

Burda ara