【问题标题】:Xamarin Android Web-view File ChooserXamarin Android Web 视图文件选择器
【发布时间】:2018-10-08 09:10:25
【问题描述】:

我编写了一个混合应用程序,我想使用文件上传 HTML(文件和相机)页面。我使用下面的代码,效果很好。

当用户点击 FileUploader 输入时,本机窗口打开(在文件或相机之间进行选择)并且一切正常。

我唯一的问题是,当用户点击窗外时,这个会被关闭,并且在不再打开之后,可能需要重新初始化或重新启动。

如果有人有一些想法......

在 MainActivity 上:

var chrome = new SmarterWebChromeClient((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
                            {
                                photoFile = createImageFile();
                                takePictureIntent.PutExtra("PhotoPath", mCameraPhotoPath);
                            }
                            catch (IOException ex)
                            {
                                // Error occurred while creating the File
                                writeEx(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, "Choisir une photo");
                            chooserIntent.PutExtra(Intent.ExtraInitialIntents, intentArray);

                            StartActivityForResult(chooserIntent, MainActivity.FILECHOOSER_RESULTCODE);

                        });


                        mWebView.SetWebViewClient(new MyWebViewClient());

                        mWebView.SetWebChromeClient(chrome);

...

  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
                            {

                            }
                        }
                        else
                        {
                            if (intent.DataString != null)
                            {
                                results = new Android.Net.Uri[] { Android.Net.Uri.Parse(intent.DataString) };
                            }
                        }

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

还有我的 WebChromeClient 类:

 partial class SmarterWebChromeClient : WebChromeClient
        {
            Action<IValueCallback> callback;

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

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

【问题讨论】:

  • 您可以通过在代码开头提及问题来改进您的问题。
  • 你说得对,我做到了
  • 嘿@r2b2s 你找到解决方案了吗?我有同样的问题。谢谢。
  • 嘿@r2b2s 你找到解决方案了吗,我也面临同样的问题

标签: android xamarin webview filechooser


【解决方案1】:

我用下面的代码解决了你的问题 为结果不正常放置一个 else 部分

// Check that the response is a good one
if (resultCode == Result.Ok)
{
   //...
}
else
{
   mUploadMessage.OnReceiveValue(null);
   mUploadMessage = null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多