簡體   English   中英

Xamarin Android Web 視圖文件選擇器

[英]Xamarin Android Web-view File Chooser

我寫了一個混合應用程序,我想使用文件上傳 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;
            }
        }

我像下面的代碼一樣解決了你的問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM