Я не могу найти правильный способ обработки файла типа ввода, который присутствует на странице, отображаемой в HybridWebView;Мне нужно справиться с этим в Android и iOS;Я много чего перепробовал, но не могу найти правильный путь.
Контекст
При запуске приложения отображается полная страница HybridWebView, когда я нажимаю на файл типа ввода, ничегослучается.
В качестве второго шага, очевидно, если присутствуют multiple
или accept
атрибуты HTML5, я должен обрабатывать их правильно, например. Я должен прочитать их из элемента управления или чего-то подобного.
Код
Текущий код следующий в HybridWebViewRenderer
в OnElementChanged
событии:
var chromeClient = new CusWebChromeClient((uploadMsg, acceptType, capture) => {
MainActivity.UploadMessage = uploadMsg;
var i = new Intent(Intent.ActionGetContent);
i.AddCategory(Intent.CategoryOpenable);
i.SetType("*/*");
var chooserIntent = Intent.CreateChooser(i, "Choose file");
//chooserIntent.PutExtra(Intent.ExtraInitialIntents, new Intent[] { captureIntent });
((Activity)_context).StartActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
});
webView.SetWebChromeClient(chromeClient);
А вот и Android MainActivity.cs:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static IValueCallback UploadMessage;
private static int FILECHOOSER_RESULTCODE = 1;
public static Android.Net.Uri mCapturedImageURI;
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
WebView.SetWebContentsDebuggingEnabled(true);
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
protected override void OnActivityResult(int requestCode, Result resultCode, Android.Content.Intent data)
{
if (requestCode == FILECHOOSER_RESULTCODE)
{
if (null == UploadMessage)
return;
Java.Lang.Object result = data == null ? mCapturedImageURI : data.Data;
UploadMessage.OnReceiveValue(new Android.Net.Uri[] { (Android.Net.Uri)result });
UploadMessage = null;
}
else
base.OnActivityResult(requestCode, resultCode, data);
}
}
А вот и CusWebChromeClient
:
public class CusWebChromeClient : global::Android.Webkit.WebChromeClient
{
private Action<IValueCallback, Java.Lang.String, Java.Lang.String> callback;
public SistemiWebChromeClient(Action<IValueCallback, Java.Lang.String, Java.Lang.String> callback)
{
callback = callback;
}
// For Android < 5.0
[Java.Interop.Export]
public void openFileChooser(IValueCallback uploadMsg, Java.Lang.String acceptType, Java.Lang.String capture)
{
callback(uploadMsg, acceptType, capture);
}
// For Android > 5.0
public override Boolean OnShowFileChooser(Android.Webkit.WebView webView, IValueCallback uploadMsg, WebChromeClient.FileChooserParams fileChooserParams)
{
try
{
callback(uploadMsg, null, null);
}
catch (Exception)
{
}
return true;
}
}