要在Android中使用WebView实现文件和相机上传的功能,可以按照以下步骤进行操作:
implementation 'androidx.webkit:webkit:1.4.0'
shouldOverrideUrlLoading
方法,使WebView在加载URL时能够处理文件和相机上传的请求。class MyWebViewClient : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
val url = request.url.toString()
if (url.startsWith("file:") || url.startsWith("content:")) {
// 处理文件上传
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*"
intent.addCategory(Intent.CATEGORY_OPENABLE)
val chooserIntent = Intent.createChooser(intent, "选择文件")
chooserIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
startActivityForResult(chooserIntent, FILE_UPLOAD_REQUEST_CODE)
return true
} else if (url.startsWith("camera:")) {
// 处理相机上传
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_UPLOAD_REQUEST_CODE)
return true
}
return super.shouldOverrideUrlLoading(view, request)
}
}
webView = findViewById(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.webViewClient = MyWebViewClient()
onActivityResult
方法中获取选中的文件或拍摄的照片,并将其返回给WebView。override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == FILE_UPLOAD_REQUEST_CODE) {
// 处理文件上传结果
if (resultCode == Activity.RESULT_OK && data != null) {
val fileUris = mutableListOf()
if (data.clipData != null) {
val clipData = data.clipData
for (i in 0 until clipData.itemCount) {
val item = clipData.getItemAt(i)
val uri = item.uri
fileUris.add(uri)
}
} else if (data.data != null) {
val uri = data.data
fileUris.add(uri)
}
// 将选中的文件Uri传递给WebView
webView.evaluateJavascript("javascript:handleFileUpload('${Gson().toJson(fileUris)}')", null)
}
} else if (requestCode == CAMERA_UPLOAD_REQUEST_CODE) {
// 处理相机上传结果
if (resultCode == Activity.RESULT_OK && data != null) {
val photo = data.extras?.get("data") as Bitmap
val uri = saveImage(photo)
// 将拍摄的照片Uri传递给WebView
webView.evaluateJavascript("javascript:handleCameraUpload('$uri')", null)
}
}
}
private fun saveImage(photo: Bitmap): Uri {
val savedImageURL = MediaStore.Images.Media.insertImage(
contentResolver,
photo,
"title",
"description"
)
return Uri.parse(savedImageURL)
}
上述代码中,FILE_UPLOAD_REQUEST_CODE
和CAMERA_UPLOAD_REQUEST_CODE
是用于标识文件和相机上传的请求代码,请根据需求进行设置。
最后,将WebView加载需要显示的页面:
webView.loadUrl("http://example.com")
在WebView中,当用户点击选择文件或拍照按钮时,会调用shouldOverrideUrlLoading
方法,处理文件选择或相机拍照的逻辑,并将选中的文件或拍摄的照片返回给WebView。在WebView中,可以通过JavaScript与原生代码进行通信,以实现文件和相机上传的功能。