Сохранить изображение с помощью длинного нажатия пользователем из Webview в Xamarin Android - PullRequest
1 голос
/ 09 января 2020

Я реализовал страницу веб-просмотра в Xamarin с пользовательским средством визуализации для увеличения / уменьшения страниц. Проблема в том, что WebView в android не позволяет сохранять изображения, которые были загружены в WebView, однако, с тем же кодом, который я могу загрузить в iOS.

. Есть ли способ? Я могу сохранить изображение, когда пользователь долго нажимает на изображение в WebView для android? Заранее спасибо.

Вот мой код, который я использую.

WebViewCustom

this._WebView = new WebViewCustom
        {
            BackgroundColor = AppConfig.MenuBackgroundColor,
            VerticalOptions = LayoutOptions.FillAndExpand,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            Source = new UrlWebViewSource
            {
                Url = url
            },
        };

WebViewCustomRenderer Class

[assembly: ExportRenderer(typeof(WebViewCustom), typeof(WebViewCustomRenderer))]
namespace PBL.App.Droid.Renderers
{
class WebViewCustomRenderer : WebViewRenderer
{
    public WebViewCustomRenderer(Context context) : base(context)
    {
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (Control != null)
        {
            Control.Settings.BuiltInZoomControls = true;
            Control.Settings.DisplayZoomControls = false;

            Control.Settings.SetSupportZoom(true);
            Control.Settings.AllowFileAccess = true;
            MessagingCenter.Subscribe<object, bool>(this, "zoom", (sender1, arg) => {
                Control.Settings.SetSupportZoom(arg);
            });
        }
        base.OnElementPropertyChanged(sender, e);
    }
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        if (Control != null)
        {
            Control.Settings.SetSupportZoom(true);
        }
        if(e.NewElement != null)
        {
            Control.Settings.AllowContentAccess = true;
            Control.Settings.AllowUniversalAccessFromFileURLs = true;
            Control.Settings.DomStorageEnabled = true;
            Control.Settings.JavaScriptEnabled = true;
            Control.Download += OnWebViewDownload;
        }
        base.OnElementChanged(e);
    }

    private void OnWebViewDownload(object sender, DownloadEventArgs e)
    {
        var source = Uri.Parse(e.Url);
        var request = new DownloadManager.Request(source);

        request.AllowScanningByMediaScanner();

        request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted);
        request.SetDestinationInExternalPublicDir(Environment.DirectoryDownloads, source.LastPathSegment);


    }
}
}

1 Ответ

1 голос
/ 10 января 2020

вы можете добавить LongClick слушателя в WebView, а затем оценить тип HitTestResult, который вы нажимаете в веб-просмотре:

[assembly: ExportRenderer(typeof(WebViewCustom), typeof(WebViewCustomRenderer))]
namespace PBL.App.Droid.Renderers
{
  class WebViewCustomRenderer : WebViewRenderer,Android.Views.View.IOnLongClickListener
   {
     Dialog dialog;
     Context _context;
     public WebViewCustomRenderer(Context context) : base(context)
      {
        _context = context;
      }

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
      {
        if (Control != null)
          {
            Control.Settings.BuiltInZoomControls = true;
            Control.Settings.DisplayZoomControls = false;

            Control.Settings.SetSupportZoom(true);
            Control.Settings.AllowFileAccess = true;
            MessagingCenter.Subscribe<object, bool>(this, "zoom", (sender1, arg) => {
            Control.Settings.SetSupportZoom(arg);
        });
    }
    base.OnElementPropertyChanged(sender, e);
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
    if (Control != null)
    {
        Control.Settings.SetSupportZoom(true);
    }
    if(e.NewElement != null)
    {
        Control.Settings.AllowContentAccess = true;
        Control.Settings.AllowUniversalAccessFromFileURLs = true;
        Control.Settings.DomStorageEnabled = true;
        Control.Settings.JavaScriptEnabled = true;
        //add long press listener
        Control.SetOnLongClickListener(this);
    }
    base.OnElementChanged(e);
}

  public bool OnLongClick(Android.Views.View v)
    {
        Android.Webkit.WebView.HitTestResult hitTestResult = ((Android.Webkit.WebView)v).GetHitTestResult();
        if (hitTestResult.Type == HitTestResult.ImageType ||
                hitTestResult.Type == HitTestResult.SrcImageAnchorType)
           {
            AlertDialog.Builder alert = new AlertDialog.Builder(_context);
            alert.SetTitle("Confirm download");
            alert.SetMessage("Do you want to save the picture");
            alert.SetPositiveButton("OK", (senderAlert, args) =>
            {
                //get the pic url
                string picUrl = hitTestResult.Extra;
                //download the pic
                Download(picUrl );

            });
            alert.SetNegativeButton("Cancel", (senderAlert, args) =>
            {
                dialog.Dismiss();
            });
            dialog = alert.Create();
            dialog.Show();
            return true;
        }
        return false;
    }

    private void Download(string picUrl)
      {
            DownloadManager.Request mRequest = new DownloadManager.Request(Android.Net.Uri.Parse(picUrl));
            mRequest.AllowScanningByMediaScanner();
            mRequest.SetNotificationVisibility(DownloadManager.Request.VisibilityVisibleNotifyCompleted);
            DownloadManager mDownloadManager = (DownloadManager)MainActivity.Instance.GetSystemService(Service.DownloadService);
            mDownloadManager.Enqueue(mRequest);
            Toast.MakeText(_context , "Image Downloaded Successfully...", ToastLength.Long).Show();

     }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...