微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebView File Chooser取消选择后停止响应

如何解决WebView File Chooser取消选择后停止响应

我们为Web视图实现了文件选择器。选择附件后,它可以成功工作,但是如果不指定文件,则取消时将失败。文件选择器只是停止对点击做出反应

感谢您的帮助。谢谢

我们使用chrome客户端。如果在所有情况下都列出了文件选择,它会很好地工作。但即使从第一个文件选择取消起,文件选择器就不再起作用。这是完全基于Webview的Xamarin.Android应用

我们的代码是:

protected override void OnActivityResult(int requestCode,Result resultCode,Intent intent)
{
    if (requestCode == FILECHOOSER_RESULTCODE)
    {
        if (null == _mUploadMessage)
            return;

        // Check that the response is a good one
        if (resultCode == Result.Ok)
        {
            Android.Net.Uri[] results = null;
            if (intent == null)
            {
                // If there is not data,then we may have taken a photo
                if (mCameraPhotoPath != null)
                {
                    results = new Android.Net.Uri[] { Android.Net.Uri.Parse(mCameraPhotoPath) };
                }
            }
            else
            {
                if (intent.DataString != null)
                {
                    results = new Android.Net.Uri[] { Android.Net.Uri.Parse(intent.DataString) };
                }
            }

            _mUploadMessage.OnReceiveValue(results);
            _mUploadMessage = null;
        }
    }
}

Chrome客户端:

        var chrome = new FileChooserWebChromeClient((uploadMsg) =>
        {
            _mUploadMessage = uploadMsg;

            mCameraPhotoPath = null;

            Intent takePictureIntent = new Intent(Android.Provider.MediaStore.ActionImageCapture);

            //Create the File where the photo should go
            File photoFile = null;
            try
            {
                string folder = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
                photoFile = new File(folder,"image" + DateTime.Now.Millisecond + ".png");
                takePictureIntent.PutExtra("PhotoPath",mCameraPhotoPath);
            }
            catch (IOException ex)
            {
                // Error occurred while creating the File
                System.Console.WriteLine("" + ex.ToString());
            }

            // Continue only if the File was successfully created
            if (photoFile != null)
            {
                mCameraPhotoPath = "file:" + photoFile.AbsolutePath;
                takePictureIntent.PutExtra(Android.Provider.MediaStore.ExtraOutput,Android.Net.Uri.FromFile(photoFile));
            }
            else
            {
                takePictureIntent = null;
            }

            Intent contentSelectionIntent = new Intent(Intent.ActionGetContent);
            contentSelectionIntent.AddCategory(Intent.CategoryOpenable);
            contentSelectionIntent.SetType("image/*");

            Intent[] intentArray;
            if (takePictureIntent != null)
            {
                intentArray = new Intent[] { takePictureIntent };
            }
            else
            {
                intentArray = new Intent[0];
            }

            Intent chooserIntent = new Intent(Intent.ActionChooser);
            chooserIntent.PutExtra(Intent.ExtraIntent,contentSelectionIntent);
            chooserIntent.PutExtra(Intent.ExtraTitle,this.GetStringFromresource(Resource.String.chose_photo));
            chooserIntent.PutExtra(Intent.ExtraInitialIntents,intentArray);

            base.StartActivityForResult(chooserIntent,HarmonyAndroid.AndroidMainActivity.FILECHOOSER_RESULTCODE);
        });

        return chrome;

第2部分

class FileChooserWebChromeClient : WebChromeClient
{
    Action<IValueCallback> callback;

    public FileChooserWebChromeClient(Action<IValueCallback> callback)
    {
        this.callback = callback;
    }

    public override bool OnShowFileChooser(WebView webView,IValueCallback filePathCallback,FileChooserParams fileChooserParams)
    {
        callback(filePathCallback);
        return true;
    }

    public override void OnCloseWindow(WebView window)
    {
        base.OnCloseWindow(window);
    }
}

第3部分

   webView.ImprovePerformance();
   webView.SetWebViewClient(new HomeWebViewClient(customWebViewClientListener,clientId));
   webView.SetWebChromeClient(chrome);
   webView.Settings.JavaScriptEnabled = true;
   webView.Settings.DomStorageEnabled = true;
   webView.SetDownloadListener(new CustomDownloadListener(activity,customDownloadListener));
   webView.AddJavascriptInterface(new JavaScriptToCSharpCommunication(activity,javaScriptToCSharpCommunicationListener),Constants.JS_CSHARP_COMMUNICATOR_NAME);

解决方法

resultCode不是RESULT_OK时,尝试给uri回调提供一个空对象。

添加您的OnActivityResult方法:

if (resultCode != Result.Ok)
 {
    _mUploadMessage.OnReceiveValue(null);
    _mUploadMessage = null;
    return;
 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。