1、拦截webView的长按事件
在页面中监听webView的长按事件,在监听中判断长按取到的类型是否是图片类型,加载图片有两种情况:
- 一种是加载了图片的URL链接;
- 另一种是加载了图片的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…