Hello,
Welcome to our Microsoft Q&A platform!
To choose a file in WebView, try to override the OnShowFileChooser method in the custom WebChromeClient class. Check the following code:
public class CustomWebChromeClient : WebChromeClient
{
Activity mActivity = null;
public CustomWebChromeClient(Activity activity)
{
mActivity = activity;
}
public override bool OnShowFileChooser(Android.Webkit.WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
{
MainActivity.mUploadCallbackAboveL = filePathCallback;
//TakePhoto();
File imageStorageDir = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures), "MyAppFolder");
if (!imageStorageDir.Exists())
{
imageStorageDir.Mkdirs();
}
// Create camera captured image file path and name, add ticks to make it unique
var file = new File(imageStorageDir + File.Separator + "IMG_" + DateTime.Now.Ticks + ".jpg");
MainActivity.imageUri = Android.Net.Uri.FromFile(file);
//Create camera capture image intent and add it to the chooser
var captureIntent = new Intent(MediaStore.ActionImageCapture);
captureIntent.PutExtra(MediaStore.ExtraOutput, MainActivity.imageUri);
var i = new Intent(Intent.ActionGetContent);
i.AddCategory(Intent.CategoryOpenable);
i.SetType("image/*");
var chooserIntent = Intent.CreateChooser(i, "Choose image");
chooserIntent.PutExtra(Intent.ExtraInitialIntents, new Intent[] { captureIntent });
MainActivity.Instance.StartActivityForResult(chooserIntent, MainActivity.PHOTO_REQUEST);
return true;
}
}
MainActivity class
public class MainActivity : AppCompatActivity
{
public static IValueCallback mUploadCallbackAboveL;
public static Android.Net.Uri imageUri;
public static MainActivity Instance;
public static int PHOTO_REQUEST = 10023;
public static IValueCallback mUploadMessage;
public static int FILECHOOSER_RESULTCODE = 1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
Instance = this;
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent)
{
if (requestCode == FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Android.Net.Uri result = intent == null || resultCode != Result.Ok ? null : intent.Data;
mUploadMessage.OnReceiveValue(result);
mUploadMessage = null;
}
else if (requestCode == PHOTO_REQUEST)
{
Android.Net.Uri result = intent == null || resultCode != Result.Ok ? null : intent.Data;
if (mUploadCallbackAboveL != null)
{
onActivityResultAboveL(requestCode, resultCode, intent);
}
else if (mUploadMessage != null)
{
mUploadMessage.OnReceiveValue(result);
mUploadMessage = null;
}
}
}
private void onActivityResultAboveL(int requestCode, Result resultCode, Intent data)
{
if (requestCode != PHOTO_REQUEST || mUploadCallbackAboveL == null)
{
return;
}
Android.Net.Uri[] results = null;
if (resultCode == Result.Ok)
{
results = new Android.Net.Uri[] { imageUri };
results[0] = MainActivity.imageUri;
}
mUploadCallbackAboveL.OnReceiveValue(results);
mUploadCallbackAboveL = null;
}
}
Similar issue you could refer to: https://stackoverflow.com/questions/62656020/xamarin-android-webview-dont-open-camera
Best Regards,
Jarvan Zhang
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.