Android webView长按保存图片

6,169 阅读1分钟

1、拦截webView的长按事件

在页面中监听webView的长按事件,在监听中判断长按取到的类型是否是图片类型,加载图片有两种情况:

  1. 一种是加载了图片的URL链接;
  2. 另一种是加载了图片的base64编码

代码如下所示:

mWebView?.setOnLongClickListener {
	val result = mWebView?.hitTestResult ?: return@setOnLongClickListener false
    if (result.type == android.webkit.WebView.HitTestResult.IMAGE_TYPE ||
            result.type == android.webkit.WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
            saveImage(result.extra)
            return@setOnLongClickListener true
     } else {
            return@setOnLongClickListener false
     }
}

2、判断图片的类型:URL or base64

// 保存图片方法
private fun saveImage(data: String) {
    doAsync {
        try {
            var imageBitmap: Bitmap? = null
            //根据系统API判断是否为图片链接
            if (URLUtil.isValidUrl(data)) {
                imageBitmap = Glide
                        .with(this)
                        .load(data)
                        .asBitmap()
                        .into("图片宽度", "图片高度")
                        .get()
            } else {
                var realStr = data
                if (realStr.contains(",")) {
                    realStr = realStr.split(",")[1]
                }
                val array = android.util.Base64.decode(realStr, android.util.Base64.NO_WRAP)
                imageBitmap = BitmapFactory.decodeByteArray(array, 0, array.size)
            }
            if (imageBitmap != null) {
                saveBitmapToGallery(imageBitmap)
            } else {
                // TODO 保存失败
            }
        } catch (e: Exception) {
            e.printStackTrace()
            // TODO 保存失败
        }
    }

}

3、图片保存到手机

private fun saveBitmapToGallery(bitmap: Bitmap) {
    val bitName = "${UUID.randomUUID()}.jpg"
    val saveFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), bitName)
    val fos = FileOutputStream(saveFile)
    try {
        if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) {
            fos.flush()
        }
        MediaScannerConnection.scanFile(this, arrayOf(saveFile.absolutePath), arrayOf("image/jpeg")) { _, _ ->
        }
        //保存成功 Toast提示
    } catch (e: Exception) {
        //TODO 保存失败
    } finally {
        fos.close()
    }
}

另外webView长按能取到的类型有很多,如下

//选中的文字类型
WebView.HitTestResult.EDIT_TEXT_TYPE
//处理拨号
WebView.HitTestResult.PHONE_TYPE
// 处理Email
WebView.HitTestResult.EMAIL_TYPE: 
//  地图类型
WebView.HitTestResult.GEO_TYPE: 
// 超链接
WebView.HitTestResult.SRC_ANCHOR_TYPE: 
// 带有链接的图片类型
WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 
// 处理长按图片的菜单项
WebView.HitTestResult.IMAGE_TYPE: 
// 未知类型
WebView.HitTestResult.UNKNOWN_TYPE

so end

转载请注明出处:juejin.cn/post/684490…