Android 开发基于Webview 自制一个简单的手机浏览器

初衷:

虽然现在市场上浏览器很多,比如chrome,夸克,没有广告,新闻等乱七八糟的东西,页面简单清晰,但是自己的浏览记录还是存放在别人的服务器,就算删除了,开隐身模式了,但是具体后台的操作谁又知道呢,鉴于此自己做一个浏览器,实现最基本的搜索,地址加载,响应下载等,实现最基本的功能,没有广告,没有启动页,没有新闻资讯,没有推送,没有后台记录,没有进程保活等烦人的东西。

开始

1. 首先准备一个空白的Android项目(我此处语言采用Kotlin)。

O(∩_∩)O哈哈~  

2. 写布局

非常简单,哈哈

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:lines="1"
        android:singleLine="true"
        android:inputType="textUri"
        android:imeOptions="actionSend"
        android:textSize="12sp"
        tools:text="asdasdasdas"
        android:textColor="#333333"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:background="@drawable/url_bac"/>

    <ProgressBar
        android:id="@+id/progressBar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:progress="50"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBar" />

</androidx.constraintlayout.widget.ConstraintLayout>

3. 初始化Webview的一些设置


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initListener()
        loadDefaultUrl()
    }

    private fun initView() {
        webView = findViewById(R.id.webView)
        editText = findViewById(R.id.editText)
        progressBar = findViewById(R.id.progressBar)
        val settings = webView.settings
        settings.javaScriptEnabled = true
        settings.javaScriptCanOpenWindowsAutomatically = true//js和android交互
        settings.allowFileAccess = true // 允许访问文件
        settings.setAppCacheEnabled(true) //设置H5的缓存打开,默认关闭
        settings.useWideViewPort = true//设置webview自适应屏幕大小
        settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS//设置,可能的话使所有列的宽度不超过屏幕宽度
        settings.loadWithOverviewMode = true//设置webview自适应屏幕大小
        settings.domStorageEnabled = true//设置可以使用localStorage
        settings.setSupportZoom(false)//关闭zoom按钮
        settings.builtInZoomControls = false//关闭zoom
    }

    private fun loadDefaultUrl() {
        //访问网页
        webView.loadUrl("http://www.baidu.com")
    }

4. 监听返回键,当webview可以后退的时候,不结束应用


    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if(event?.keyCode == KeyEvent.KEYCODE_BACK){
            if(webView.canGoBack()) {
                webView.goBack()
                return true;
            }
        }
        return super.onKeyDown(keyCode, event)
    }

5. 监听输入框,加载输入的地址

editText.setOnEditorActionListener { p0, p1, p2 ->
            if(p2?.keyCode == KeyEvent.KEYCODE_ENTER){
                var url = editText.text.toString()
                if(!url.startsWith("http")&&!url.startsWith("https")){
                    url="http://$url"
                }
                webView.loadUrl(url)
                ImTool.closeKeyBoard(baseContext,editText)
            }
            false
        }

6.设置webviewclient,并且监听页面加载进度,当页面加载结束的时候,设置url到输入框

webView.webChromeClient = object : WebChromeClient() {

    override fun onProgressChanged(view: WebView, newProgress: Int) {
        super.onProgressChanged(view, newProgress)
        if(newProgress >= 99){
            progressBar.visibility = View.GONE
        }else if(progressBar.visibility == View.GONE){
            progressBar.visibility = View.VISIBLE
        }
        progressBar.progress = newProgress
    }
}
webView.webViewClient = object:WebViewClient(){
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        editText.setText(url)
    }
}

7.响应页面的下载

        webView.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
            val i = Intent(Intent.ACTION_VIEW)
            i.data = Uri.parse(url)
            startActivity(i)
        }

8. 运行一下试试:

至此,基本的功能就有了,再也不用担心浏览器泄漏你的浏览记录了,但是也还是防不了百度和其他网站有可能会泄漏你的浏览记录,毕竟这还得靠这些网站自觉了。

最后带上源码链接:

https://github.com/MaXiaopingIT/MinewebBrowser

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章