WebView通用配置基类

/**
 * webView 基类,做好了大部分配置,子类根据需要重写方法
 */
abstract class BaseWebViewActivity : BaseActivity() {

    lateinit var mWebView: WebView
    var uploadMessage: ValueCallback<Uri>? = null
    var uploadMessageArray: ValueCallback<Array<Uri>>? = null

    val REQ_CAMERA = 0x1221
    val REQ_ALBUM = 0x1222
    val REQ_FILE = 0x1223
    val DCIMPATH = "${Environment.getExternalStorageDirectory()}/DCIM"
    var imageName: String = ""

    /**
     * 初始化WebView
     */
    open fun initWebView(mWebView: WebView) {
        this.mWebView = mWebView
        val webSettings = mWebView.settings

        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.javaScriptEnabled = true
        //支持插件
        webSettings.pluginState = WebSettings.PluginState.ON


        //设置自适应屏幕,两者合用  这样会使加载文本时 文字变小
        webSettings.useWideViewPort = true; //将图片调整到适合webview的大小
        webSettings.loadWithOverviewMode = true; // 缩放至屏幕的大小
        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)//提高渲染的优先级

        //缩放操作
        webSettings.setSupportZoom(true) //支持缩放,默认为true。是下面那个的前提。
        webSettings.builtInZoomControls = true //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.displayZoomControls = false //隐藏原生的缩放控件

        //开启DomStorage缓存
        webSettings.domStorageEnabled = true
        //启用数据库
        webSettings.databaseEnabled = true
//        //设置定位的数据库路径
//        String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
//        webSettings.setGeolocationDatabasePath(dir);

        //其他细节操作
        webSettings.cacheMode = WebSettings.LOAD_NO_CACHE //不使用缓存
        webSettings.allowFileAccess = true //设置可以访问文件
        webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口
        webSettings.loadsImagesAutomatically = true //支持自动加载图片
        webSettings.defaultTextEncodingName = "utf-8"//设置编码格式
        //支持内容重新布局
        webSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
        //这个是加载的地址是https的,一些资源文件使用的是http方法的,
        // 从安卓4.4之后对webview安全机制有了加强,webview里面加载https url的时候,
        // 如果里面需要加载http的资源或者重定向的时候,webview会block页面加载。需要设置MixedContentMode
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        }

        setWebViewClient(mWebView)
        setWebChromeClient(mWebView)
        setDownloadListener(mWebView)

    }

    /**
     * 下载监听
     */
    open fun setDownloadListener(mWebView: WebView) {
        mWebView.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
            try {
                val intent = Intent()
                intent.action = Intent.ACTION_VIEW
                intent.data = Uri.parse(url)
                startActivity(intent)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    /**
     * 子类需要时可重写
     */
    open fun setWebViewClient(mWebView: WebView) {
        mWebView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                view!!.loadUrl(url)
                return true
            }

            @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
            override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                view!!.loadUrl(request!!.url.toString())
                return true
            }
        }
    }


    /**
     * 子类需要时可重写
     */
    open fun setWebChromeClient(mWebView: WebView) {
        mWebView.webChromeClient = object : WebChromeClient() {
            /**
             * 16(Android 4.1.2) <= API <= 20(Android 4.4W.2)回调此方法
             */
            fun openFileChooser(valueCallback: ValueCallback<Uri>, acceptType: String, capture: String) {
                uploadMessage = valueCallback
                fileChooser(acceptType)
            }

            /**
             * API >= 21(Android 5.0.1)回调此方法
             */
            @RequiresApi(LOLLIPOP)
            override fun onShowFileChooser(
                webView: WebView?,
                filePathCallback: ValueCallback<Array<Uri>>?,
                fileChooserParams: FileChooserParams?
            ): Boolean {
                uploadMessageArray = filePathCallback!!
                fileChooser(fileChooserParams!!.acceptTypes[0])
                return true//这里要返回true 不然选择文件时会crash
                //  return super.onShowFileChooser(webView, filePathCallback, fileChooserParams)
            }
        }
    }

    /**
     * 根据类型选取文件
     */
    open fun fileChooser(acceptType: String) {
        LogUtil.debug("acceptType=" + acceptType)
        when (acceptType) {
            "image/*" -> {
                val selectPicTypeStr = arrayOf("拍摄", "从相册中选择")
                AlertDialog.Builder(this)
                    .setOnCancelListener { onReceiveValue(null) }
                    .setItems(selectPicTypeStr) { dialog, which ->
                        when (which) {
                            0 -> {
                                openCamera()
                            }
                            1 -> {
                                selectImage(REQ_ALBUM)
                            }
                        }
                    }.show()

            }
            "video/*" -> {
                selectVideo(REQ_ALBUM)
            }
            else -> {
                selectFile(REQ_FILE)
            }
        }
    }


    /**
     * 打开摄像头拍照
     */
    fun openCamera() {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        imageName = System.currentTimeMillis().toString() + ".png"
        val file = File(DCIMPATH)
        if (!file.exists()) {
            file.mkdirs()
        }
        intent.putExtra(
            MediaStore.EXTRA_OUTPUT, FileUtil.createFileUri(this, File(DCIMPATH, imageName))
        )
        startActivityForResult(intent, REQ_CAMERA)
    }

    /**
     * 选择图片
     */
    fun selectImage(requestCode: Int) {
        if (!FileUtil.hasSDcard(this)) {
            onReceiveValue(null)
            return
        }
        val intent = Intent()
        intent.type = "image/*"
        intent.action = Intent.ACTION_PICK
        intent.data = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;//使用以上这种模式,并添加以上两句
        startActivityForResult(intent, requestCode)
    }

    /**
     * 选择视频文件
     */
    fun selectVideo(requestCode: Int) {
        if (!FileUtil.hasSDcard(this)) {
            onReceiveValue(null)
            return
        }
        val intent = Intent()
        intent.action = Intent.ACTION_PICK
        intent.type = "video/*"
        startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), requestCode)
    }

    /**
     * 为空的时候就 就统一选择文件
     */
    fun selectFile(requestCode: Int) {
        if (!FileUtil.hasSDcard(this)) {
            onReceiveValue(null)
            return
        }
        val intent = Intent()
        intent.action = Intent.ACTION_PICK
        intent.type = "*/*"
        startActivityForResult(Intent.createChooser(intent, "选择要导入的文件"), requestCode)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode !== Activity.RESULT_OK) {
            onReceiveValue(null)
            return
        }
        when (requestCode) {
            REQ_CAMERA -> {
                val fileCamera = File(DCIMPATH, imageName)
                handleFile(fileCamera)
            }
            REQ_ALBUM -> {
                val uri = data!!.data
                if (uri != null) {
                    val absolutePath = FileUtil.getRealFilePath(this, uri)
                    if (absolutePath != null) {
                        val fileAlbum = File(absolutePath)
                        handleFile(fileAlbum)
                    }
                }
            }
            REQ_FILE -> {
                val uri = data!!.data
                if (uri != null) {
                    val absolutePath = FileUtil.getRealFilePath(this, uri)
                    if (absolutePath != null) {
                        val fileAlbum = File(absolutePath)
                        handleFile(fileAlbum)
                    }
                }
            }
        }
    }

    private fun handleFile(file: File) {
        if (file.isFile()) {
            onReceiveValue(file)
        } else {
            onReceiveValue(null)
        }
    }


    /**
     * 接受参数结束
     */
    fun onReceiveValue(file: File?) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (uploadMessageArray != null) {
                if (file == null) {
                    uploadMessageArray!!.onReceiveValue(null)
                } else {
                    val uri = Uri.fromFile(file)
                    val uriArray = arrayOf(uri)
                    uploadMessageArray!!.onReceiveValue(uriArray)
                    uploadMessageArray = null
                }
            }
        } else {
            if (uploadMessage != null) {
                if (file == null) {
                    uploadMessageArray!!.onReceiveValue(null)
                } else {
                    val uri = Uri.fromFile(file)
                    uploadMessage!!.onReceiveValue(uri)
                    uploadMessage = null
                }
            }
        }
    }


    //处理返回键
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (this.mWebView.canGoBack()) {
                this.mWebView.goBack()
                return true
            }
        }
        return super.onKeyDown(keyCode, event)
    }

    public override fun onResume() {
        super.onResume()
        mWebView.onResume()
    }

    public override fun onPause() {
        super.onPause()
        mWebView.onPause()
    }




}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uniapp中使用webview写入配置缓存的方法如下所示: 首先,你需要在uniapp的webview组件中设置一些函数。你可以使用以下代码来设置webview配置: ```javascript mWebView = (WebView) this.findViewById(R.id.webview); WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); mWebView.getSettings().setAppCacheMaxSize(1024*1024*8); String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); mWebView.getSettings().setAppCachePath(appCachePath); mWebView.getSettings().setAllowFileAccess(true); mWebView.getSettings().setAppCacheEnabled(true); ``` 这些设置将启用JavaScript,并开启本地缓存以供JS调用。 接下来,你可以在webview的onPageFinished方法中写入配置缓存。你可以使用以下代码来实现: ```java private boolean inWrited = false; webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if(!inWrited){ setData(webView); inWrited = true; } } }); private void setData(WebView mWebView) { //拼接 JavaScript 代码 String key= "userInfo"; User user = new User(); user.setName("Vicent"); user.setPhone(18888886666); String value = new Gson().toJson(user); String js = "window.localStorage.setItem('"+key+"','" + value + "');"; String jsUrl = "javascript:(function(){ var localStorage = window.localStorage; localStorage.setItem('"+key+"','" + value + "') })()"; //根据不同版本,使用不同的 API 执行 Js if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { mWebView.evaluateJavascript(js, null); } else { mWebView.loadUrl(jsUrl); mWebView.reload(); } } ``` 在setData方法中,我们使用JavaScript代码将配置数据写入localStorage。然后,根据不同的Android版本,使用不同的API来执行JavaScript代码。 这样,你就可以在uniapp中使用webview写入配置缓存了。希望对你有所帮助! #### 引用[.reference_title] - *1* *3* [WebView写入数据到 localStorage总结](https://blog.csdn.net/Vicent_9920/article/details/77281727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [uniapp通过webview调用H5页面](https://blog.csdn.net/qq_43344133/article/details/106871461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值