I am using the following code to let users upload images to a website. This works sort off (Android constantly nags that only the selected files are shared, duh). Now I want to enable the user to use the camera, take a pic, and upload it. Can I adopt my code to enable this? Or what is the right way to do this?
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.webkit.ValueCallback
import android.webkit.WebChromeClient
import android.webkit.WebView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.ActionBar
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
private var fileChooserResultLauncher = createFileChooserResultLauncher()
private var fileChooserValueCallback: ValueCallback<Array<Uri>>? = null
private fun createFileChooserResultLauncher(): ActivityResultLauncher<Intent> {
return registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
fileChooserValueCallback?.onReceiveValue(arrayOf(Uri.parse(it?.data?.dataString)));
} else {
fileChooserValueCallback?.onReceiveValue(null)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val actionBar: ActionBar? = supportActionBar
actionBar?.hide()
setContentView(R.layout.activity_main)
// Initialize WebView
webView = findViewById(R.id.MyWebview)
// Set up WebView settings
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.useWideViewPort = true
webView.settings.allowFileAccess = true
webView.settings.allowContentAccess = true
// Load your web page
webView.loadUrl("https://xxxxx?time=" + System.currentTimeMillis())
webView.webChromeClient = object : WebChromeClient() {
override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?, fileChooserParams: FileChooserParams?): Boolean {
try {
fileChooserValueCallback = filePathCallback;
fileChooserResultLauncher.launch(fileChooserParams?.createIntent())
} catch (e: ActivityNotFoundException) {
// You may handle "No activity found to handle intent" error
}
return true
}
}
}
}
I tried enabling the permissions and using various solutions mentioned on this site, but to no avail.